Flask开发笔记
开发基础
Demo
# -- coding: utf-8 --
from flask import Flask, request, make_response, redirect, abort
app = Flask(__name__)
# route建立请求路径和函数之间的映射
# 等同于 app.add_url_rule()
# app.url_map 存放所以映射
@app.route("/")
# 视图函数
def index():
return "<h1>Hello World!</h1>"
# route支持类型: int, fload, path, 比如 <int:id>
@app.route("/user/<name>")
def greeting(name):
return "Hello, %s" % name
@app.route("ua")
def user_agent():
ua = request.headers.get("User-Agent")
return "Your UA:%s" %ua
@app.route("/error/400")
def error400():
return "<h1>Bad Request</h1>", 400
# 第三个参数可以传入其他headers
@app.route("/cookie")
def respone_with_cookie():
response = make_response("Response with Cookie")
response.set_cookie('user', 'xulz')
return response
# 302 Response
@app.route("/redirect")
def redirect_test():
return redirect("http://127.0.0.1:5000")
# abort 会把控制权交给web server然后抛出异常
@app.route("/abort")
def abort_test():
abort(404)
if __name__ == "__main__":
# 激活 debugger和reloader
# 指定端口
app.run(debug=True, port=8000)
APIs with JSON
- 如果返回是dict,默认被转换为json
- 其他类型需要显式调用 jsonify
- 请求参数: request.args.get(’name')
@app.route("/me")
def me_api():
user = get_current_user()
return {
"username": user.username,
"theme": user.theme,
"image": url_for("user_image", filename=user.image),
}
@app.route("/users")
def users_api():
users = get_all_users()
return jsonify([user.to_json() for user in users])
Context
变量名 | Context | 描述 |
---|---|---|
current_app | 应用上下文 | 当前活跃的应用实例 |
g | 应用上下文 | 用于一个request的临时存储,每次会重置 |
request | 请求上下文 | request对象 |
session | 请求上下文 | 回话,requests间可访问 |
request Hooks
- before_first_request
- before_request
- after_request: 没有发生异常时,注册
- teardown_request 每次request之后注册,即使发生异常
一般把hook和functions view的共享数据存放在g应用上下文
约定
- templates
- static
Blueprint
应用的子集
app.register_blueprint(simple_page, url_prefix='/pages')
SQLAlchemy
filter_by(**kwargs)的使用:
db.users.filter_by(name='Joe')
# 注意下面是重载符号==
db.users.filter(db.users.name=='Joe')
db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))
Flask 扩展
Flask App Builder
偶然发现一个增强版Flask项目,提供了更好的安全和自动CRUD操作等许多常用特性(有点学习Django的意思), 强烈推荐.
flask命令行工具
set FLASK_APP=myapp.py
# 指定端口
flask run -p 8000
# 开启debug
set FLASK_ENV=development
# 列出所有routes
flask routes
常用第三方
# requirements.txt
Flask
Flask-Cache
Flask-Bcrypt
Flask-Login
Flask-WTF
Flask-Bootstrap
Flask-DebugToolbar
Flask-Testing
Flask-Migrate
Flask-SQLAlchemy
celery
创建 Flask Starter Project
pip3 install cookiecutter
cookiecutter https://github.com/testdrivenio/cookiecutter-flask-skeleton
Celery
celery -A application.celery worker
form.my_field.render_kw = {'disabled': 'disabled'}
技巧
禁止控制台输出
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)
增加响应延迟
def get_fake_latency():
return random.uniform(0.1, 0.2)
@app.after_request
def apply_latency(response):
time.sleep(get_fake_latency())
return response
部署
生产环境
- 不要使用`app.run()`方式运行
- 使用gunicorn
- python实现,简单易用
- 运行: gunicorn app:app
- 使用uWsgi
- C实现,CPU占用低
- 通常与Nginx反向代理一起使用
# 最简单的例子
gunicorn -D -b 0.0.0.0:8000 app:app