(十)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'])
def upload_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'])
def home():
    if request.is_json:
        json_data = request.json
        return f"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.argsrequest.form的方法,用于获取指定键的值。

具体来说,get()方法接受三个参数:

  • key:要获取值的键。
  • default(可选):如果指定的键不存在,则返回该默认值。默认值为None
  • type(可选):如果指定,将尝试将值转换为指定的类型。

实战讲解:

from flask import Flask, request

app = Flask(__name__)


@app.route('/')
def home():
    name = request.args.get('name', default='Guest')
    age = request.form.get('age', type=int)

    return f"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.argsrequest.form字典,但不能直接用于request.cookiesrequest.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('/')
def home():
    ingredients = request.args.getlist('ingredient')

    return f"Selected Ingredients: {ingredients}"


if __name__ == '__main__':
    app.run()

当访问根路径 / 时,Flask将会调用 home 视图函数,并使用getlist()方法从request.args中获取名为ingredient的所有参数的值,并将其存储在一个列表中。然后,将这些值用于生成选中的配料列表。

需要注意的是,getlist()方法只能用于request.args字典,不能直接用于其他字典(如request.formrequest.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')
def search():
    keyword = request.values.get('keyword')  # 获取指定参数的值

    return f"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('/')
def home():
    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('/')
def home():
    url = request.url
    return f"Current URL: {url}"


if __name__ == '__main__':
    app.run()

当访问根路径 / 时,Flask将会调用 home 视图函数,并使用request.url获取当前请求的完整URL。然后可以将该URL展示给用户或进行其他操作。

需要注意的是,request.url返回的是一个只读属性,不能直接对其进行修改。如果需要修改URL的某些部分,可以使用url_rootpathquery_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('/')
def home():
    base_url = request.base_url
    url_root = request.url_root
    host_url = request.host_url
    host = request.host

    return f"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('/')
def home():
    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内容的响应。这是处理视图函数中的模板渲染和响应生成的常见模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/137917.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Recap教程】autodesk recap软件的安装、认识与使用

一、autodesk recap概述 1. recap介绍 Autodesk Recap是一款由Autodesk公司推出的三维扫描软件,它能够转换多种数据源(如点云、激光雷达、照片)为可视的三维模型。该软件的使用使得用户可以更容易地生成高质量、完整的三维模型。Autodesk Recap通常用于建筑、土木工程、汽…

将VS工程转为Qt的pro工程及VS安装Qt插件后没有create basic .pro file菜单问题解决

目录 1. 前言 2. VS工程转为pro工程 3. 没有create basic .pro file菜单 1. 前言 很多小伙伴包括本人,如果是在Windows下开发Qt程序,偏好用Visual Studio外加装个Qt插件进行Qt开发,毕竟Visual Studio确实是功能强大的IDE,但有时…

谷歌黑客(google hacking)

免责声明 由于传播、利用本公众号CSJH网络安全团队所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号CSJH网络安全团队及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知&#xff0c…

【藏经阁一起读】(76)__《“DNS+”发展白皮书》

【藏经阁一起读】(76)__《“DNS”发展白皮书》 作者: 梁卓 宋林健 陈剑 刘志辉 刘保君 郭丰 马晨迪 马永 孙俊哲 沈建伟 嵇叶楠 孙宛月 张建光 李贤达 张晓军 赵华 发布时间:2023-10-31 章节数:6 一、基础知识 1.1、…

SOLIDWORKS实用技巧之焊件轮廓应用

1.焊件轮廓库官方下载入口 焊件轮廓可以自制,也可以从软件中在线下载获取直接使用,如图1,联网状态按ctrl左键点击下载,解压后获得库文件。 图1 图2 2.库放置的位置和配置 从SOLIDWORKS2014版起,软件焊件轮廓库支持可…

AI毕业设计生成器(基于AI大模型技术开发)

这是一个辅助生成计算机毕业设计的工具,可以自动完成毕业设计的源码。它基于几百个github上面开源的java和python项目,运用tengsorflow技术,训练出了AI大模型。基本实现了计算机毕业设计生成器,能够初步生成Java或python基本源码。…

Xilinx Artix7-100T低端FPGA解码MIPI视频,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优缺点4、详细设计方案设计原理框图OV5640及其配置权电阻硬件方案MIPI CSI-2 RX SubsystemSensor Demosaic图像格式转换Gammer LUT伽马校正VDMA图像缓存AXI4-Stream toVideo OutHDMI输出 5、…

RT-DETR算法改进:超多种主干网络改进,包括CNN和Transformer多种核心网络结构

💡本篇内容:RT-DETR算法改进:超全集成超多种Loss损失函数,包括WIoU、SIoU、XIoU、EfficiLoss、EIoU、DIoU、CIoU、α-IoU多种损失函数 💡本博客 改进源代码改进 适用于 RT-DETR目标检测算法(ultralytics项目版本) 按步骤操作运行改进后的代码即可🚀🚀🚀 💡…

桌面图标设置-将“我的电脑”、“控制面板”添加到桌面

桌面图标设置 1、将“我的电脑”、“控制面板”添加到桌面 桌面鼠标右键-个性化-主题-桌面图标设置-勾选”计算机“、”回收站“、”控制面板“-应用-确定-桌面鼠标右键-排序-名称

移动端扫描APP解决方案(一)——使用传统图像处理方法提取与矫正拍照文档边缘

一、概述 1.拍照扫描应用 在日常办公中,使用手机拍照扫描文件是一种高效、环保的方式。通过手机扫描,可以将纸质文件转化为电子版,不仅减少了纸张的使用,还节省了时间和精力。扫描后的电子版文件可以方便地储存和管理&#xff0…

在Vue.js中,什么是mixins?它们的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

QML14、Qt之Q_PROPERTY宏理解

在初学Qt的过程中,时不时地要通过F2快捷键来查看QT类的定义,发现类定义中有许多Q_PROPERTY的东西,比如最常用的QWidget的类定义: Qt中的Q_PROPERTY宏在Qt中是很常用的,那么它有什么作用呢? Qt提供了一个绝妙的属性系统,Q_PROPERTY()是一个宏,用来在一个类中声明一个属…

谈谈前端如何防止数据泄露

shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 最近突然发现了一个好玩的事情,部分网站进去的时候几乎都是死的,那种死是区别于我们常见…

【Hadoop】MapReduce详解

🦄 个人主页——🎐开着拖拉机回家_大数据运维-CSDN博客 🎐✨🍁 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁&#x1f…

数据结构 | 栈的实现

数据结构 | 栈的实现 文章目录 数据结构 | 栈的实现栈的概念及结构栈的实现 需要实现的函数初始化栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空销毁栈Stack.c 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素…

AI的尽头是解决屎山代码

众所周知,Copilot 被认为是比 ChatGPT 更深谙程序员心思的工具。在今天凌晨的 GitHub Universe 2023 大会上,GitHub 公布了 Copilot 的最新消息,这一神器旨在解放程序员的双手,AI 将彻底改变开发者的编程方式。 在本次盛会上&…

数据结构:并查集(概念,代码实现,并查操作优化)

目录 1.表示集合关系2.并查集的代码实现1.基本操作:查2.基本操作:并 3.并查集的优化1.并(Union)操作的优化2.Find操作的优化(压缩路径) 1.表示集合关系 用互不相交的树,表示多个集合。 ①查:查找…

AI应用新时代的起点,亚马逊云科技加速大模型应用

大语言模型 何为大语言模型,可以一句话概括:深度学习是机器学习的分支,大语言模型是深度学习的分支。 机器学习是人工智能(AI)的一个分支领域,核心是让计算机系统从数据中学习以提高性能。与直接编程不同…

【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 进程程序替换 1. 前言2. exec…

【仿真动画】双机器人协作完成一个任务(切割)

场景 动画 两个机器人协同工作完成一个任务需要解决以下几个关键问题: 通信:两个机器人需要能够相互通信,以共享信息,例如位置、姿态、状态等。规划:需要对两个机器人的运动轨迹进行规划,确保两个机器人不会…
最新文章