入门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程序工作流程

- 当用户访问一个URL,浏览器便生成对应的HTTP请求,经由互联网发送到对应的Web服务器。
- Web服务器接收请求,通过WSGI将HTTP格式的请求数据转换成我们的Flask程序能够使用的Python数据。
- 在程序中,Flask根据请求的URL执行对应的视图函数,获取返回值生成响应。
- 响应依次经过WSGI转换生成HTTP响应,再经由Web服务器传递,最终被发出请求的客户端接收。
- 浏览器渲染响应中包含的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()
运行和测试:
- 保存代码为wsgi_demo.py,执行python wsgi_demo.py;
- 访问http://127.0.0.1:8000,会看到:Hello WSGI! 你访问的路径是:/;
- 访问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)
