请求和响应
一、请求相关(request对象):
在Flask中,可以使用
request
对象来获取和处理当前请求的相关信息。**
request
对象是一个全局对象,可以在任何视图函数中直接使用。**
需要注意的是,在使用
request
对象之前,需要先导入它:
from flask import request
以下是
request
对象的一些常用属性和方法:
1.
method
:是一个属性,获取当前请求的HTTP方法(字符串/只读属性),例如GET、POST、PUT等。
request.method
2.
args
:获取URL查询参数的字典形式。如果有相同的键,只会获取最后一个值。
具体来说,
request.args
包含了当前请求URL中的所有查询参数,并以键值对的形式存储在字典中。
request.args
需要注意的是,request.args返回的是一个不可变的字典,不能直接对其进行修改。如果需要对查询参数进行更改,可以通过创建一个新的字典来实现。
此外,可以通过访问request.args字典的键来获取特定的查询参数值。例如,要获取名为param的查询参数的值,可以使用request.args.get(‘param’)。
3.
form
:获取表单数据的字典形式。适用于POST请求中的表单数据。
具体来说,
request.form
包含了当前请求中提交的所有表单数据,并以键值对的形式存储在字典中。
request.form
需要注意的是,在使用request.form之前,需要确保请求的方法是POST,并且Content-Type设置为application/x-www-form-urlencoded或multipart/form-data。如果请求的方法不是POST,或者Content-Type不正确,request.form将会是一个空字典。
此外,可以通过访问request.form字典的键来获取特定表单字段的值。例如,要获取名为username的表单字段的值,可以使用request.form.get(‘username’)。
4.
files
:获取上传文件的字典形式。用于获取上传文件的相关信息。它包含了当前请求中所有上传的文件,其中键是文件字段名,值是
FileStorage
对象。
request.files
实战使用:
from flask import Flask, request
app = Flask(__name__)@app.route('/upload', methods=['POST'])defupload_file():file= request.files['File']# 获取单个上传文件
filename =file.filename # 获取文件名file.save(f'uploads/{filename}')# 保存文件到指定路径return"File uploaded successfully!"if __name__ =='__main__':
app.run()
在上述示例中,我们定义了一个路由处理
POST /upload
的请求,用于上传文件。通过
request.files['File']
可以获取名为
File
的上传文件。
FileStorage
对象提供了一些常用的属性和方法:
filename
:获取上传文件的文件名。content_type
:获取上传文件的MIME类型。save(path)
:将上传文件保存到指定路径。stream
:获取上传文件的字节流,可用于自定义处理。
除了直接使用
request.files
获取单个上传文件外,你还可以使用
getlist()
方法获取同名字段的多个上传文件。
files = request.files.getlist('file')# 获取同名字段的多个上传文件
需要注意的是,在处理文件上传时,确保在表单中正确设置
enctype="multipart/form-data"
,以便Flask能够正确解析上传文件。
5.
headers
:获取请求头信息的字典形式。
具体来说,
request.headers
包含了当前请求中的所有HTTP头部字段,并以键值对的形式存储在字典中。每个键表示一个头部字段名,对应的值表示该字段的值。
request.headers
需要注意的是,request.headers返回的是一个不可变的字典,不能直接对其进行修改。如果需要添加或修改头部字段,可以使用response.headers来设置响应头部。
此外,可以通过访问request.headers字典的键来获取特定头部字段的值。例如,要获取名为User-Agent的头部字段的值,可以使用request.headers.get(‘User-Agent’)。
6.
cookies
:获取请求中Cookie的字典形式。
request.cookies
需要注意的是,request.cookies返回的也是一个不可变的字典,不能直接对其进行修改。如果需要添加或修改Cookie,可以使用response.set_cookie()方法来设置响应的Cookie。
此外,可以通过访问request.cookies字典的键来获取特定Cookie的值。例如,要获取名为session_id的Cookie的值,可以使用request.cookies.get(‘session_id’)。
7.
json
:是一个属性,用于获取当前请求中的JSON数据。
具体来说,如果请求的Content-Type是application/json,并且请求体中包含有效的JSON数据,那么
request.json
将返回一个表示JSON数据的Python字典或列表。
实战之使用
request.json
获取当前请求中的JSON数据:
from flask import Flask, request
app = Flask(__name__)@app.route('/', methods=['POST'])defhome():if request.is_json:
json_data = request.json
returnf"JSON Data: {json_data}"return"Please send JSON data in the request body."if __name__ =='__main__':
app.run()
当用户以POST方法访问根路径
/
时,如果请求的Content-Type是application/json并且请求体中包含有效的JSON数据,则Flask将会调用
home
视图函数,并使用
request.json
获取当前请求中的JSON数据。然后我们可以对这些JSON数据进行处理。
需要注意的是,在使用
request.json
之前,需要确保请求的方法是POST,并且Content-Type设置为
application/json
。如果请求的方法不是POST,或者Content-Type不正确,或者请求体中不包含有效的JSON数据,
request.json
将会是None。
8.
data
:是一个属性,用于获取当前请求中的原始数据。
具体来说,
request.data
返回一个包含了请求体中的原始字节数据的字符串或字节数组。它通常用于处理非表单数据(例如二进制数据)或自定义数据格式的请求。
需要注意的是,
request.data
返回的是原始字节数据,而不是解析后的结构化数据(例如表单数据或JSON数据)。如果请求的Content-Type是application/x-www-form-urlencoded或multipart/form-data,则应该使用
request.form
来获取表单数据;如果Content-Type是application/json,则应该使用
request.json
来获取JSON数据。
9.
get(key, default=None, type=None)
:获取查询参数或表单数据中指定键的值。如果没有找到指定键,返回
default
值。
request.args.get('key')
request.form.get('key', default='default_value')
get(key, default=None, type=None)
是
request.args
和
request.form
的方法,用于获取指定键的值。
具体来说,
get()
方法接受三个参数:
key
:要获取值的键。default
(可选):如果指定的键不存在,则返回该默认值。默认值为None
。type
(可选):如果指定,将尝试将值转换为指定的类型。
实战讲解:
from flask import Flask, request
app = Flask(__name__)@app.route('/')defhome():
name = request.args.get('name', default='Guest')
age = request.form.get('age',type=int)returnf"Hello, {name}! You are {age} years old."if __name__ =='__main__':
app.run()
当访问根路径
/
时,Flask将会调用
home
视图函数,并使用
get()
方法从
request.args
中获取名为
name
的参数的值,如果不存在则返回默认值
'Guest'
。然后使用
get()
方法从
request.form
中获取名为
age
的参数的值,并尝试将其转换为整数类型。最后,将这些值用于生成欢迎消息。
需要注意的是,
get()
方法可以用于
request.args
和
request.form
字典,但不能直接用于
request.cookies
和
request.headers
。对于Cookie和头部字段的获取,可以使用相应字典的
get()
方法。
10.
args.getlist(key, type=None)
:获取查询参数中指定键的多个值(列表)。
args.getlist(key, type=None)
是
request.args
的方法。
具体来说,
getlist()
方法接受两个参数:
key
:要获取值的键。type
(可选):如果指定,将尝试将所有值转换为指定的类型。
实战之使用
getlist()
方法从
request.args
中获取指定键的所有值:
from flask import Flask, request
app = Flask(__name__)@app.route('/')defhome():
ingredients = request.args.getlist('ingredient')returnf"Selected Ingredients: {ingredients}"if __name__ =='__main__':
app.run()
当访问根路径
/
时,Flask将会调用
home
视图函数,并使用
getlist()
方法从
request.args
中获取名为
ingredient
的所有参数的值,并将其存储在一个列表中。然后,将这些值用于生成选中的配料列表。
需要注意的是,
getlist()
方法只能用于
request.args
字典,不能直接用于其他字典(如
request.form
、
request.cookies
等)。对于其他字典的获取多个值,可以使用相应字典的多个操作符或遍历字典的方式进行处理。
11.
path
:是一个属性,获取当前请求的路径部分(不包含域名和查询参数)。它返回一个字符串,表示当前请求的路径。
需要注意的是,
request.path
只包含路径部分,不包含域名和查询参数。如果想要获取完整的URL,可以使用
request.url
属性。而如果只需要获取查询参数,可以使用
request.query_string
属性。
# 获取完整的URL"""
源码注释:
The full request URL with the scheme, host, root path, path, and query string.
"""
url = request.url
# 获取查询参数
query_string = request.query_string
12.
values
:是一个字典,用于获取请求中的参数值。它可以获取URL查询参数和表单数据的合并结果。
request.values
包含了当前请求中的所有参数,其中键是参数名,值是对应的参数值。它可以获取GET请求的查询参数,也可以获取POST请求的表单数据。
实战讲解:
from flask import Flask, request
app = Flask(__name__)@app.route('/search')defsearch():
keyword = request.values.get('keyword')# 获取指定参数的值returnf"Search results for: {keyword}"if __name__ =='__main__':
app.run()
在上述示例中,我们定义了一个路由处理
GET /search
的请求,用于搜索。通过
request.values.get('keyword')
可以获取名为
keyword
的参数值。
如果要获取所有参数的键值对,可以直接使用
request.values
字典来进行遍历操作。
for key, value in request.values.items():print(key, value)
需要注意的是,
request.values
获取到的是合并后的参数值,即先从URL查询参数中获取,然后再从表单数据中获取。如果有相同的参数名,则会获取最后一个值。
13.
full_path
:是一个属性,包含了完整的URL路径和查询参数,但不包括协议和主机部分。如果想要获取完整的URL,可以使用
request.url
属性。
源码注释:Requested path, including the query string.
例如,如果访问的URL为
http://localhost:5000/foo?param=value
,则
request.full_path
会返回
/foo?param=value
。
14.
script_root
:是一个属性,用于获取应用程序的根路径。它表示当前请求所在的URL路径中应用程序的根目录。
在Web开发中,应用程序常常会被部署在特定的URL路径下,例如
http://example.com/myapp
。在这种情况下,
/myapp
就是应用程序的根路径。
request.script_root
的值是一个字符串,表示当前请求所在的URL路径中应用程序的根目录。该值是动态计算的,根据请求的相关信息来确定。
以下是一些常见的情况,以说明
request.script_root
的使用:
- 如果应用程序部署在根目录下(例如
http://example.com/
),则request.script_root
的值将为空字符串。 - 如果应用程序部署在子目录下(例如
http://example.com/myapp/
),则request.script_root
的值将为/myapp
。 - 对于带有URL重写或反向代理的情况,
request.script_root
可以正确地返回应用程序的根路径。
request.script_root
属性通常用于构建相对URL。通过将
request.script_root
与其他路径拼接,可以确保生成的URL是相对于应用程序的根路径的。这在处理静态文件、生成跳转URL等方面非常有用。
实战之使用
request.script_root
来生成静态文件的URL:
from flask import Flask, render_template, url_for, request
app = Flask(__name__)@app.route('/')defhome():
static_file_url = request.script_root +'/static/css/styles.css'return render_template('home.html', static_file_url=static_file_url)if __name__ =='__main__':
app.run()
使用
request.script_root
来构建静态文件的URL。通过将其与其他路径进行拼接,生成的URL将相对于应用程序的根目录。
15.
url
:是一个属性,用于获取完整的请求URL,包括协议、域名、端口、路径和查询参数等。
具体来说,
request.url
返回一个字符串,表示当前请求的完整URL。它由以下几部分组成:
- 协议(例如:http、https)
- 域名
- 可选的端口号
- 路径
- 查询参数(如果存在)
实战之使用
request.url
获取请求的完整URL:
from flask import Flask, request
app = Flask(__name__)@app.route('/')defhome():
url = request.url
returnf"Current URL: {url}"if __name__ =='__main__':
app.run()
当访问根路径
/
时,Flask将会调用
home
视图函数,并使用
request.url
获取当前请求的完整URL。然后可以将该URL展示给用户或进行其他操作。
需要注意的是,
request.url
返回的是一个只读属性,不能直接对其进行修改。如果需要修改URL的某些部分,可以使用
url_root
、
path
和
query_string
等属性,或者借助
urljoin()
方法来构建新的URL。
16—19.
base_url
url_root
host_url
:host
base_url
源码注释:
Like :attr:`url` but without the query string.
url_root
源码注释:
Alias for :attr:`root_url`. The URL with scheme, host, and root path. For example, ``
.
host_url
源码注释:
The request URL scheme and host only.
host
源码注释:
The host name the request was made to, including the port if it's non-standard. Validated with :attr:`trusted_hosts
这四个都是用于获取请求URL的相关属性。
request.base_url
表示当前请求的基本URL。它包括协议、域名、端口和路径,但不包括查询参数。例如,http://example.com/app/
。request.url_root
是当前请求的URL根路径。它由协议、域名和可选的端口组成,不包括路径和查询参数。例如,http://example.com/
。request.host_url
是当前请求的主机URL。它包含协议、域名和可选的端口,但不包括路径和查询参数。例如,https://example.com/
。request.host
表示当前请求的主机名。它只包括域名部分,不包括协议、端口、路径和查询参数。例如,example.com
。
这些属性可以用于根据请求的上下文获取相应的URL信息。具体使用哪个属性取决于需要获取的URL的精确部分。
实战使用这些属性:
from flask import Flask, request
app = Flask(__name__)@app.route('/')defhome():
base_url = request.base_url
url_root = request.url_root
host_url = request.host_url
host = request.host
returnf"Base URL: {base_url}\nURL Root: {url_root}\nHost URL: {host_url}\nHost: {host}"if __name__ =='__main__':
app.run()
当访问根路径
/
时,Flask将会调用
home
视图函数,并使用这些属性获取当前请求的基本URL、URL根路径、主机URL和主机名。然后可以将这些URL信息展示给用户或进行其他操作。
需要注意的是,这些属性都是只读属性,不能直接对其进行修改。如果需要构建新的URL,可以使用
urljoin()
方法来合并URL部分和路径或查询参数。
二、响应相关:
在Flask中,响应是指从服务器返回给客户端的数据。Flask提供了多种方式来生成和发送响应。
以下是一些常见的与Flask响应相关的功能和方法:
- 返回字符串:- 使用
return
语句返回一个字符串即可。Flask会自动将其包装成一个响应对象并发送给客户端。 - 返回JSON数据:- 使用
return jsonify(data)
函数将Python字典或列表转换为JSON格式,并返回一个包含JSON数据的响应对象【注意需要从flask中导入jsonify】。- 或者使用return json.dumps(data)
手动将数据转换为JSON字符串,并设置content_type='application/json'
。 - 返回模板渲染结果:- 使用Flask提供的模板引擎(如Jinja2)渲染HTML模板,然后返回渲染结果。可以使用
render_template(template_name, **context)
函数进行模板渲染,其中template_name
是模板文件名,context
是传递给模板的上下文变量(后面在讲jinjia2的时候会讲)。 - 设置响应状态码:- 在视图函数中可以使用
return response, status_code
的形式来设置响应的状态码。例如:return 'OK', 200
表示返回200状态码。- 或者使用make_response()
函数创建一个响应对象,然后设置其status_code
属性。 - 设置响应头部:- 可以使用
response.headers[key] = value
方式来设置响应头部的键值对。 - 设置重定向:- 使用
redirect(location)
函数将响应重定向到指定的URL。 - 设置Cookie:- 使用
response.set_cookie(name, value, **options)
函数设置一个Cookie。其中,name
和value
是必需的参数,而**options
是可选的参数,用于设置Cookie的属性(如过期时间、域名、路径等)。 - 设置缓存控制:- 使用
@app.after_request
装饰器来设置响应的缓存控制头部信息。例如:@app.after_request
装饰器中可以使用response.cache_control.max_age = 3600
设置响应的最大缓存时间为1小时。
实战之使用上述关于Flask响应相关的功能和方法:
from flask import Flask, make_response
app = Flask(__name__)@app.route('/')defhome():
data ={'message':'Hello, World!','status':'success'}# 创建响应对象
response = make_response(data)# 设置响应状态码为200
response.status_code =200# 设置响应头部信息
response.headers['Content-Type']='application/json'
response.headers['Custom-Header']='Custom Value'# 设置缓存控制
response.cache_control.max_age =3600# 设置Cookie
response.set_cookie('user_id','123456789', max_age=3600)return response
if __name__ =='__main__':
app.run()
通过使用
make_response()
函数,可以构造一个完整的响应对象,并在此基础上进行设置和操作。这使得我们能够更灵活地控制响应的各个方面。
关于
make_response
多讲几嘴:
我们还可以这样使用:
response = make_response(render_template('index.html'))
在上述代码中,
render_template('index.html')
将会渲染名为
index.html
的HTML模板,并返回渲染后的结果。然后,
make_response()
函数将该渲染结果作为参数传递进去,创建一个响应对象。
接下来,将这个响应对象赋值给变量
response
,以便可以对其进行进一步的设置和操作。
通过这种方式,可以生成一个包含渲染后的HTML内容的完整响应对象,然后根据需要进行各种自定义,如设置状态码、添加头部信息、设置缓存控制等。
最后,可以使用
return response
将构造好的响应对象发送给客户端。
总结起来,通过组合使用
make_response()
和
render_template()
,可以方便地生成并自定义带有渲染后的HTML内容的响应。这是处理视图函数中的模板渲染和响应生成的常见模式。
版权归原作者 孤寒者 所有, 如有侵权,请联系我们删除。