Flask请求、响应和请求扩展
一、请求对象
1. Flask中的request
对象特点:
-
全局性 :在Flask应用中,
request
对象是全局可访问的,不需要在每个视图函数中单独传递。 -
请求特定 :虽然
request
是全局的,但它对于每个请求是唯一的,即每个请求都会有一个新的request
实例。 -
属性丰富 :
request
对象提供了许多属性和方法,用于获取请求的各个方面,如请求方法、请求参数、请求头等。
2. 常用request
属性:
-
request.method
:返回请求的HTTP方法(如GET、POST等)。 -
request.args
:返回一个字典,包含GET请求中的查询字符串参数。 -
request.form
:返回一个字典,包含POST请求中的表单数据。 -
request.values
:返回一个字典,包含GET和POST请求中的所有数据。 -
request.cookies
:返回一个字典,包含客户端发送的cookie。 -
request.headers
:返回一个字典,包含请求的HTTP头信息。 -
request.path
:返回请求的路径部分(不包括查询字符串)。 -
request.full_path
:返回请求的完整路径(包括查询字符串)。 -
request.script_root
:返回请求的脚本根路径。 -
request.url
:返回请求的完整URL(包括查询字符串)。 -
request.base_url
:返回请求的基础URL(不包括查询字符串)。 -
request.url_root
:返回请求的根URL。 -
request.host_url
:返回请求的主机URL。 -
request.host
:返回请求的主机名和端口。 -
request.files
:返回一个字典,包含上传的文件。 -
文件上传
- 使用
request.files
可以访问上传的文件。可以通过文件名获取文件对象,并使用文件对象的save
方法保存文件。
- 使用
二、响应对象
1. 响应四件套
-
直接返回字符串:直接在视图函数中返回一个字符串,Flask会自动创建一个响应对象,并将该字符串作为响应体。
pythonreturn 'Hello, World!'
-
返回模板 :使用
render_template
函数渲染模板并返回响应。pythonreturn render_template('index.html')
-
返回重定向 :使用
redirect
函数创建一个重定向响应。pythonreturn redirect('http://example.com')
-
返回JSON格式 :使用
jsonify
函数将Python字典转换为JSON响应。pythonreturn jsonify({'key': 'value'})
2. 在响应中写Cookie
-
使用make_response函数创建一个响应对象,然后使用set_cookie方法
-
设置cookie。
pythonres = make_response('home') res.set_cookie('yyy', 'yyy', path='/home')
-
删除Cookie:
pythonres.delete_cookie('key')
3. 在响应头中写内容
-
使用make_response创建响应对象后,可以直接操作响应头的字典。
pythonres = make_response('home') res.headers['xxx'] = 'xxx'
三、常用的请求扩展
1. 请求前处理:
-
before_request
:在请求到达视图函数之前调用,可以用来执行一些预处理操作,如权限检查或数据初始化。
python
@app.before_request
def before_request_func():
print('before_request_func')
2. 请求后处理:
-
after_request
:在请求结束后调用,可以对响应对象进行处理,如添加额外的响应头或进行日志记录。
python
@app.after_request
def after_request_func(response): # 有参数response
print('after_request_func')
# 一定要返回response
return response
-
teardown_request
:在每个请求结束后调用,无论是否有异常发生,常用于资源清理或请求后的日志记录。
python
@app.teardown_request
def teardown_request_func(error=None):
print('teardown_request_func')
3. 错误处理:
-
errorhandler
:用于注册错误处理函数,当特定类型的错误发生时(如404,500等),将调用这些函数来处理错误。
python
@app.errorhandler(404)
def page_not_found(error):
return '404 Not Found', 404
@app.errorhandler(500)
def internal_server_error(error):
return '500 Internal Server Error', 500
4. 模板全局函数和过滤器:
-
template_global
:注册可以在模板中直接使用全局函数。
python
@app.template_global()
def reverse(s):
print('reverse')
return s[::-1]
# 模板中使用
{{reverse(s)}}
-
template_filter
:注册自定义的模板过滤器,以便在模板中轻松处理数据。
python
@app.template_filter('reverse')
def reverse_filter(s):
print('reverse_filter')
return s[::-1]
# 模板中使用
{{ my_string|reverse_string }}
四、请求扩展示例
pythonfrom datetime import datetime from flask import Flask, render_template app = Flask(__name__) @app.before_request def before_request_func(): print("Before Request") @app.after_request def after_request_func(response): print("After Request") return response @app.teardown_request def teardown_request_func(exception): print("Teardown Request") @app.errorhandler(500) def server_error(error): return 'Internal Server Error', 500 @app.template_global() def format_time(dt): return dt.strftime('%Y-%m-%d %H:%M:%S') @app.template_filter() def reverse_string(s): return s[::-1] @app.route('/') def index(): return render_template('index.html', current_time=datetime.now(), reversed_string='Hello World') if __name__ == '__main__': app.run()
html
# index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Welcome to my website</h1>
{{ format_time(current_time) }}
{{ reversed_string|reverse_string }}
</body>
</html>