0


(十)Flask请求和响应

请求和响应

一、请求相关(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

的使用:

  1. 如果应用程序部署在根目录下(例如 http://example.com/),则request.script_root的值将为空字符串。
  2. 如果应用程序部署在子目录下(例如 http://example.com/myapp/),则request.script_root的值将为 /myapp
  3. 对于带有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, `` 

https://example.com/app/``

.
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的相关属性。

  1. request.base_url表示当前请求的基本URL。它包括协议、域名、端口和路径,但不包括查询参数。例如,http://example.com/app/
  2. request.url_root是当前请求的URL根路径。它由协议、域名和可选的端口组成,不包括路径和查询参数。例如,http://example.com/
  3. request.host_url是当前请求的主机URL。它包含协议、域名和可选的端口,但不包括路径和查询参数。例如,https://example.com/
  4. 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响应相关的功能和方法:

  1. 返回字符串:- 使用return语句返回一个字符串即可。Flask会自动将其包装成一个响应对象并发送给客户端。
  2. 返回JSON数据:- 使用return jsonify(data)函数将Python字典或列表转换为JSON格式,并返回一个包含JSON数据的响应对象【注意需要从flask中导入jsonify】。- 或者使用return json.dumps(data)手动将数据转换为JSON字符串,并设置content_type='application/json'
  3. 返回模板渲染结果:- 使用Flask提供的模板引擎(如Jinja2)渲染HTML模板,然后返回渲染结果。可以使用render_template(template_name, **context)函数进行模板渲染,其中template_name是模板文件名,context是传递给模板的上下文变量(后面在讲jinjia2的时候会讲)。
  4. 设置响应状态码:- 在视图函数中可以使用return response, status_code的形式来设置响应的状态码。例如:return 'OK', 200表示返回200状态码。- 或者使用make_response()函数创建一个响应对象,然后设置其status_code属性。
  5. 设置响应头部:- 可以使用response.headers[key] = value方式来设置响应头部的键值对。
  6. 设置重定向:- 使用redirect(location)函数将响应重定向到指定的URL。
  7. 设置Cookie:- 使用response.set_cookie(name, value, **options)函数设置一个Cookie。其中,namevalue是必需的参数,而**options是可选的参数,用于设置Cookie的属性(如过期时间、域名、路径等)。
  8. 设置缓存控制:- 使用@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内容的响应。这是处理视图函数中的模板渲染和响应生成的常见模式。

标签: flask python 后端

本文转载自: https://blog.csdn.net/qq_44907926/article/details/134368198
版权归原作者 孤寒者 所有, 如有侵权,请联系我们删除。

“(十)Flask请求和响应”的评论:

还没有评论