入门Flask(一)

Flask是什么

Flask 是 Python 编写的微框架,核心极简、高度可扩展。

作为 Web 框架来说,它仅保留了核心功能:请求响应处理和模板渲染。这两类功能分别由 Werkzeug(WSGI 工具库)完成和 Jinja(模板渲染库)完成。

核心依赖:仅Werkzeug(WSGI 工具集)与Jinja2(模板引擎),无强制绑定的数据库 / 表单验证等组件。

“微” 的含义:核心只保留路由、请求响应、会话与会话 Cookie 等基础能力;高级功能(ORM、认证、表单)通过扩展实现,赋予开发者最大选择权。

虽然 Flask 是一个微框架,但它的灵活性体现在可以自由选择各种扩展来增强功能。例如:

  • 模板系统:基于 Jinja2,支持模板继承、过滤器、控制结构
  • 表单处理与验证:可用 Flask-WTF 实现验证与 CSRF 防护
  • 数据库集成:常用 Flask-SQLAlchemy,ORM,简化数据库操作
  • 用户认证:Flask-Login、Flask-Security 提供登录、权限管理
  • 蓝图与工厂模式:模块化组织大型应用
  • 快速构建 REST API:Flask-RESTful
  • 处理跨域资源共享问题:Flask-CORS

Flask程序工作流程

_config.yml

  1. 当用户访问一个URL,浏览器便生成对应的HTTP请求,经由互联网发送到对应的Web服务器。
  2. Web服务器接收请求,通过WSGI将HTTP格式的请求数据转换成我们的Flask程序能够使用的Python数据。
  3. 在程序中,Flask根据请求的URL执行对应的视图函数,获取返回值生成响应。
  4. 响应依次经过WSGI转换生成HTTP响应,再经由Web服务器传递,最终被发出请求的客户端接收。
  5. 浏览器渲染响应中包含的HTML和CSS代码,并执行JavaScript代码,最终把解析后的页面呈现在用户浏览器的窗口中。

部署方式:

  • 开发环境:内置服务器app.run(debug=True)。
  • 生产环境:Gunicorn/uWSGI + Nginx,提升性能与稳定性

Gunicorn 和 Uwsgi 都是 Python Web 应用部署中常用的 WSGI 服务器,用于将 Web 应用与 Web 服务器(如 Nginx)对接。
Gunicorn 以 “简单稳定” 取胜,适合中小型 Python 应用快速部署;
Uwsgi 以 “高性能和多功能” 见长,适合大型、高并发或复杂架构的生产环境。
实际使用中,两者常与 Nginx 配合(Nginx 处理静态资源和反向代理,Gunicorn/Uwsgi 处理动态请求),具体选择需根据应用规模和性能需求决定。

WSGI

WSGI 全称是 Web Server Gateway Interface(Web 服务器网关接口),它不是一个软件,也不是一个框架,而是 Python 官方定义的一套标准化通信规则 / 接口协议。

核心作用是统一对接规则,让不同服务器(Gunicorn/uWSGI)和不同框架(Flask/Django)能无缝配合。

WSGI 规范要求应用必须满足:

  • 是可调用对象(比如函数);
  • 接收两个参数:environ(字典,包含所有请求信息,如请求方法、URL、头部等)、start_response(函数,用于设置响应状态码和响应头);
  • 返回一个可迭代的响应体(比如列表)。

Python内置了一个WSGI服务器,这个模块叫wsgiref,它是用纯Python编写的WSGI服务器的参考实现。所谓“参考实现”是指该实现完全符合WSGI标准,但是不考虑任何运行效率,仅供开发和测试使用。

# 1. 定义符合WSGI规范的应用函数
def simple_wsgi_app(environ, start_response):
    # environ:包含所有请求信息的字典,比如请求方法、路径、头部等
    # start_response:用于设置响应状态和响应头的函数
    
    # 步骤1:设置响应状态码和响应头
    status = '200 OK'  # HTTP状态码
    response_headers = [('Content-Type', 'text/plain; charset=utf-8')]  # 响应头
    start_response(status, response_headers)
    
    # 步骤2:构造响应体(必须返回可迭代对象,比如列表)
    # 从environ中获取请求路径
    path = environ.get('PATH_INFO', '/')
    return [f'Hello WSGI! 你访问的路径是:{path}'.encode('utf-8')]

# 2. 用Python内置的WSGI测试服务器运行(仅用于开发测试,不能生产用)
if __name__ == '__main__':
    from wsgiref.simple_server import make_server
    # 创建服务器:绑定地址、端口,指定WSGI应用
    server = make_server('127.0.0.1', 8000, simple_wsgi_app)
    print('WSGI服务器运行在 http://127.0.0.1:8000')
    server.serve_forever()

运行和测试:

  1. 保存代码为wsgi_demo.py,执行python wsgi_demo.py;
  2. 访问http://127.0.0.1:8000,会看到:Hello WSGI! 你访问的路径是:/;
  3. 访问http://127.0.0.1:8000/test,会看到:Hello WSGI! 你访问的路径是:/test。

Flask 和 WSGI 结合的例子:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello Flask (WSGI)!'

# 生产环境中,Gunicorn会调用这个app对象(符合WSGI规范)
if __name__ == '__main__':
    # Flask内置的run()底层也是调用了wsgiref.simple_server(WSGI测试服务器)
    app.run(host='127.0.0.1', port=8000)

参考

Written on November 15, 2025