1. 参考资源
2. 快速入门
Flask依赖两个外部组件:Jinja2 和 Werkzeug路由模块
- 变量规则
给URL添加变量部分,可以将特殊的字段标记为< variable_name >,这个部分将会作为命名参数传递到你的函数。规则可以用 < converter:variable_name > 指定一个可选的转换器
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % username
@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id
转换器有下面几种:
int 接受整数
float 同 int ,但是接受浮点数
path 和默认的相似,但也接受斜线
注:
variable_name 不能为空,否则会报错,只输入一个或多个空格是支持的
函数参数variable_name默认参数无效,总是从url读取。
需要支持url variable_name 为空,和参数 variable_name有默认参数,可以参考如下方式
@app.route('/')
@app.route('/<name>')
def hello(name=None):
return 'hello'+ (name if name else 'None')
其中,默认参数可以随便设定,没必要必须是None
- url_for
返回的是相对路径
URL 构建会转义特殊字符和 Unicode 数据
3. 静态文件
在你的包中或是模块的所在目录中创建一个名为 static 的文件夹,在应用中使用 /static 即可访问。
给静态文件生成 URL ,使用特殊的 'static' 端点名:
url_for('static', filename='style.css')
这个文件应该存储在文件系统上的 static/style.css
4. 渲染模板
render_template()方法可以渲染模板
在模板内部可以访问 request, sesion, g对象,以及get_flashed_messages()函数
自动转义默认开启,传入模板的变量包含HTML,将被自动转义,更多特性参考Jinja文档
自动转义只为扩展名为 .html, .htm, .xml, xhtml 开启,从字符串载入的模板将关闭自动转义
5. 文件上传
用 Flask 处理文件上传,须在 HTML 表单中设置 enctype="multipart/form-data" 属性,不然浏览器不会发送文件。
已上传的文件存储在内存或是文件系统中一个临时的位置。你可以通过请求对象的 files 属性访问它们。每个上传的文件都会存储在这个字典里。它表现近乎为一个标准的 Python file 对象,但它还有一个 save() 方法,这个方法允许你把文件保存到服务器的文件系统上。
把文件按客户端提供的文件名存储在服务器上,可以将它传递给 Werkzeug 提供的 secure_filename() 函数,做文件名的过滤。
from flask import request
from werkzeug import secure_filename
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['the_file']
f.save('/var/www/uploads/' + secure_filename(f.filename))
...
save 支持相对路径和绝对路径
6. 关于响应
视图函数的返回值会被自动转换为一个响应对象。如果返回值是一个字符串, 它被转换为该字符串为主体的、状态码为 200 OK
的 、 MIME 类型是 text/html
的响应对象。Flask 把返回值转换为响应对象的逻辑是这样:
- 如果返回的是一个合法的响应对象,它会从视图直接返回。
- 如果返回的是一个字符串,响应对象会用字符串数据和默认参数创建。
- 如果返回的是一个元组,且元组中的元素可以提供额外的信息。这样的元组必须是 (response, status, headers) 的形式,且至少包含一个元素。 status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。
- 如果上述条件均不满足, Flask 会假设返回值是一个合法的 WSGI 应用程序,并转换为一个请求对象。
如果你想在视图里操纵上述步骤结果的响应对象,可以使用 make_response() 函数。如有这样一个视图:
@app.errorhandler(404)
def not_found(error):
return render_template('error.html'), 404
只需要把返回值表达式传递给 make_response() ,获取结果对象并修改,然后再返回它:
@app.errorhandler(404)
def not_found(error):
resp = make_response(render_template('error.html'), 404)
resp.headers['X-Something'] = 'A value'
return resp
7. 会话
是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名。这意味着用户可以查看你 Cookie 的内容,但却不能修改它,除非用户知道签名的密钥。
要使用会话,需要设置一个密钥
# logout
session.pop('username', None)
8. 日志
Flask 就已经预置了日志系统
app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')
9. 整合 WSGI 中间件¶
给应用添加 WSGI 中间件,可以封装内部 WSGI 应用。
例如若是想用 Werkzeug 包中的某个中间件来应付 lighttpd 中的 bugs ,可以这样做:
from werkzeug.contrib.fixers import LighttpdCGIRootFix
app.wsgi_app = LighttpdCGIRootFix(app.wsgi_app)
10. sqlite
11. 路径
app.root_path 属性可以获取应用的路径。配合 os.path 模块使用,轻松可达任意文件
12. note
- return a requests response object
import requests
@app.route('/')
def index():
url = 'xxx'
resp = requests.get(url)
return (resp.content, resp.status_code, resp.headers.items())
- Flask instance
app = Flask(__name__)
app 的属性或方法会比 Flask 多