django请求与响应

目录

一、请求Request

利用HTTP协议向服务器传参有几种途径

Django中的QueryDict对象

1> GET属性获取查询字符串Query String 参数

2> POST属性 获取请求体参数

3> META属性 获取请求头数据

4> 其他常用HttpRequest对象属性

二、响应Response

1> HttpResponse

3> JsonResponse


一、请求Request

  • 利用HTTP协议向服务器传参有几种途径
    • 路径传参: 提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取参数;
    • 查询字符串传参: 查询字符串(query string),形如key1=value1&key2=value2;
    • 请求体传参:请求体(body)中发送的数据,比如表单数据、json、xml;
    • 请求头传参:在http报文的请求头(header)中传参。
  • Django中的QueryDict对象
    • QueryDict对象介绍

      QueryDict定义在django.http.QueryDict中; HttpRequest对象的属性GET、POST都是QueryDict类型的对象;与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况.
    • get() 方法

      根据键获取值, 如果一个键同时拥有多个值将获取最后一个值; 如果键不存在则返回None值,可以设置默认值进行后续处理

      dict.get('键',默认值)
      # 可简写为
      dict['键']
    • getlist() 方法

      根据键获取值,值以列表返回,可以获取指定键的所有值; 如果键不存在则返回空列表[],可以设置默认值进行后续处理

      dict.getlist('键',默认值)
  • 1> GET属性获取查询字符串Query String 参数
    • GET属性说明

          获取请求路径中的查询字符串参数(形如 ?k1=v1&k2=v2 ),可以通过request.GET属性获取,返回QueryDict对象。
      注意: 查询字符串不区分请求方式,即使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。
    • 主路由
      
      # 获取查询字符串路由
      path('qs/', views.query_string),
      视图
      
      
      
      
      
      from django.http import HttpResponse
      from django.views.decorators.csrf import csrf_exempt
      ​
      ​
      # 免除csrf校验
      @csrf_exempt
      def query_string(request):
          # 获取键对应的最后一个值
          a = request.GET.get('a')
          b = request.GET.get('b')
          # 获取键对应的所有值
          a_list = request.GET.getlist('a')
      ​
          print(f"a = {a}")
          print(f"b = {b}")
          print(f"a_list = {a_list}")
      ​
          return HttpResponse('query_string OK')

    • API测试 Apipost软件下载:

      # 测试平台 ApiPost7
      GET请求  http://127.0.0.1:8080/qs/?a=1&b=3&a=10
      POST请求  http://127.0.0.1:8080/qs/?a=1&b=3&a=10

  • 2> POST属性 获取请求体参数
        请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,也可以是XML字符串; 应区别对待。
    支持发送 请求体数据 的请求方式有: POST、PUT、PATCH、DELETE。
    ​Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制; 
    关闭方法: 
    1. 在 settings.py 配置文件 MIDDLEWARE 参数项中注释掉CSRF中间件CsrfViewMiddleware 全局生效
    2. 为视图函数单独添加 csrf_exempt装饰器 进行CSRF豁免 
    • 表单类型 Form Data

      前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象。
      注意: request.POST只能用来获取POST方式的请求体表单数据。
      说明: 请求头中 Content-Type 为multipart/form-data(多媒体表单) 或者 application/x-www-form-urlencoded(简单表单) 即为表单类型请求 
    • 主路由

        # 获取表单数据路由
        path('form/', views.get_form),

    • templates 模板文件夹中创建模版文件 form.html

        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>用户信息收集表</title>
        </head>
        <body>
            <form action="/form/" method="post" enctype="multipart/form-data">
                <p>
                    用户名: <input type="text" name="user"> <br>
                </p>
                <p>
                    密&emsp;码: <input type="password" name="pwd"> <br>
                </p>
                <p>
                    爱&emsp;好:
                    <input type="checkbox" name="hobby" value="game"> 游戏
                    <input type="checkbox" name="hobby" value="study"> 学习
                </p>
                <p>
                    文件上传: <input type="file" name="file1">
                </p>
                <p>
                    <input type="submit" value="提交">
                </p>
        
            </form>
        </body>
        </html>

    • 视图

      import os
        
        from django.http import HttpResponse
        from django.shortcuts import render
        from django.views.decorators.csrf import csrf_exempt
        # 导入配置对象
        from django.conf import settings
        
        @csrf_exempt
        def get_form(request):
            # 处理get请求 返回表单页面
            if request.method == "GET":
                return render(request, "form.html")
        
            # 处理post请求 接收表单数据
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            hobby = request.POST.getlist("hobby")
            upload_file = request.FILES.get("file1")
        
            print(f"user: {user}")
            print(f"pwd: {pwd}")
            print(f"hobby: {hobby}")
        
            if upload_file:
                file_save_path = os.path.join(settings.MEDIA_ROOT, upload_file.name)
                with open(file_save_path, "wb") as wf:
                    # 分块写入文件数据
                    for chunk in upload_file.chunks():
                        wf.write(chunk)
        
            return HttpResponse('get_form OK')

      配置文件 settings.py

      • MEDIA_ROOT = os.path.join(BASE_DIR, 'upload_media')

        测试

      • # 获取表单页面
        GET  http://127.0.0.1:8080/form/
        # 填写表单并提交表单数据, 查看接收数据和文件

    • 非表单类型 Non-Form Data

      非表单类型的请求体数据Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体数据格式(JSON、XML等)进行解析。(注意:request.body返回bytes类型。)
      例如: 要获取请求体中的如下JSON格式数据可以按如下步骤提取数据: 
      {"a": 1, "b": 2}
      • 主路由

        # 获取非表单数据路由
        path('nonForm/', views.get_non_form),

      • 视图

        import json
        ​
        @csrf_exempt
        def get_non_form(request):
            json_str = request.body
            # python3.6 及以上版本无需执行解码操作,json.loads可以直接处理二进制数据
            json_str = json_str.decode()  
            req_data = json.loads(json_str)
        ​
            print(f"req_data = {req_data}")
            print(f"a = {req_data['a']}")
            print(f"b = {req_data['b']}")
        ​
            return HttpResponse('get_non_form OK')

        测试

      • # 测试平台 ApiPost7
        # 提交非表单数据(这里测试json数据)
        POST  http://127.0.0.1:8080/nonForm/
  • 3> META属性 获取请求头数据
    可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。
    • 常见的请求头如:

      • CONTENT_LENGTH – 请求体长度.
      • CONTENT_TYPE – 内容的数据类型。同附加信息的查询一起使用,如 HTTP 查询 GET、 POST 和 PUT.
      • HTTP_ACCEPT – 浏览器支持的 MIME 类型.
      • HTTP_ACCEPT_ENCODING – 浏览器支持的压缩编码.
      • HTTP_ACCEPT_LANGUAGE – 浏览器支持的语言.
      • HTTP_HOST – 服务器端IP及端口.
      • HTTP_REFERER – 用于告知服务器是从哪个页面链接过来的.
      • HTTP_USER_AGENT – 使用的用户代理 域名.
      • QUERY_STRING – 查询解析输入并在运算符周围分割文本.
      • REMOTE_ADDR – 客户端IP.
      • REMOTE_HOST – 发出请求的主机名称。如果服务器无此信息,它将设置为空的 MOTE_ADDR 变量.
      • REMOTE_USER – 服务器认证后的用户.
      • REQUEST_METHOD – 该方法用于提出请求。相当于用于 HTTP 的 GET、HEAD、POST 等等.
      • SERVER_NAME – 出现在自引用 UAL 中的服务器主机名、DNS 化名或 IP 地址.
      • SERVER_PORT – 发送请求的端口号.
    • 具体使用:

      • 主路由

        # 获取请求头数据路由
        path('header/', views.get_request_header),

      • 视图

        @csrf_exempt
        def get_request_header(request):
            meta = request.META
            print(f"请求体长度: {meta['CONTENT_LENGTH']}")
            print(f"服务器端IP及端口: {meta['HTTP_HOST']}")
            print(f"内容的数据类型: {meta['CONTENT_TYPE']}")
        ​
            print("\nHttpRequest的其他对象属性:")
            print(f"请求方法: {request.method}")
            print(f"用户对象: {request.user}")
            print(f"完整路径: {request.path}")
            print(f"提交的数据的编码方式: {request.encoding}")
            print(f"coolies: {request.COOKIES}")
            print(f"session: {request.session}")
            print(f"是否为ajax请求: {request.is_ajax()}")
        ​
            return HttpResponse('get_request_header OK')
      • 测试

        # 测试平台 ApiPost7
        GET  http://127.0.0.1:8080/header/
        POST  http://127.0.0.1:8080/header/
  • 4> 其他常用HttpRequest对象属性
    • method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。

    • user :请求的用户对象。

    • path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。

    • get_full_path(): 获取请求的页面的完整路径,不包含域名但是包含查询参数部分。

    • encoding:一个字符串,表示提交的数据的编码方式。

      • 如果为None则表示使用浏览器的默认设置,一般为utf-8。
      • 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
    • GET: 一个类似于字典的对象,包含get请求方式的所有参数

    • POST: 一个类似于字典的对象,包含post请求方式的所有参数

    • FILES:一个类似于字典的对象,包含所有的上传文件。

    • COOKIES: 一个标准的Python字典,包含所有的cookie,键和值都为字符串

    • session: 一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django启用会话的支持时才可用

    • is_ajax( ): 如果请求是通过XMLHttpRequest发起的,则返回True

    • resolver_match: 当前路由匹配成功的路由对象(url_name属性可以得到当前匹配到的路由名)

二、响应Response

 

视图在接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。

  • 1> HttpResponse
    • 可以使用 django.http.HttpResponse 来构造响应对象。

      HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
    • 也可通过 HttpResponse 对象属性来设置响应体、状态码:

      • content:表示返回的内容。
      • status_code:返回的HTTP响应状态码。
      • charset :表示response采用的编码字符集,字符串类型
    • 可以直接将HttpResponse对象当做字典,使用键值对赋值的方式设置响应头信息:

      response = HttpResponse()
      # 自定义响应头 Platform, 值为xx
      response['Platform'] = 'xx'
    • 使用示例:

      • 主路由

        # 设置响应路由
        
        path('response/', views.set_response),

      • 视图

        @csrf_exempt
        def set_response(request):
            # 通过 HttpResponse 构造响应对象
            # return HttpResponse(content='xxxx', status=200)
            
            # 通过 HttpResponse 对象属性设置响应体、状态码、响应头
            response = HttpResponse()
            response.content = 'xxxx'
            response.status_code = 200
            response['Platform'] = 'xx
            return response

      • 测试

        # 测试平台 ApiPost7
        POST  http://127.0.0.1:8080/response/2> HttpResponse 的子类
    • Django提供了一系列HttpResponse的子类,可以快速设置状态码

      • HttpResponseRedirect 301
      • HttpResponsePermanentRedirect 302
      • HttpResponseNotModified 304
      • HttpResponseBadRequest 400
      • HttpResponseNotFound 404
      • HttpResponseForbidden 403
      • HttpResponseNotAllowed 405
      • HttpResponseGone 410
      • HttpResponseServerError 500
  • 3> JsonResponse
    • 若要返回json数据,可以使用JsonResponse来构造响应对象,作用:

      • 帮助我们将数据转换为json字符串

      • 设置响应头Content-Typeapplication/json

        from django.http import JsonResponse
        ​
        def demo_view(request):
            return JsonResponse({'城市': 'beijing', 'subject': 'python'}, json_dumps_params={'ensure_ascii': False})

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

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

相关文章

Spring Validation数据校检

文章目录 Spring Validation1 关于Spring Validation2 使用流程3 快速入门4 运行异常处理4.1 说明4.2 处理异常4.3 明确提示消息 5 常用注解5.1 NotNull注解5.2 NotEmpty 注解5.3 NotBlank 注解5.4 Size 注解5.5 Range 注解 6 非POJO参数校验6.1 使用流程6.2 使用示例 Spring V…

2024数据库国测揭晓:安全与可靠的新标准,你了解多少?

2024年数据库国测的结果&#xff0c;于9月份的最后一天发布了。 对于数据库行业的从业者来说&#xff0c;国测是我们绕不过去的坎儿。那么什么是国测&#xff1f;为什么要通过国测&#xff0c;以及国测的要求有哪些&#xff1f; 这篇文章带大家一探究竟。 国测 自愿平等、客…

前端入门一之CSS知识详解

前言 CSS是前端三件套之一&#xff0c;在MarkDown中也完美兼容这些语法&#xff1b;这篇文章是本人大一学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。 文章目录 Emmet语法&#xff1a;CSS基本语法&#xff1a;css语法结构只有3种&#xff1a…

虚拟现实和增强现实技术,如何打造沉浸式体验?

内容概要 在这个科技飞速发展的时代&#xff0c;虚拟现实&#xff08;VR&#xff09;与增强现实&#xff08;AR&#xff09;技术的结合就像调皮的小精灵&#xff0c;一下子把我们的生活变得神奇又有趣。想象一下&#xff0c;你正在游戏中与精灵搏斗&#xff0c;突然间身边的客…

EL面包屑导航实现

前言 el-breadcrumb 是 Element Plus 中的面包屑导航组件&#xff0c;主要用于展示当前页面在整个应用程序中的位置&#xff0c;并提供导航功能 https://element-plus.org/zh-CN/component/breadcrumb 基础用法 在 el-breadcrumb 中使用 el-breadcrumb-item 标签表示从首页开…

Qt 练习做一个登录界面

练习做一个登录界面 效果 UI图 UI代码 <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Dialog</class><widget class"QDialog" name"Dialog"><property name"ge…

c语言简单编程练习10

1、typedef和#define的区别 在用作数据类型替换时的区别&#xff1a; #include <stdio.h> #include <unistd.h>typedef char * A; //typedef需要&#xff1b; #define B char *int main(int argc, char *argv[]) {A a,b;B c,d;printf("a_size%ld\n"…

【spark的集群模式搭建】Standalone集群模式的搭建(简单明了的安装教程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接4、配置spark环境变量5、修改 spark-env.sh配置文件6、启动hdfs&#xff0c;创建文件夹7、修改spark-defaults.conf配置文件8、修改workers配置文件9、修改log4j.properties配置文件&#xff08;可选&…

ST-GCN模型实现花样滑冰动作分类

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

【RabbitMQ】03-交换机

1. 交换机 2. Fanout交换机 广播。生产者向exchange发消息 SpringBootTest public class SpringAmqpTest {Autowiredpublic RabbitTemplate rabbitTemplate;Testvoid testSimple() {String exchangName "hmall.fabout";rabbitTemplate.convertAndSend(exchangName…

【07】Maven项目多环境打包配置

&#xff08;1&#xff09;Web项目使用Maven进行多模块划分开发之后&#xff0c;面临一个问题&#xff0c;即如何加载不同环境的配置文件打包发布到不同的环境中&#xff1f; &#xff08;2&#xff09;不同的环境有开发环境、测试环境、线上生产环境等。 &#xff08;3&#x…

【Unity Shader】Special Effects(十)Change 变换(UI)

源码:[点我获取源码] 索引 Change 变换思路分析变换进度噪声纹理闪烁闪烁时机闪烁颜色闪烁动画Change 变换 变换的效果为图像间的切换带来动感过程,使用动画播放器: 思路分析 首先,从原始图像变换到目标图像是一个从0到1的过程,这个过程我们命名为变换进度(0为完全显…

关于wordpress instagram feed 插件 (现更名为Smash Balloon Social Photo Feed)

插件地址&#xff1a; Smash Balloon Social Photo Feed – Easy Social Feeds Plugin – WordPress 插件 | WordPress.org China 简体中文 安装后&#xff0c;配置教程&#xff1a; Setting up the Instagram Feed Pro WordPress Plugin - Smash Balloon 从这里面开始看就…

JavaScript的对象事件处理程序

一、对象的事件 对象的事件是指在一个对象上发生的特定动作或状态改变。对象可以是现实世界中的物体、概念、数据结构等。根据对象的类型和功能&#xff0c;可能会有不同类型的事件。 对象的事件一般由对象的方法或属性来处理和触发。通过定义对象的方法和属性&#xff0c;可…

Win11 CLion Qt开发探索

文章目录 一、Win11 CLion Qt需要的环境二、环境说明三、Win11 CLion Qt 开发步骤四、CLion Qt CMake脚本相关配置4.1 在CLion里如何使用资源文件.qrc4.2 Qt6 cmake如何添加ts翻译文件 五、程序打包 本篇博客介绍在Win11上使用CLion来编写Qt QWidget项目。 视频讲解&#xff1a…

Windows Server2012 R2搭建NFS服务器

正文共&#xff1a;1024 字 23 图&#xff0c;预估阅读时间&#xff1a;1 分钟 在测试vCenter的集群操作时&#xff0c;出现了共享vSAN错误的问题&#xff0c;导致无法继续。我也只好先创建一个共享NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;存储…

信息安全工程师(77)常见网络安全应急事件场景与处理流程

前言 网络安全应急事件场景多样&#xff0c;处理流程也需根据具体情况灵活调整。以下将详述几种常见的网络安全应急事件场景及其处理流程。 一、数据泄露事件 场景描述&#xff1a; 数据泄露是指敏感、受保护或机密数据被未经授权的个人复制、传输、查看、窃取或使用。这种事件…

win10下MMSegmentation自定义数据集

下载1.2.1版本: Releases open-mmlab/mmsegmentation GitHub 安装环境 本地torch环境为1.9.1 pip install -U openmim mim install mmengine mim install "mmcv>=2.0.0" 报mmcv版本不匹配的问题,形如:MMCV==X.X.X is used but incompatible. Please inst…

低代码解锁跨平台应用开发新境界

数字化转型中&#xff0c;企业面临应用开发挑战&#xff0c;低代码平台成为理想选择。ZohoCreator提供统一开发环境、拖拽设计、预置模板等&#xff0c;支持高效构建跨平台应用&#xff0c;确保数据安全与合规&#xff0c;助力企业数字化转型。 一、低代码平台是什么&#xff1…

yolov8涨点系列之C2f模块改进主分支

文章目录 C2F 模块介绍定义与基本原理应用场景 C2f模块修改步骤(1) C2f_up模块编辑(2)在__init_.pyblock.py中声明&#xff08;3&#xff09;在task.py中声明yolov8引入C2f_up模块yolov8.yamlyolov8.yaml引入C2f_up模块 C2f改进对YOLOv8检测具有多方面的好处 C2F 模块介绍 定义…