返回顶部
首页 > 资讯 > 后端开发 > 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://lsjlt.com/news/304541.html(转载时请注明来源链接)

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

猜你喜欢
  • 怎么理解Python Django请求和响应对象
    本篇内容主要讲解“怎么理解Python Django请求和响应对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Python Django请求和响应对象”吧!Django请求和响应对象D...
    99+
    2023-06-25
  • Python Django请求和响应对象详解
    目录Django请求和响应对象HttpRequest对象HttpRequest常用属性中间件设置的属性QueryDict对象QueryDict方法HttpResponse对象Http...
    99+
    2024-04-02
  • Django 中间件:理解请求和响应生命周期
    Django 中间件是一种功能强大的工具,可用于在请求和响应的生命周期中自定义行为。通过编写自己的中间件,可以添加额外的功能,如身份验证、授权、请求验证和响应修改。本文将深入探讨 Django 中间件,了解其工作原理以及如何利用它来增强 ...
    99+
    2024-02-15
    Django 中间件 请求 响应 生命周期
  • django rest framework之请求与响应(详解)
    前言:在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每一个URL代表着一个资源。当然我们还知道RESTful API的另一个特性就是,发送不同的请求动...
    99+
    2022-06-04
    详解 django rest
  • 如何使用PHP和Django响应JavaScript的请求?
    在现代的Web开发中,JavaScript已经成为了不可或缺的一部分。它可以让网站变得更加动态和交互性,但是在实现这些功能时,我们常常需要与后端服务器进行交互。本文将介绍如何使用PHP和Django响应JavaScript的请求,让我们一...
    99+
    2023-10-05
    django 响应 javascript
  • Python中的HTTP请求和对象:如何应对大规模数据?
    Python中的HTTP请求和对象:如何应对大规模数据? Python是一种高效且易于使用的编程语言,它被广泛应用于数据处理、Web开发、机器学习和人工智能等领域。在这些领域中,HTTP请求和对象是Python中最常用的对象之一。HTTP请...
    99+
    2023-10-21
    http 大数据 对象
  • hbase中put请求响应慢怎么解决
    HBase中put请求响应慢可能由多种原因引起,以下是一些可能的解决方法: 调整HBase集群的性能参数,如增加RegionSer...
    99+
    2024-04-02
  • SpringBoot详解各类请求和响应的处理方法
    目录1. HttpServletRequest与HttpServletResponse2. GET类型的请求2.1 /studentscurrent=1&limit=202....
    99+
    2024-04-02
  • Python Flask 请求数据获取响应详解
    目录一,请求数据及其获取        1.1请求相关数据1.2固定参数与转换器1.3查询参数获取1....
    99+
    2024-04-02
  • HTTP 请求和响应的全过程详解。
    HTTP(Hypertext Transfer Protocol)是在客户端和服务器之间传输数据的协议。在这篇文章中,我们将详细介绍 HTTP 请求和响应的全过程,包括请求的构成、传输过程、响应的构成以及状态码的含义。同时,为了更好地理解,...
    99+
    2023-08-31
    bash numy http
  • Flask中的请求上下文和应用上下文对象如何理解
    这篇文章将为大家详细讲解有关Flask中的请求上下文和应用上下文对象如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在Flask中处理请求时,应用会生成一个“请求上下文”对象。整个请求...
    99+
    2023-06-17
  • 如何在C++中处理Web请求和响应?
    使用 cpproxy 库处理 web 请求和响应的步骤如下:安装 cpproxy 库。创建 http 服务器对象并设置端口和地址。为特定请求路径设置处理程序。在处理程序中,创建响应对象,...
    99+
    2024-05-11
    web请求 web响应 c++
  • Retrofit网络请求和响应处理重点分析讲解
    目录响应处理在上一篇文章中,我们详细分析了 Retrofit 中的注解解析和动态代理实现,本篇文章将继续深入研究 Retrofit 的核心源码,重点分析 Retrofit 如何进行网...
    99+
    2023-03-10
    Retrofit网络请求和响应处理 Retrofit网络请求 Retrofit响应处理
  • 如何在 PHP 和 Django 中处理并发请求,提高接口响应速度?
    在现代 Web 开发中,我们经常需要处理大量的并发请求,以提供高效的服务,同时满足用户的需求。如何在 PHP 和 Django 中处理并发请求,提高接口响应速度,是一个值得探讨的话题。 PHP 是一种流行的服务器端编程语言,而 Djang...
    99+
    2023-06-13
    django 并发 接口
  • Python发送Post请求及解析响应结果
    一、Post请求 1、使用python发送一个Post请求 有时候遇到请求url中有很多参数。 1.1 示例1 accounts和pwd请到http://shop-xo.hctestedu.com/注...
    99+
    2023-08-31
    python php 开发语言
  • 了解Go语言中的对象和HTTP请求
    Go语言是一门现代化的编程语言,近年来备受关注。其优秀的性能和简单易用的语法让它成为了不少开发者的首选。在Go语言中,对象和HTTP请求是两个非常重要的概念,下面我们将深入探讨它们。 一、了解Go语言中的对象 在Go语言中,对象是指由数据和...
    99+
    2023-10-14
    对象 http git
  • Retrofit网络请求和响应处理源码分析
    本篇内容主要讲解“Retrofit网络请求和响应处理源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Retrofit网络请求和响应处理源码分析”吧!网络请求在使用 Retrofit 发起网...
    99+
    2023-07-05
  • Netty4之怎么实现HTTP请求、响应
    本文小编为大家详细介绍“Netty4之怎么实现HTTP请求、响应”,内容详细,步骤清晰,细节处理妥当,希望这篇“Netty4之怎么实现HTTP请求、响应”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.Netty...
    99+
    2023-07-05
  • Python类和对象怎么应用
    对象 = 属性 + 方法我们前面其实已经接触过封装的概念,把乱七八糟的数据扔进列表里面,这是一种封装,是数据层面的封装;把常用的代码段打包成一个函数,这也是一种封装,是语句层面的封装;现在我们要学习的对象,也是一种封装的思想, 对象的来源是...
    99+
    2023-05-14
    Python
  • Python中如何优化HTTP请求和大数据对象的处理?
    Python是一种广泛使用的编程语言,它支持各种网络协议和数据处理。在网络开发和数据处理中,HTTP请求和大数据对象的处理是非常常见的问题。本文将介绍一些Python中的优化技巧,以便更高效地处理HTTP请求和大数据对象。 一、HTTP请求...
    99+
    2023-10-21
    http 大数据 对象
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作