记录 Flask 常见的示例,可以用来作为参考使用。
最简单的应用
指定监听地址,端口号,并使用调试模式,当然只用于调试。
POST 请求处理
假设以用户注册为例,需要向服务器发送用户名和密码,其中服务器侧的程序如下:
如上的 request.form 是个 ImmutableMultiDict 对象,详细可查看源码中的 flask.Request.form 。
其中客户端 client.py 的内容如下:
路由、变量转换
可以给 URL 添加变量部分,<converter:variable_name> 分别指定了转换器,以及转换后变量的名称。
默认采用的是 string(字符串,无斜线)、int(整数)、float(浮点型)、path(类似字符串,但是可以接受斜线) 。
重定向
Flask 中有两种重定向的行为,分别介绍如下。
唯一 URL / 重定向
Flask 的 URL 规则基于 Werkzeug 的路由模块,其中有个默认的重定向规则,也就是唯一 URL / 的重定向行为,如下所示。
上述的方式中,当尝试访问 projects 时会重定向到 projects/,而对于第二种尝试访问 about/ 时会产生 404 “Not Found” 错误。
用户重定向
另外一种,在 Flask 中通常是通过 redirect() 执行重定向操作,有如下的几种方式。
code 可以选择 301 (永久性跳转)、302 (临时性跳转),其它的还有 303、305、307 等操作。
构造 URL
可以通过 url_for() 来给指定的函数构造 URL,第一个参数是函数名,并接受规则变量部分的命名参数,如果是未知变量部分则会添加到 URL 末尾作为查询参数。
通过 url_for() 函数,URL 构建会转义特殊字符和 Unicode 数据,免去你很多麻烦。
Cookies
可以通过如下方法设置 cookies,如果要使用会话可以查看下部分的内容。
如上,Cookies 是设置在响应对象上的,而通常视图函数只是返回字符串,之后由 Flask 将字符串转换为响应对象,如果要显式地转换,可以使用 make_response() 函数然后再进行修改。
然后通过如下方式进行测试。
注意,上述的 cookies 中是明文保存的。
会话 session
会话允许你在不同请求间存储特定用户的信息,是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名。这意味着用户可以查看你 Cookie 的内容,但却不能修改它,除非用户知道签名的密钥。
然后通过如下方式进行测试。
上述的密钥可以通过 os.urandom(24) 生成随机秘密。如果发现某些请求并没有持久化,这时需要检查你的页面响应中的 Cookies 的大小,并与 Web 浏览器所支持的大小对比。
执行命令
可以在 flask 中设置一些初始化操作命令,直接通过 flask 命令执行。
假设上述文件文 foobar.py,则可以通过如下命令执行。
消息闪现
Flask 提供了消息闪现系统,可以简单地给用户反馈,增加用户体验。 消息闪现系统通常会在请求结束时记录信息,并在下一个(且仅在下一个)请求中访问记录的信息,展现这些消息通常结合要模板布局。
其中 templates/layout.html 模版如下:
该方法会在 session 中保存 session[‘_flashes’] = flashes 值,所以需要配置 secret_key,使用 flash() 方法可以闪现一条消息,要操作消息本身,使用 get_flashed_messages() 函数,并且只能在模板中也可以使用。
工厂模式
您可以像下面展示的这样,从一个函数里启动这个应用:
此时如果要获取当前配置下的应用程序,可以使用 current_app 。
所以,要使用这样的一个应用,你必须先创建这个应用对象,这里是一个运行此类程序的 run.py 文件的例子。
处理JSON
实际上包括了两种,一个是如何接收 json 数据,还有就是如何返回 json 数据。
接收JSON请求
首先是前端通过 jQuery 发送数据请求。
注意,如果上述的请求中,如果不使用 JSON.stringify() 函数处理,实际上发送的请求是在请求 URL 后面添加参数,例如 /your/url/?username=foobar&address=china 。
也就是说,请求头中的 Content-Tpye 默认是 application/x-www-form-urlencoded,所以参数会被编码上述的格式,提交到后端,后端会当作表单数据处理。
返回JSON数据
处理 JSON 需要把请求头和响应头的 Content-Type 设置为 application/json 。
客户端内容如下。
简单来说,jsonify() 函数返回了 flask.Response() 对象,而且其中返回消息的 content-type 头信息为 ‘application/json’,而 json.dumps() 则是返回一个 encoded 字符串。
另外,需要注意的是 jsonify() 的参数是 kwargs 或者 dictionaries;而 json.dumps() 还支持 lists 以及其它数据类型。
也可以使用如下的修饰符,当报错时,会直接返回相应的报错信息。
源码解析
其中 get_json() 函数在源码的 flask/wrappers.py 文件中,其代码也很简单,源码如下。
而返回的 json 数据处理如下,在 flask/json.py 文件中,代码如下。
参考
关于一些技巧,可以直接参考 快速入门 所展示的示例。