跳转至

基础

Flask 是一个轻量级的 Python Web 框架,以简单、灵活、易用著称。它适合小型项目或原型开发,但也能扩展用于生产环境。下面将详细介绍 Flask 的概念及具体操作。

1. Flask 概念

1.1 WSGI 和 Flask

  • WSGI(Web Server Gateway Interface) 是 Python 应用和 Web 服务器之间的接口标准。Flask 基于 WSGI,使得它能与各种 Web 服务器兼容。
  • Flask 是一个 WSGI 应用框架,提供路由、请求处理、模板渲染等基本功能。

1.2 路由和视图函数

  • 路由(Routing):将 URL 映射到特定的视图函数(View Function)。
  • 视图函数:处理请求并返回响应内容的函数。

1.3 模板(Templates)

  • Flask 使用 Jinja2 作为模板引擎,允许在 HTML 文件中嵌入 Python 表达式,实现动态内容渲染。

1.4 请求和响应

  • 请求:Flask 提供了 request 对象,包含了 HTTP 请求的所有信息。
  • 响应:视图函数返回的内容就是 HTTP 响应,可以是字符串、JSON、模板渲染结果等。

1.5 中间件(Middleware)

  • 中间件是一个可以在请求处理前后执行额外逻辑的组件,通常用于日志记录、权限验证等。

2. 快速上手:构建一个简单的 Flask 应用

2.1 安装 Flask

首先,需要安装 Flask。

pip install flask

2.2 创建一个简单的 Flask 应用

from flask import Flask

app = Flask(__name__)

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

if __name__ == '__main__':
    app.run()
  • Flask(__name__) 创建了一个 Flask 应用实例。
  • @app.route('/') 装饰器将根路径 / 映射到 hello_world 视图函数。
  • app.run() 启动应用服务器。

运行代码后,访问 http://127.0.0.1:5000/,你会看到 Hello, World! 的输出。

2.3 路由和路径参数

可以通过路径参数实现动态 URL。

@app.route('/user/<username>')
def show_user_profile(username):
    return f'User {username}'
  • <username> 是路径参数,Flask 会自动将 URL 中的部分传递给视图函数。

访问 http://127.0.0.1:5000/user/Alice,你会看到 User Alice 的输出。

2.4 模板渲染

Flask 使用 Jinja2 渲染 HTML 模板。

from flask import render_template

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

templates 目录下创建 hello.html

<!doctype html>
<html>
    <head>
        <title>Hello</title>
    </head>
    <body>
        <h1>Hello, {{ name }}!</h1>
    </body>
</html>

访问 http://127.0.0.1:5000/hello/Alice,将渲染出包含 Hello, Alice! 的 HTML 页面。

2.5 处理表单数据

Flask 提供了简单的方法来处理表单提交的数据。

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        return f'Logged in as {username}'
    return '''
        <form method="post">
            Username: <input type="text" name="username"><br>
            <input type="submit" value="Login">
        </form>
    '''
  • request.form 访问表单数据。
  • 使用 methods=['GET', 'POST'] 指定路由支持的 HTTP 方法。

2.6 静态文件

Flask 默认将 static 目录中的文件作为静态文件。

<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
  • 使用 url_for('static', filename='style.css') 生成静态文件的 URL。

3. 中间件和扩展

3.1 中间件

中间件在请求前后执行特定操作,例如请求日志记录。

@app.before_request
def before_request_func():
    print("This is executed BEFORE each request.")

@app.after_request
def after_request_func(response):
    print("This is executed AFTER each request.")
    return response

3.2 使用 Flask 扩展

Flask 提供了丰富的扩展,例如数据库支持、用户认证等。以下是 Flask-SQLAlchemy 的示例:

pip install flask-sqlalchemy
from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.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)

db.create_all()
  • SQLAlchemy 是一个 ORM 库,提供了数据库操作的高级接口。

4. 部署 Flask 应用

4.1 使用 Gunicorn 部署

pip install gunicorn
gunicorn -w 4 myapp:app
  • -w 4 指定使用 4 个工作进程。

4.2 使用 Docker 部署

创建一个 Dockerfile:

FROM python:3.8-slim

WORKDIR /app
COPY . /app

RUN pip install -r requirements.txt

CMD ["gunicorn", "-w", "4", "myapp:app"]

然后使用 docker builddocker run 来构建和运行容器化的 Flask 应用。

5. Flask 与其他框架对比

  • 轻量 vs. 重量:Flask 是一个微框架,灵活性强,而 Django 是一个全栈框架,内置了很多功能。
  • 扩展性:Flask 的功能依赖于扩展,开发者可以自由选择需要的功能。

总结

Flask 是一个简单易用的 Web 框架,适合快速构建小型 Web 应用或原型。通过路由、模板、表单处理和中间件等功能,可以快速构建功能完善的 Web 应用。Flask 的扩展性强,能够满足多种需求,同时其轻量级的特性使得它在小型项目中非常受欢迎。