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

链接