flask极简简介

todo:

  • flask环境变量 – FLASK_ENV, FLASK_DEBUG

flask可以支持热更新式的开发,PyCharm的设置方式是在Run Configuration上面勾上DEBUG选项。

假设已有以下代码:

1
2
from flask import Flask
app = Flask(__name__)

路由

路由使用@app.route装饰。路由如包括变量,格式是:/user/<username>或<converter:variable_name>。对应的函数可传入同名的参数, 如:

1
2
3
4
5
6
7
@app.route('/user/<username>')
def show_user_profile(username):
    return 'User %s' % escape(username)

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return 'Post %d' % post_id

转换器包括:

string (缺省值) 接受任何不包含斜杠的文本
int 接受正整数
float 接受正浮点数
path 类似 string ,但可以包含斜杠
uuid 接受 UUID 字符串

路由重定向规则,如果一个路由,如/projects/,以/结尾,那么访问不带/的url将重定向到带/结尾的路由。反之,如果没有以/结尾,访问以/结尾的路由,将报404错误。

使用url_for函数,可以获取到对应的url,不用写死,如:

1
2
3
fORM flask import url_for

url_for('index')

模板

flask使用的是jinja2模板, 模板放置的目录默认位于项目的templates目录。如果使用的前后分离的模式,貌似用模板的几率并不是很高 :happy:。 但jinja2模板本身却够简单,使用flask里面的, render_template,即可渲染。如:

1
2
3
4
5
6
7
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1>
{% else %}
  <h1>Hello, World!</h1>
{% endif %}

请求数据

web请求的数据位于flask的request对象中,这个对象看起来是全局对象,在多线程的环境中不可以使用,实际上,这个是本地安全的。如:

1
from flask import request

响应数据

响应数据规则:

  1. 如果视图返回的是一个响应对象,那么就直接返回它。
  2. 如果返回的是一个字符串,那么根据这个字符串和缺省参数生成一个用于返回的 响应对象。
  3. 如果返回的是一个字典,那么调用 jsonify 创建一个响应对象。
  4. 如果返回的是一个元组,那么元组中的项目可以提供额外的信息。元组中必须至少 包含一个项目,且项目应当由 (response, status) 、 (response, headers) 或者 (response, status, headers) 组成。 status 的值会重载状态代码, headers 是一个由额外头部值组成的列表 或字典。
  5. 如果以上都不是,那么 Flask 会假定返回值是一个有效的 WSGI 应用并把它转换为 一个响应对象。

如果想要在视图内部掌控响应对象的结果,那么可以使用 make_response()函数。如:

1
2
3
4
5
@app.errorhandler(404)
def not_found(error):
    resp = make_response(render_template('error.html'), 404)
    resp.headers['X-Something'] = 'A value'
    return resp

会话,日志

会话from flask import session, 日志app.logger.debug