模板渲染
使用 render_template()
方法来渲染模板。
Flask 会在 templates
文件夹里寻找模板,这个文件夹应该与模块同级,我们这样组织我们的目录结构。
情况 1: 模块
/hello.py # 主函数写在这
/templates
/hello.html
情况 2: 包
/application
/__init__.py
/templates
/hello.html
编写 hello.py
:
from flask import render_template
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
编写 hello.html
,在这里我们可以使用 jinja2 的模板语法:
<head>
<title>hello</title>
</head>
<body>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello World!</h1>
{% endif %}
</body>
</html>
静态文件
Flask 会在 static
文件夹里寻找静态文件,我们这样来管理我们的文件目录:
/hello.py # 主函数写在这
/static # 放静态文件的文件夹
/a.css
/templates # 放模板文件的文件夹
/hello.html
要使用静态文件,直接在 HTML 文件里引用,以 CSS 文件为例:
<link rel="stylesheet" type="text/css" href='/static/a.css'>
当然,更聪明的办法是使用 url_for()
方法来生成路径:
<link rel="stylesheet" type="text/css" href="{{ url_for("static",filename="a.css") }}">
request 对象
服务器收到的网络请求会放在一个全局变量 request
中,需要使用要先引入:
from flask import request
request.method
属性,是请求的方法;
request.form
属性,接收表单数据 (数据在 POST 或者 PUT 中传输的);
request.args
属性,接收在 URL ( ?key=value )
中提交的参数
下面是一个接收 POST 方法的表单例子:
from flask import (
Flask,
render_template,
request,
)
# 该路由函数允许 GET 和 POST 方法
@app.route('/login', methods=['POST', 'GET'])
def login():
#请求方法为 POST
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
print('username:', username)
print('password:', password)
return render_template('login.html')
# 请求方法为 GET
else:
return render_template('login.html')
对应的 HTML:
<body>
<form action="{{ url_for('login') }}" method="POST">
用户名:<input type="text" name="username">
<br>
密码:<input type="text" name="password">
<br>
<button type="submit">post</button>
</form>
</body>
request.form
是一个 Flask 自定义的 ImmutableMultiDict
对象,它的用法和字典一样,但我们无法修改它的数据。request.args
的用法也与之一样。
我们更推荐用以下方法来获取 ImmutableMultiDict
对象中的数据,避免 key 不存在造成的错误:
request.args.get('key', '')
request.form.get('key', '')
Cookies
使用 request.cookies
属性可以访问请求的 Cookies 字段。
读取 cookies:
from flask import request
# 获取 cookies 中的 username 字段
username = request.cookies.get('username')
想在视图里操作响应对象,可以使用 make_response()
函数。
使用 set_cookie()
方法设置 cookies,该例子模拟登陆后在 cookies 中加上相关字段的操作:
from flask import (
Flask,
url_for,
render_template,
request,
make_response,
)
@app.route('/login', methods=['POST', 'GET'])
def login():
#请求方法为 POST
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
# 为 cookies 加上 username 字段
resp = make_response(render_template('login.html'))
resp.set_cookie('username', username)
return resp
# 请求方法为 GET
else:
print('打印:', request.cookies)
return render_template('login.html')
重定向和错误
可以用 redirect()
函数把用户重定向到其它地方:
from flask import redirect, url_for
@app.route('login')
def login():
return redirect(url_for('insex'))
要放弃请求并返回错误代码,用 abort()
函数:
@app.route('/error')
def error():
abort(404)
# 下面的代码不会执行
xxx()
现在访问 "/error" 路由会看到一个 Flask 自带的错误页面,如果我们希望自己去定义这个页面的样式,可以这样做:
@app.errorhandler(404)
def page_not_found(error):
return render_template('page_not_found.html'), 404