请求、重定向及会话
Web 开发中经常需要处理 HTTP 请求、重定向和会话等诸多事务,相应地,Flask 也内建了一些常见的对象如 request, session, redirect 等对它们进行处理。
请求对象 request
HTTP 请求方法有 GET、POST、PUT 等,request 对象也相应地提供了支持。举个例子,假设现在我们开发一个功能:用户注册。如果 HTTP 请求方法是 POST,我们就注册该用户,如果是 GET 请求,我们就显示注册的字样。代码示例如下(注意,下面代码并不能直接运行,文末提供了完整的代码):
1. from flask import Flask, request
3. app = Flask(__name__)
5. @app.route('/register', methods=['POST', 'GET']):
6. def register():
7. if request.method == 'GET':
8. return 'please register!'
9. elif request.method == 'POST':
10. user = request.form['user']
11. return 'hello', user
重定向对象 redirect
当用户访问某些网页时,如果他还没登录,我们往往会把网页重定向到登录页面,Flask 提供了 redirect 对象对其进行处理,我们对上面的代码做一点简单的改造,如果用户注册了,我们将网页重定向到首页。代码示例如下:
1. from flask import Flask, request, redirect
3. app = Flask(__name__)
5. @app.route('/home', methods=['GET']):
6. def index():
7. return 'hello world!'
9. @app.route('/register', methods=['POST', 'GET']):
10. def register():
11. if request.method == 'GET':
12. return 'please register!'
13. elif request.method == 'POST':
14. user = request.form['user']
15. return redirect('/home')
会话对象 session
程序可以把数据存储在用户会话中,用户会话是一种私有存储,默认情况下,它会保存在客户端 cookie 中。Flask 提供了 session 对象来操作用户会话,下面看一个示例:
1. from flask import Flask, request, session, redirect, url_for, render_template
3. app = Flask(__name__)
5. @app.route('/home', methods=['GET'])
6. def index():
7. return 'hello world!'
9. @app.route('/register', methods=['GET', 'POST'])
10. def register():
11. if request.method == 'POST':
12. user_name = request.form['user']
13. session['user'] = user_name
14. return 'hello, ' + session['user']
15. elif request.method == 'GET':
16. if 'user' in session:
17. return redirect(url_for('index'))
18. else:
19. return render_template('login.html')
21. app.secret_key = '123456'
23. if __name__ == '__main__':
24. app.run(host='127.0.0.1', port=5632, debug=True)
操作 session 就像操作 python 中的字典一样,我们可以使用 session['user'] 获取值,也可以使用 session.get('user') 获取值。注意到,我们使用了 url_for 生成 URL,比如 /home 写成了 url_for('index')。url_for() 函数的第一个且唯一必须指定的参数是端点名,即路由的内部名字。默认情况下,路由的端点是相应视图函数的名字,因此 /home 应该写成 url_for('index')。还有一点,使用session 时要设置一个密钥 app.secret_key。
附录
本节完整的代码如下:
1. $ tree .
2. .
3. ├── flask-session.py
4. └── templates
5. ├── layout.html
6. └── login.html
8. $ cat flask-session.py
9. from flask import Flask, request, session, redirect, url_for, render_template
11. app = Flask(__name__)
13. @app.route('/')
14. def head():
15. return redirect(url_for('register'))
17. @app.route('/home', methods=['GET'])
18. def index():
19. return 'hello world!'
21. @app.route('/register', methods=['GET', 'POST'])
22. def register():
23. if request.method == 'POST':
24. user_name = request.form['user']
25. session['user'] = user_name
26. return 'hello, ' + session['user']
27. elif request.method == 'GET':
28. if 'user' in session:
29. return redirect(url_for('index'))
30. else:
31. return render_template('login.html')
33. app.secret_key = '123456'
35. if __name__ == '__main__':
36. app.run(host='127.0.0.1', port=5632, debug=True)
38. $ cat layout.html
39. <!doctype html>
40. <title>Hello Sample</title>
41. <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
42. <div class="page">
43. {% block body %}
44. {% endblock %}
45. </div>
47. $ cat login.html
48. {% extends "layout.html" %}
49. {% block body %}
50. <form name="register" action="{{ url_for('register') }}" method="post">
51. Hello {{ title }}, please login by:
52. <input type="text" name="user" />
53. </form>
54. {% endblock %}
