跳到主要内容

Flask 速查表

快速开始

from flask import Flask

app = Flask(__name__)

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

if __name__ == '__main__':
app.run(debug=True)

路由

# 基本路由
@app.route('/path')
def view():
pass

# 动态路由
@app.route('/user/<username>')
def user(username):
pass

# 类型转换
@app.route('/post/<int:post_id>')
def post(post_id):
pass

# HTTP 方法
@app.route('/api', methods=['GET', 'POST', 'PUT', 'DELETE'])
def api():
pass

# URL 构建
from flask import url_for
url_for('view_name', arg='value')

请求

from flask import request

# 表单数据
request.form['key']
request.form.get('key', default)

# URL 参数
request.args.get('page', 1, type=int)

# JSON
request.get_json()

# 文件
request.files['file']

# Headers
request.headers.get('X-Custom-Header')

# 其他
request.method # HTTP 方法
request.cookies # Cookies
request.remote_addr # 客户端 IP

响应

from flask import make_response, jsonify, redirect, abort

# 字符串
return 'Hello'

# 元组 (内容, 状态码, 头)
return 'Not Found', 404

# JSON
return jsonify({'key': 'value'})

# 自定义响应
response = make_response('Content')
response.status_code = 201
response.headers['X-Custom'] = 'Value'
response.set_cookie('name', 'value')
return response

# 重定向
return redirect(url_for('index'))

# 错误
abort(404)

模板

from flask import render_template

return render_template('template.html', var=value)
<!-- 变量 -->
{{ variable }}
{{ variable|filter }}

<!-- 控制结构 -->
{% if condition %}
{% elif other %}
{% else %}
{% endif %}

{% for item in items %}
{{ loop.index }}
{% endfor %}

<!-- 继承 -->
{% extends "base.html" %}
{% block content %}{% endblock %}

<!-- 包含 -->
{% include "partial.html" %}

<!-- 宏 -->
{% macro input(name) %}
<input name="{{ name }}">
{% endmacro %}

表单 (Flask-WTF)

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

class MyForm(FlaskForm):
name = StringField('Name', validators=[DataRequired()])
submit = SubmitField('Submit')

# 视图
@app.route('/form', methods=['GET', 'POST'])
def form():
form = MyForm()
if form.validate_on_submit():
# 处理数据
return redirect(url_for('success'))
return render_template('form.html', form=form)

数据库 (SQLAlchemy)

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy(app)

# 模型
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)

# 操作
db.create_all()

# 增
db.session.add(user)
db.session.add_all([user1, user2])
db.session.commit()

# 查
User.query.all()
User.query.get(id)
User.query.filter_by(username='john').first()
User.query.filter(User.id > 5).all()
User.query.paginate(page=1, per_page=10)

# 改
user.username = 'new'
db.session.commit()

# 删
db.session.delete(user)
db.session.commit()

认证 (Flask-Login)

from flask_login import LoginManager, login_user, logout_user, login_required, current_user

login_manager = LoginManager(app)

# 登录
login_user(user, remember=True)

# 登出
logout_user()

# 保护路由
@app.route('/protected')
@login_required
def protected():
return f'Hello {current_user.username}'

会话

from flask import session

# 设置
session['key'] = 'value'
session.permanent = True

# 获取
value = session.get('key')

# 删除
session.pop('key', None)
session.clear()

消息闪现

from flask import flash, get_flashed_messages

# 设置
flash('Message', 'category')

# 模板中获取
{% with messages = get_flashed_messages(with_categories=true) %}
{% for category, message in messages %}
<div class="alert alert-{{ category }}">{{ message }}</div>
{% endfor %}
{% endwith %}

Blueprints

from flask import Blueprint

bp = Blueprint('name', __name__, url_prefix='/prefix')

@bp.route('/')
def index():
pass

# 注册
app.register_blueprint(bp)

配置

# 设置
app.config['KEY'] = 'value'
app.config.from_object('configmodule.ProductionConfig')
app.config.from_envvar('APP_SETTINGS')
app.config.from_pyfile('config.py')

# 常用配置
DEBUG = True
SECRET_KEY = 'secret'
SQLALCHEMY_DATABASE_URI = 'sqlite:///app.db'
SQLALCHEMY_TRACK_MODIFICATIONS = False

错误处理

@app.errorhandler(404)
def not_found(error):
return render_template('404.html'), 404

@app.errorhandler(500)
def internal_error(error):
db.session.rollback()
return render_template('500.html'), 500

请求钩子

@app.before_request
def before_request():
pass

@app.after_request
def after_request(response):
return response

@app.teardown_request
def teardown_request(exception):
pass

常用扩展

扩展用途
Flask-SQLAlchemy数据库 ORM
Flask-WTF表单处理
Flask-Login用户认证
Flask-Migrate数据库迁移
Flask-Mail邮件发送
Flask-Caching缓存
Flask-RESTfulREST API
Flask-CORS跨域支持

常用命令

# 运行
flask run
flask run --host=0.0.0.0 --port=8080

# Shell
flask shell

# 数据库迁移
flask db init
flask db migrate -m "message"
flask db upgrade
flask db downgrade