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-RESTful | REST 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