Flask

2022-05-04

依赖

  • Werkzeug:WSGI(应用和服务之间的标准 Python 接口)
  • jinja2:模版渲染引擎

  • markupSafe:和 Jinja2 共用,避免不可信的输入,防止注入攻击
  • ItsDangerous:保证数据完整性(session cookie)
  • Click:命令行应用框架(这里用于提供和自定义 flask 命令)
  • 可选依赖 collapsed:: true
    • Blinker:为信号提供支持
    • Python-dotenv:环境变量
    • Watchdog:服务重载

路由

必需以** / **开头

  • 路由规则
    • @app.route(’/’):根地址
    • @app.route(‘/home’):指定页面(可多个)
    • @app.route(‘/user/name’):自定义变量
  • 上下文
    • @app.context_processor:返回的函数变量可以在每个模版中使用
  • 错误处理
    • @app.errorhandler(code):需传递对应错误代码
  • 快捷路由 ((61894f19-83e3-4a81-90f5-8060239f3e24))
    • @app.get()
    • @app.post()
    • @app.delete()
    • @app.put()
    • @app.patch()
  • 参数
    • methods
      • GET
      • POST

函数

  • url_for:生成 URL(可在模版中直接使用)
    • 默认值为视图名(函数)
    • 可添加 URL 参数(即函数参数) url_for('user_page', name='immwind')

request

json

通过 request.get_json()` 接收 docs/Programming/Language/Python/librarys/json|json 数据

1
@app.route("login", methods=['POST'])
2
def login():
3
4
data = request.get_json()
5
username = data['username']
6
password = data['password']
7
8
return jsonify({"username": username})

form 表单

  • request.form.items() :获取以字典形式返回所有 form 表单数据(需 dict 转)
  • request.form.get('key') :获取 form 表单指定键数据

file 文件

  • request.files[<name>] : 获取单个文件
  • request.files.getlist(<name>) : 获取多个文件

URL 参数

  • args:URL 参数
  • 可变参数即为变量
  • request.args:查看 URL 的所有参数
  • request.args.get('arg') :获取链接参数数据
  • method:方法
    • request.method:获取 https 请求方法

files

  • request.files.getlist(“file[]”): 获取多个
  • request.files[“file”]: 获取单个

Session

需配置app.config['SECRET_KEY'] = 'XXXXX'

1
from flask import session
2
3
# 设置
4
session['key'] = 'value' # 监制对,字典形式
5
# 获取(可像字典一样操作)
6
session['key'] # 如 key 不存在,会报错
7
session.get('key') # key 不存在时,返回 None
8
# 删除
9
session.pop('key', None)
10
session['key'] = False
11
# 清除所有数据
12
session.clear

其他

添加图标

1
<!-- 在 link 添加一行,图标应当放在项目 static 目录下 -->
2
<link
3
rel="shortcut icon"
4
href="{{ url_for('static', filename='favicon.ico') }}"
5
/>

运行参数

  • --port=<Port> :端口
  • --host=10.1.1.11

环境变量

  • FLASK_APP:默认程序(默认为 app.py 文件)
  • FLASK_ENV:运行环境
    • production:默认
    • development:调试模式

配置变量

app.config:变量名必须大写

  • app.config['JSON_AS_ASCII'] = False : jsonify 返回支持中文
  • SQLALCHEMY_DATABASE_URI :SQLAlchemy 数据库连接地址
  • SQLALCHEMY_TRACK_MODIFICATIONS:模型修改监控(默认 True)

示例

返回渲染后的模板

1
return jsonify({'view': render_template('_view.html')})
2
# 同样支持在 render_template 中传递参数
3
- [Using Jinja templates with AJAX calls – NAVIS STVLTORVM](https://belikoff.net/using-jinja-templates-with-ajax-calls/)

报错

WARNING: This is a development server. Do not use it in a production deployment.

设置当前环境为开发环境 export FLASK_ENV=development

NameError: name ‘app’ is not defined

未定义app = Flask(__name__)所致

RuntimeError: A secret key is required to use CSRF.

需要配置 SECRET_KEY 的值

1
app.config['SECRET_KEY'] = '随机值'
2
# 或者
3
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY') or '随机值'

信息

参考

  • Flask 中文文档 (2.0.2)
  • 书籍
  • 版本更新
    • Flask 2.0 新特性 id:: 61894f19-83e3-4a81-90f5-8060239f3e24 collapsed:: true 2021-05-12 发布
      • 蓝本嵌套
      • 支持 asyncio/await
      • 新增快捷路由装饰器
      • 不再支持 Python2 和 Python 3.5