Flask学习入门笔记

news2025/1/18 18:22:24

Flask学习入门笔记

  • 前言
    • 1. 安装Flask
    • 2. 创建一个简单的Flask应用
    • 3. 路由与视图函数
      • 3.1 基本路由
      • 3.2 动态路由
      • 3.3 HTTP方法
    • 4. 请求与响应
      • 4.1 获取请求数据
      • 4.2 返回响应
    • 5. 模板渲染
      • 5.1 基本模板渲染
      • 5.2 模板继承
    • 6. 静态文件
      • 6.1 静态文件的目录结构
      • 6.2 在模板中引用静态文件
        • 6.2.1 引用CSS文件
        • 6.2.2 引用JavaScript文件
        • 6.2.3 引用图片文件
      • 6.3 修改静态文件的URL前缀
      • 6.4 静态文件的缓存问题
      • 6.5 静态文件的CDN加速
      • 6.6 静态文件的调试模式
    • 7. Flask扩展
      • 7.1 安装扩展
      • 7.2 使用扩展
    • 8. 部署Flask应用
      • 8.1 使用Gunicorn部署
      • 8.2 使用 Nginx 作为反向代理服务器
        • 8.2.1 安装 Nginx
        • 8.2.2 配置 Nginx 反向代理
      • 8.3 使用 Docker 容器化部署
        • 8.3.1 创建 Dockerfile
        • 8.3.2 构建 Docker 镜像
        • 8.3.3 运行 Docker 容器
        • 8.3.4 使用 Docker Compose
  • 总结
  • 参考文档

前言

Flask是一个轻量级的Python Web框架,适合快速开发小型Web应用和API。它灵活、易扩展,并且拥有丰富的插件生态系统。

1. 安装Flask

首先,我们需要安装Flask。可以通过pip来安装:

pip install Flask

2. 创建一个简单的Flask应用

创建一个最简单的Flask应用只需要几行代码:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

代码解析:

  • Flask(__name__):创建一个Flask应用实例。__name__参数用于确定应用的根目录。
  • @app.route('/'):定义路由。当用户访问根路径/时,会调用hello_world函数。
  • app.run(debug=True):启动Flask开发服务器。debug=True表示开启调试模式,代码修改后会自动重启服务器。

运行应用:

将上述代码保存为app.py,然后在终端运行:

python app.py

打开浏览器,访问http://127.0.0.1:5000/,页面显示如下:

在这里插入图片描述

3. 路由与视图函数

Flask通过路由将URL与视图函数绑定。视图函数负责处理请求并返回响应。

3.1 基本路由

@app.route('/about')
def about():
    return 'This is the about page.'

访问http://127.0.0.1:5000/about,页面显示如下:
在这里插入图片描述

3.2 动态路由

我们可以通过<variable>来定义动态路由。

@app.route('/user/<username>')
def show_user_profile(username):
    return f'User {username}'

访问http://127.0.0.1:5000/user/john,页面显示如下:

在这里插入图片描述

3.3 HTTP方法

默认情况下,路由只响应GET请求。我们可以通过methods参数指定其他HTTP方法:

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return 'Login POST request'
    else:
        return 'Login GET request'

4. 请求与响应

4.1 获取请求数据

Flask通过request对象来处理请求数据。我们可以获取URL参数、表单数据、JSON数据等。

from flask import request

@app.route('/search')
def search():
    query = request.args.get('q')  # 获取URL参数
    return f'Search query: {query}'

访问http://127.0.0.1:5000/search?q=flask,页面显示如下:

在这里插入图片描述

4.2 返回响应

视图函数可以返回字符串、HTML、JSON等。Flask会自动将其转换为HTTP响应。

from flask import jsonify

@app.route('/api/data')
def get_data():
    data = {'name': 'John', 'age': 30}
    return jsonify(data)  # 返回JSON响应

访问http://127.0.0.1:5000/api/data,页面显示如下:

在这里插入图片描述

5. 模板渲染

Flask使用Jinja2模板引擎来渲染HTML页面。模板文件通常放在templates目录下。

5.1 基本模板渲染

创建一个templates/index.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home</title>
</head>
<body>
    <h1>Hello, {{ name }}!</h1>
</body>
</html>

在视图函数中渲染模板:

from flask import render_template

@app.route('/hello/<name>')
def hello(name):
    return render_template('index.html', name=name)

访问http://127.0.0.1:5000/hello/john,页面显示如下:

在这里插入图片描述

5.2 模板继承

Jinja2支持模板继承,可以减少重复代码。创建一个基础模板templates/base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
    <header>
        <h1>My Site</h1>
    </header>
    <main>
        {% block content %}{% endblock %}
    </main>
</body>
</html>

然后在子模板中继承基础模板,创建一个 about.html

{% extends "base.html" %}

{% block title %}Home{% endblock %}

{% block content %}
    <h2>Welcome to the home page!</h2>
{% endblock %}

然后在app.py文件中添加一个新的路由:

@app.route('/about')
def about():
    return render_template('about.html')

访问 http://127.0.0.1:5000/about,页面显示如下:

在这里插入图片描述

6. 静态文件

在Web开发中,静态文件(如CSS、JavaScript、图片等)是网站的重要组成部分。Flask默认会将 static 目录作为静态文件的根目录,我们可以通过 url_for 函数在模板中引用这些文件。

6.1 静态文件的目录结构

Flask项目的典型目录结构如下:

my_flask_app/
│
├── app.py
├── templates/
│   ├── index.html
│   └── base.html
└── static/
    ├── css/
    │   └── style.css
    ├── js/
    │   └── script.js
    └── images/
        └── logo.png
  • static/ 目录是Flask默认的静态文件存放位置。
  • 可以在 static/ 目录下创建子目录(如 css/js/images/)来更好地组织文件。

6.2 在模板中引用静态文件

Flask提供了 url_for 函数来生成静态文件的URL。url_for 的第一个参数是 'static',表示引用静态文件;第二个参数 filename 是文件的路径(相对于 static/ 目录)。

6.2.1 引用CSS文件

在模板中引用CSS文件:

<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My Flask App</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
    <h1>Welcome to My Flask App!</h1>
</body>
</html>
6.2.2 引用JavaScript文件

在模板中引用JavaScript文件:

<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My Flask App</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
    <h1>Welcome to My Flask App!</h1>
    <script src="{{ url_for('static', filename='js/script.js') }}"></script>
</body>
</html>
6.2.3 引用图片文件

在模板中引用图片文件:

<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My Flask App</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
    <h1>Welcome to My Flask App!</h1>
    <img src="{{ url_for('static', filename='images/logo.png') }}" alt="Logo">
    <script src="{{ url_for('static', filename='js/script.js') }}"></script>
</body>
</html>

6.3 修改静态文件的URL前缀

默认情况下,Flask会将静态文件的URL前缀设置为 /static/。如果你需要修改这个前缀,可以在创建Flask应用时通过 static_url_path 参数进行配置:

from flask import Flask

app = Flask(__name__, static_url_path='/assets')

@app.route('/')
def home():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

此时,静态文件的URL前缀会变为 /assets/。例如,style.css 的URL会变成 /assets/css/style.css

6.4 静态文件的缓存问题

在生产环境中,浏览器会缓存静态文件以提高性能。如果你更新了静态文件(如CSS或JavaScript),可能需要强制浏览器刷新缓存。可以通过以下方式解决:

  1. 在文件名中添加版本号
    例如,将 style.css 改为 style.v1.css,并在模板中更新引用:

    <link rel="stylesheet" href="{{ url_for('static', filename='css/style.v1.css') }}">
    
  2. 使用查询参数
    在URL中添加一个查询参数(如时间戳或版本号):

    <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}?v=1.0">
    

6.5 静态文件的CDN加速

在生产环境中,可以将静态文件托管到CDN(内容分发网络)以提高加载速度。只需将 url_for 生成的URL替换为CDN的URL即可:

<link rel="stylesheet" href="https://cdn.example.com/css/style.css">

6.6 静态文件的调试模式

在开发环境中,Flask会自动处理静态文件。但在生产环境中,建议使用Web服务器(如Nginx或Apache)来直接提供静态文件,以提高性能。


7. Flask扩展

Flask拥有丰富的扩展生态系统,可以帮助你快速实现各种功能。以下是一些常用的扩展:

  • Flask-SQLAlchemy:数据库ORM
  • Flask-WTF:表单处理
  • Flask-Login:用户认证
  • Flask-RESTful:构建RESTful API

7.1 安装扩展

可以通过pip安装扩展:

pip install Flask-SQLAlchemy

7.2 使用扩展

以Flask-SQLAlchemy为例:

from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)

@app.route('/users')
def list_users():
    users = User.query.all()
    return render_template('users.html', users=users)

8. 部署Flask应用

Flask自带的开发服务器不适合生产环境。我们可以使用以下工具来部署Flask应用:

  • Gunicorn:一个Python WSGI HTTP服务器
  • Nginx:反向代理服务器
  • Docker:容器化部署

8.1 使用Gunicorn部署

安装Gunicorn:

pip install gunicorn

然后使用Gunicorn运行Flask应用:

gunicorn -w 4 app:app

-w 4表示启动4个工作进程,app:app表示Flask应用实例。

好的!以下是关于 NginxDocker 部署 Flask 应用的补充说明,帮助你更全面地了解如何将 Flask 应用部署到生产环境。


8.2 使用 Nginx 作为反向代理服务器

Nginx 是一个高性能的 HTTP 服务器和反向代理服务器。在生产环境中,通常会将 Nginx 放在 Gunicorn 前面,用于处理静态文件、负载均衡、SSL 终止等任务。

8.2.1 安装 Nginx

在 Linux 系统上,可以使用包管理器安装 Nginx:

# Ubuntu/Debian
sudo apt update
sudo apt install nginx

# CentOS/RHEL
sudo yum install nginx

安装完成后,启动 Nginx 服务:

sudo systemctl start nginx
8.2.2 配置 Nginx 反向代理
  1. 创建 Nginx 配置文件
    /etc/nginx/sites-available/ 目录下创建一个新的配置文件(如 my_flask_app):

    sudo nano /etc/nginx/sites-available/my_flask_app
    

    添加以下内容:

    server {
        listen 80;
        server_name your_domain_or_ip;
    
        location / {
            proxy_pass http://127.0.0.1:8000;  # 将请求转发给 Gunicorn
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    
        location /static {
            alias /path/to/your/flask/app/static;  # 直接提供静态文件
        }
    }
    
    • server_name:填写你的域名或 IP 地址。
    • proxy_pass:将请求转发给 Gunicorn(假设 Gunicorn 运行在 127.0.0.1:8000)。
    • location /static:Nginx 直接提供静态文件,减轻 Gunicorn 的负担。
  2. 启用配置文件
    将配置文件链接到 sites-enabled 目录:

    sudo ln -s /etc/nginx/sites-available/my_flask_app /etc/nginx/sites-enabled/
    
  3. 测试并重启 Nginx
    测试 Nginx 配置是否正确:

    sudo nginx -t
    

    如果没有错误,重启 Nginx:

    sudo systemctl restart nginx
    
  4. 运行 Gunicorn
    使用 Gunicorn 启动 Flask 应用:

    gunicorn -w 4 app:app
    

    现在,访问 http://your_domain_or_ip,Nginx 会将请求转发给 Gunicorn。


8.3 使用 Docker 容器化部署

Docker 是一种容器化技术,可以将应用及其依赖打包到一个容器中,方便部署和扩展。

8.3.1 创建 Dockerfile

在 Flask 项目的根目录下创建一个 Dockerfile

# 使用官方 Python 镜像作为基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制项目文件到容器中
COPY . .

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 暴露端口
EXPOSE 5000

# 设置环境变量
ENV FLASK_APP=app.py
ENV FLASK_ENV=production

# 启动应用
CMD ["gunicorn", "-w", "4", "app:app"]
8.3.2 构建 Docker 镜像

在项目根目录下运行以下命令,构建 Docker 镜像:

docker build -t my_flask_app .
8.3.3 运行 Docker 容器

使用以下命令运行容器:

docker run -d -p 5000:5000 --name my_flask_app my_flask_app
  • -d:以守护进程模式运行容器。
  • -p 5000:5000:将容器的 5000 端口映射到主机的 5000 端口。
  • --name my_flask_app:为容器指定名称。
8.3.4 使用 Docker Compose

如果需要同时运行多个服务(如 Flask 应用和 Nginx),可以使用 Docker Compose。

  1. 创建 docker-compose.yml 文件

    version: '3'
    services:
      web:
        build: .
        ports:
          - "5000:5000"
        volumes:
          - .:/app
        command: gunicorn -w 4 app:app
    
      nginx:
        image: nginx:latest
        ports:
          - "80:80"
        volumes:
          - ./nginx.conf:/etc/nginx/nginx.conf
        depends_on:
          - web
    
  2. 创建 Nginx 配置文件nginx.conf):

    events {}
    http {
        server {
            listen 80;
            server_name your_domain_or_ip;
    
            location / {
                proxy_pass http://web:5000;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
            }
    
            location /static {
                alias /app/static;
            }
        }
    }
    
  3. 启动服务

    docker-compose up -d
    

总结

Flask是一个灵活且易于上手的Web框架,适合快速开发小型应用和API。通过掌握路由、请求处理、模板渲染等基础知识,我们可以轻松构建功能丰富的Web应用。随着项目的复杂化,结合Flask扩展和部署工具,进一步提升应用的性能和可维护性。


参考文档

  • Flask官方文档
  • Jinja2模板引擎文档
  • Flask-SQLAlchemy文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2278581.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java File、IO流、字节输入流 、字节输出流 、字符输入流 、字符输入流 、缓冲流、转换流、打印流、数据流、序列化流、IO框架

一. File File是Java.io.包下的类&#xff0c;File类的对象用于代表当前操作系统的文件/文件夹 File类只能对文件本身进行操作&#xff0c;不能读写文件里面存储的数据。 1. 创建对象 构造器说明public File(String pathname)根据文件路径创建文件对象public File(String pare…

宇泰串口卡驱动在Ubuntu22.04编译、安装汇总

从官网下载驱动官网地址 上传到Ubuntu, 目录结构如下&#xff1a; 驱动源代码: 驱动代码是基于开源项目编译来的 编译路径不能有中文路径&#xff0c;否则可能有类似错误 源码是基于Linux2.3内核编译&#xff0c;我当前是6.8.0-51&#xff0c;数据结构有升级&#xff0c;需要调…

Linux -- 初识HTTP协议

目录 什么是HTTP协议 什么是 URL &#xff1f; 理解 URL 初识HTTP 请求与响应格式 代码验证 gitee HTTP.hpp 结果 什么是HTTP协议 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;主要用于客户端&#xff08;通常是浏览器&#…

重返未来1999梁月养成攻略 雷电云手机速刷养成材料

在重返未来1999这款游戏中&#xff0c;1月16日上新的版本中新春限定角色【梁月】已经火热上线&#xff0c;今天就给大家一些养成攻略。 1.梁月是一名可适配多种体系的输出位角色&#xff0c;同时自身还有免疫和全队减伤&#xff0c;可以提升队伍的生存能力&#xff0c;比较推荐…

Pytorch|YOLO

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、 前期准备 1. 设置GPU 如果设备上支持GPU就使用GPU,否则使用CPU import torch import torch.nn as nn import torchvision.transforms as transforms im…

ASP.NET Core 中,认证(Authentication)和授权(Authorization)

在 ASP.NET Core 中&#xff0c;认证&#xff08;Authentication&#xff09;和授权&#xff08;Authorization&#xff09;是两个非常重要的概念。它们确保用户能够安全地访问应用程序&#xff0c;并且在访问过程中能按其权限被正确地控制。接下来&#xff0c;我将详细解释这两…

ThinkPHP 8的一对多关联

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

基于SpringBoot+Vue的药品管理系统【源码+文档+部署讲解】

系统介绍 基于SpringBootVue实现的药品管理系统采用前后端分离的架构方式&#xff0c;系统实现了用户登录、数据中心、药库管理、药房管理、物资管理、挂号管理、系统管理、基础设置等功能模块。 技术选型 开发工具&#xff1a;idea2020.3Webstorm2020.3 运行环境&#xff…

tomcat状态一直是Exited (1)

docker run -di -p 80:8080 --nametomcat001 你的仓库地址/tomcat:9执行此命令后tomcat一直是Exited(1)状态 解决办法&#xff1a; 用以下命令创建运行 docker run -it --name tomcat001 -p 80:8080 -d 你的仓库地址/tomcat:9 /bin/bash最终结果 tomcat成功启动

递归40题!再见递归

简介&#xff1a;40个问题&#xff0c;有难有易&#xff0c;均使用递归完成&#xff0c;需要C/C的指针、字符串、数组、链表等基础知识作为基础。 1、数字出现的次数 由键盘录入一个正整数&#xff0c;求该整数中每个数字出现的次数。 输入&#xff1a;19931003 输出&#xf…

《leetcode-runner》【图解】【源码】如何手搓一个debug调试器——架构

前文&#xff1a; 《leetcode-runner》如何手搓一个debug调试器——引言 文章目录 设计引入为什么这么设计存在难点1. 环境准备2. 调试程序 仓库地址&#xff1a;leetcode-runner 本文主要聚焦leetcode-runner对于debug功能的整体设计&#xff0c;并讲述设计原因以及存在的难点…

PyTorch使用教程(1)—PyTorch简介

PyTorch是一个开源的深度学习框架&#xff0c;由Facebook人工智能研究院&#xff08;FAIR&#xff09;于2016年开发并发布&#xff0c;其主要特点包括自动微分功能和动态计算图的支持&#xff0c;使得模型建立更加灵活‌。官网网址&#xff1a;https://pytorch.org。以下是关于…

用LLM做测试驱动开发:有趣又高效的尝试

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

5-1 创建和打包AXI Interface IP

创建和打包AXI Interface IP的前流程和后流程 step 1 &#xff1a; 选择类型 1&#xff1a; 将当前的工程打包成IP 2&#xff1a; 将当前的BD工程打包成IP 3&#xff1a; 将指定的源码打包成IP 4&#xff1a; 创建一个新的AXI 接口IP 其中3和4是比较常用的&#xff0c;本次…

国家统计局湖北调查总队副总队长张小青一行调研珈和科技农业遥感调查智能化算法

1月15日上午&#xff0c;国家统计局湖北调查总队党组成员、副总队长张小青一行莅临珈和科技开展调研。调研期间&#xff0c;张小青一行实地了解了珈和科技在自动化作物分布提取技术领域的最新成果&#xff0c;深入探讨了作物自动化处理模型在农业调查上应用的创新价值及优化方向…

基于微信小程序的电子点菜系统设计与实现(KLW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

SQL Server 导入Excel数据

1、选中指定要导入到哪个数据库&#xff0c;右键选择 》任务 》导入数据 2、数据源 选择Excel&#xff0c;点击 下一步(Next) 3、目前 选择OLE DB Provider &#xff0c;点击 下一步&#xff08;Next&#xff09; 4、默认 &#xff0c;点击 下一步&#xff08;Next&#xff09;…

【Excel】【VBA】双列排序:坐标从Y从大到小排列之后相同Y坐标的行再对X从小到大排列

Excel VBA 双列排序 功能概述 这段VBA代码实现了Excel中的双列排序功能&#xff0c;具体是&#xff1a; 跳过前3行表头先按C列数据从大到小排序在C列值相同的情况下&#xff0c;按B列从大到小排序排序时保持整行数据的完整性 流程图 #mermaid-svg-XJERemQluZlM4K8l {font-fa…

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的&#xff0c;关于类与对象不才在前面笔记中有详细的介绍&#xff1a;点我…

1月17日星期五今日早报简报微语报早读

1月17日星期五&#xff0c;农历腊月十八&#xff0c;早报#微语早读。 1、广东明确旅馆承担防偷拍责任&#xff1a;应确保客房没有偷窥等设备&#xff1b; 2、商务部&#xff1a;手机补贴不用交旧手机&#xff1b; 3、中国汽车工业协会&#xff1a;坚决反对拜登政府禁止使用中…