依赖

  • 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()` 接收 json 数据

@app.route("login", methods=['POST'])
def login():
 
     data = request.get_json()
     username = data['username']
     password = data['password']
 
     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'

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

其他

添加图标

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

运行参数

  • --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)

示例

返回渲染后的模板

return jsonify({'view': render_template('_view.html')})
# 同样支持在 render_template 中传递参数
-  [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 的值

app.config['SECRET_KEY'] = '随机值'
# 或者
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