广告
返回顶部
首页 > 资讯 > 后端开发 > Python >怎么理解Python Django请求和响应对象
  • 768
分享到

怎么理解Python Django请求和响应对象

2023-06-25 12:06:30 768人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容主要讲解“怎么理解python Django请求和响应对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Python DjanGo请求和响应对象”吧!Django请求和响应对象D

本篇内容主要讲解“怎么理解python Django请求和响应对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Python DjanGo请求和响应对象”吧!

Django请求和响应对象

Django 使用请求和响应对象在系统中传递状态。

当一个页面被请求时,Django 会创建一个 HttpRequest 对象,这个对象包含了请求的元数据。然后,Django 加载相应的视图,将 HttpRequest 作为视图函数的第一个参数。每个视图负责返回一个 HttpResponse 对象。

HttpRequest对象

下面介绍HttpRequest对象常用的属性和方法。

HttpRequest常用属性

1.HttpRequest.body

原始的 HTTP 请求体作为一个字节字符串。这对于以不同方式处理非常规 html 表单的数据很有用:二进制图像,XML 有效负载等。对于处理传统的表单数据,使用 HttpRequest.POST

2.HttpRequest.method

代表请求中使用的 HTTP 方法的字符串,一定是大写字母。

3.HttpRequest.GET

一个类似字典的对象,包含所有给定的 HTTP GET 参数。

4.HttpRequest.POST

一个类似字典的对象,包含所有给定的 HTTP POST 参数,前提是请求包含表单数据。如果你需要访问请求中发布的原始或非表单数据,可以通过 HttpRequest.body 属性来访问。

以上的4个属性是我们最常用的HttpRequest属性。结合实际,我们可能写出的代码如下:

if request.method == "POST":        # POST请求方法    try:        data = JSON.loads(request.body)     # 获取POST请求携带的非表单数据(jsON数据)    except json.JSONDecodeError:        return JsonResponse({"status": "1", "msg": "数据格式错误"})    # 表单数据    # keys = request.POST.get("keys")       # 如果POST携带的是表单数据,可以这样获取。elif request.method == "GET":    keys = request.GET.get("keys")      # 获取get请求携带的参数    return JsonResponse({"status": "0", "msg": "请求成功"})else:    return JsonResponse({"status": "0", "msg": "请求方法错误"})

5.HttpRequest.COOKIES

一个包含所有 cookies 的字典。键和值是字符串。

6.HttpRequest.FILES

一个类似字典的对象,包含所有上传的文件。FILES 中的每个键是<input type="file" name=""> 中的 name。FILES 中的每个值是一个 UploadedFile。

FILES 只有在请求方法是 POST,并且发布请求的<fORM>有 enctype=“multipart/form-data” 的情况下,才会包含数据。否则,FILES 将是一个类似字典的空白对象。

7.HttpRequest.META

一个包含所有可用的 HTTP 头文件的字典。可用的头信息取决于客户端和服务器。一些可能的例子如下:

CONTENT_LENGTH —— 请求体的长度(字符串)。

CONTENT_TYPE —— 请求体的 MIME 类型。

HTTP_ACCEPT —— 可接受的响应内容类型。

HTTP_ACCEPT_ENcoding —— 可接受的响应编码。

HTTP_ACCEPT_LANGUAGE —— 可接受的响应语言。

HTTP_HOST —— 客户端发送的 HTTP 主机头。

HTTP_REFERER —— referrer 页面,如果有的话。

HTTP_USER_AGENT —— 客户端的用户代理字符串。

QUERY_STRING —— 查询字符串,是一个单一的(未解析的)字符串。

REMOTE_ADDR —— 客户机的 IP 地址。

REMOTE_HOST —— 客户机的主机名。

REMOTE_USER —— WEB 服务器认证的用户,如果有的话。

REQUEST_METHOD —— “GET” 或 “POST” 等字符串。

SERVER_NAME —— 服务器的主机名。

SERVER_PORT —— 服务器的端口(字符串)。

请求中的任何 HTTP 头都会被转换为 META 键,方法是将所有字符转换为大写字母,用下划线代替任何连字符,并在名称前加上 HTTP_` 前缀。例如,请求头里的X-CSRFToken在META中变为HTTP_X_CSRFTOKEN.

中间件设置的属性

Django 的 contrib 应用中包含的一些中间件会在请求中设置属性。

1.HttpRequest.session

来自 SessionMiddleware。一个可读可写的,类似字典的对象,代表当前会话。

2.HttpRequest.user

从 AuthenticationMiddleware。AUTH_USER_MODEL 的一个实例,代表当前登录的用户。如果用户当前没有登录,user 将被设置为一个 AnonymousUser 的实例。你可以用 is_authenticated 来区分它们,例如:

if request.user.is_authenticated:    ... # Do something for logged-in users.else:    ... # Do something for anonymous users.

如果使用Nginx+uWsgi的方式部署Django项目,那么META中的REMOTE_ADDR,REMOTE_HOST等不正确的,因为通过Nginx代理转发到uWsgi监听的端口,这时候应用程序获取的客户端信息就是127.0.0.1的本机信息,而不是真实客户端的信息。因此,需要在Nginx中添加如下参数:

uwsgi_param  Host $host;uwsgi_param  X-Real-IP $remote_addr;uwsgi_param  X-Forwarded-For $proxy_add_x_forwarded_for;uwsgi_param  X-Forwarded-Proto $http_x_forwarded_proto;

至于你需要的到底是X-Real-IP还是X-Forwarded-For,取决于你的业务逻辑。

QueryDict对象

在一个 HttpRequest 对象中, GET 和 POST 属性是 django.http.QueryDict 的实例,这是一个类似字典的类,用来处理同一个键的多个值。这是很有必要的,因为一些 HTML 表单元素,尤其是<select multiple>,会传递同一个键的多个值。

在 request.POST 和 request.GET 中的 QueryDict 将在正常的请求/响应周期中被访问时是不可改变的。要得到一个可变的版本,你需要使用 QueryDict.copy()。

QueryDict方法

QueryDict是字典的子类,因此字典有的标准方法,QueryDict都具备。

1.QueryDict.get(key, default=None)

 如果键不存在,则用钩子返回一个默认值。如果键有多个值,则会获取到最后一个值。

2.QueryDict.getlist(key, default=None)

 返回带有请求键的数据列表。如果键不存在且 default 是 None,则返回一个空列表。除非提供的默认值不是一个列表,否则返回一个列表。

下面是一段代码,展示了get和getlist的使用。

>>> qd = QueryDict('a=1&a=2&a=3&b=4')  # 构造QueryDict对象qd>>> qd.get('a')         # 获取键a的最后一个值'3'>>> qd.getlist('a')     # 获取键a的所有值['1', '2', '3']>>> qd<QueryDict: {'a': ['1', '2', '3'], 'b': ['4']}>>>> qd.getlist('c')[]>>> qd.getlist('c', [1,2])[1, 2]>>> qd.get('c', '5')'5'

HttpResponse对象

Django会自动创建HttpRequest(wsgi或者asgi创建)对象, HttpResponse则是后端开发人员负责实例化、填充和返回。每一个视图函数都必须返回一个HttpResponse对象。

HttpResponse类位于django.http模块中。

HttpResponse对象用法

典型的用法是将页面的内容以字符串、字节字符串或 memoryview 的形式传递给 HttpResponse 构造函数。例如:

>>> from django.http import HttpResponse>>> response = HttpResponse("Hello World!")

这样,在函数结束的时候return response前端就能拿到响应数据了。

但如果你想增量添加内容,你可以使用 response 作为一个类似文件的对象:

>>> response = HttpResponse()>>> response.write("<p>Here's the text of the Web page.</p>")>>> response.write("<p>Here's another paragraph.</p>")

在前后端分离的大趋势下,我们机会很少使用后端去渲染页面。后端通常都是返回JSON数据。

传入迭代器

你可以传递 HttpResponse 一个迭代器而不是字符串。HttpResponse 将立即消耗迭代器,将其内容存储为一个字符串,然后丢弃它。带有 close() 方法的对象,如文件和生成器,会立即关闭。如果你需要将响应从迭代器流式传输到客户端,你必须使用 StreamingHttpResponse 类来代替。

这种操作在普通场景下没什么问题,但是如果文件或者图片很多,并且很大,通常我们使用一个独立的静态文件服务器来解决问题,而不是由Django来处理这些东西

** 告诉浏览器将响应作为文件附件处理 **

>>> response = HttpResponse(my_data, headers={...     'Content-Type': 'application/vnd.ms-excel',...     'Content-Disposition': 'attachment; filename="foo.xls"',... })

Content-Disposition 头并没有什么 Django 特有的内容,但是很容易忘记语法,所以我们把它包含在这里。

HttpResponse对象属性

1.HttpResponse.charset

表示响应将被编码的字符集的字符串。如果在 HttpResponse 实例化时没有给出,将从 content_type 中提取,如果不成功,将使用 DEFAULT_CHARSET(如果没有设置,默认为utf-8)设置。

2.HttpResponse.status_code

HttpResponse对象的 HTTP 状态码。

除非 reason_phrase 被明确设置,否则在构造函数外修改 status_code 的值也会修改 reason_phrase 的值。

HttpResponse对象方法

HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)

设置一个 cookie。参数与 Python 标准库中的 Morsel cookie 对象相同。

max_age should be an integer number of seconds, or None (default) if the cookie should last only as long as the client's browser session. If expires is not specified, it will be calculated.

expires 应是格式为 “Wdy, DD-Mon-YY HH:MM:SS GMT” 的字符串,或者是 UTC 的 datetime.datetime 对象。如果 expires 是一个 datetime 对象,将计算 max_age。

max_age在不远的将来会取代expires。

如果你想设置一个跨域的 cookie,请使用 domain。例如,domain=“example.com” 将设置一个可被 www.example.com、blog.example.com 等域读取的 cookie。否则,一个 cookie 将只能被设置它的域读取。

如果你想让 cookie 只在使用 https 方案进行请求时才发送给服务器,请使用 secure=True。

如果你想防止客户端的 javascript 访问 cookie,请使用 httponly=True。

HttpOnly 是包含在 Set-Cookie HTTP 响应头中的一个标志。它是 RFC 6265 标准中 Cookie 的一部分,可以作为一种有用的方式来降低客户端脚本访问受保护 Cookie 数据的风险。

使用 samesite=‘Strict' 或 samesite=‘Lax' 来告诉浏览器在执行跨源请求时不要发送这个 cookie。SameSite 并不是所有浏览器都支持,所以它并不能替代 Django 的 CSRF 保护,而是一种深度防御措施。

使用 samesite='‘None' (字符串)来明确说明这个 cookie 会随着所有的同站和跨站请求而发送。

Changed in Django 3.1:

允许使用 samesite='None (字符串)。

HttpResponse.delete_cookie(key, path='/', domain=None, samesite=None)

删除给定键的 cookie。如果键不存在,则静默失败。

由于 cookie 的工作方式,path 和 domain 应该与你在 set_cookie() 中使用的值相同,否则 cookie 可能不会被删除。

HttpResponse子类

HttpResponse子类可以直接参考Django文档,对于现在而言,最常用的莫过于JsonResponse子类。在此,会专门介绍JsonResponse子类的。

JsonResponse对象

class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)

一个 HttpResponse 子类,帮助创建一个 JSON 编码的响应。它继承了它的超类的大部分行为,但有一些不同:

其默认的 Content-Type 头设置为 application/json。

第一个参数 data 应该是 dict 实例。如果 safe 参数设置为 False (见下文),它可以是任何 JSON 可序列化的对象。

encoder,默认为 django.core.serializers.json.DjangoJSONEncoder,将用于序列化数据。

safe 布尔参数默认为 True。如果它被设置为 False,任何对象都可以被传递到序列化中(否则只允许 dict 实例)。如果 safe 为 True,而第一个参数是一个非 dict 对象,则会引发一个 TypeError。

json_dumps_params 参数是一个关键字参数的字典,用来传递给 json.dumps() 调用,用于生成响应。可以用来指定编码。

到此,相信大家对“怎么理解Python Django请求和响应对象”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么理解Python Django请求和响应对象

本文链接: https://www.lsjlt.com/news/304541.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么理解Python Django请求和响应对象
    本篇内容主要讲解“怎么理解Python Django请求和响应对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Python Django请求和响应对象”吧!Django请求和响应对象D...
    99+
    2023-06-25
  • Python Django请求和响应对象详解
    目录Django请求和响应对象HttpRequest对象HttpRequest常用属性中间件设置的属性QueryDict对象QueryDict方法HttpResponse对象Http...
    99+
    2022-11-12
  • Python中的HTTP请求和对象:如何应对大规模数据?
    Python中的HTTP请求和对象:如何应对大规模数据? Python是一种高效且易于使用的编程语言,它被广泛应用于数据处理、Web开发、机器学习和人工智能等领域。在这些领域中,HTTP请求和对象是Python中最常用的对象之一。HTTP请...
    99+
    2023-10-21
    http 大数据 对象
  • Flask中的请求上下文和应用上下文对象如何理解
    这篇文章将为大家详细讲解有关Flask中的请求上下文和应用上下文对象如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在Flask中处理请求时,应用会生成一个“请求上下文”对象。整个请求...
    99+
    2023-06-17
  • SpringBoot详解各类请求和响应的处理方法
    目录1. HttpServletRequest与HttpServletResponse2. GET类型的请求2.1 /studentscurrent=1&limit=202....
    99+
    2022-11-13
  • 如何在 PHP 和 Django 中处理并发请求,提高接口响应速度?
    在现代 Web 开发中,我们经常需要处理大量的并发请求,以提供高效的服务,同时满足用户的需求。如何在 PHP 和 Django 中处理并发请求,提高接口响应速度,是一个值得探讨的话题。 PHP 是一种流行的服务器端编程语言,而 Djang...
    99+
    2023-06-13
    django 并发 接口
  • Retrofit网络请求和响应处理重点分析讲解
    目录响应处理在上一篇文章中,我们详细分析了 Retrofit 中的注解解析和动态代理实现,本篇文章将继续深入研究 Retrofit 的核心源码,重点分析 Retrofit 如何进行网...
    99+
    2023-03-10
    Retrofit网络请求和响应处理 Retrofit网络请求 Retrofit响应处理
  • Python中如何优化HTTP请求和大数据对象的处理?
    Python是一种广泛使用的编程语言,它支持各种网络协议和数据处理。在网络开发和数据处理中,HTTP请求和大数据对象的处理是非常常见的问题。本文将介绍一些Python中的优化技巧,以便更高效地处理HTTP请求和大数据对象。 一、HTTP请求...
    99+
    2023-10-21
    http 大数据 对象
  • Python类和对象怎么应用
    对象 = 属性 + 方法我们前面其实已经接触过封装的概念,把乱七八糟的数据扔进列表里面,这是一种封装,是数据层面的封装;把常用的代码段打包成一个函数,这也是一种封装,是语句层面的封装;现在我们要学习的对象,也是一种封装的思想, 对象的来源是...
    99+
    2023-05-14
    Python
  • SpringMvc请求处理参数 和 响应数据处理的示例详解
    目录1、请求处理参数1.1 请求参数 @RequestParam1.1.1 不使用 @RequestParam 注解1.1.3 使用 @RequestParam 注解1.2 请求头参...
    99+
    2022-11-13
  • 怎么理解Python内置对象
    这篇文章主要介绍“怎么理解Python内置对象”,在日常操作中,相信很多人在怎么理解Python内置对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Python内置对象”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-16
  • feign GET请求不支持对象传参的坑怎么解决
    这篇“feign GET请求不支持对象传参的坑怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“feign&n...
    99+
    2023-06-29
  • Python中的HTTP请求和大数据对象:最佳实践是什么?
    Python中的HTTP请求和大数据对象:最佳实践是什么? Python是一种优秀的编程语言,拥有着强大的数据处理和网络请求能力。在处理大数据对象和进行HTTP请求时,Python也有着非常出色的表现。本文将介绍Python中的HTTP请求...
    99+
    2023-10-21
    http 大数据 对象
  • 怎么理解Python中一切皆对象
    本篇内容介绍了“怎么理解Python中一切皆对象”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!数据类型作为对象所有数据类型,如数字、字符串、...
    99+
    2023-06-16
  • Hibernate和模型对象怎么理解
    这篇文章主要讲解了“Hibernate和模型对象怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate和模型对象怎么理解”吧!学习Hibernate时,经常会遇到一些小问题...
    99+
    2023-06-17
  • Linq数据和对象怎么理解
    这篇文章主要讲解了“Linq数据和对象怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linq数据和对象怎么理解”吧!大家知道在开发数据时,数据一般是关系型数据,然而数据和对象是什么关...
    99+
    2023-06-17
  • 对Python循环对象的理解是怎么样的
    对Python循环对象的理解是怎么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x...
    99+
    2023-06-02
  • 怎么解决RestTemplate第一次请求响应速度较慢的问题
    本篇内容主要讲解“怎么解决RestTemplate第一次请求响应速度较慢的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决RestTemplate第一次请求响应速度较慢的问题”吧!Re...
    99+
    2023-06-25
  • 理解 Python 对象响应框架的工作原理:这是您需要知道的。
    Python 对象响应框架(Object-Response Framework)是 Python 中一个非常重要的概念。它的主要作用是让 Python 对象能够响应事件和消息,从而使得程序更加灵活和可扩展。本文将深入探讨 Python 对象...
    99+
    2023-10-03
    对象 响应 框架
  • 怎么理解C++中的类和对象
    怎么理解C++中的类和对象,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。c++类的由来(或者说为什么要增加类):我们知道c语言是面向过程的语言,c++是即面向过...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作