• 【Django框架】——22 Django视图 04 HttpRequest对象


    在这里插入图片描述

    在这里插入图片描述


    利⽤ HTTP协议向服务器传参有以下几种途径:

    • 提取URL的特定部分,如/app/zhangsan/18/,可以在服务器端的路由中⽤正则表达式截取;

    • 查询字符串(query string),形如key1=value1&key2=value2

    • 请求体(body)中发送的数据,⽐如表单数据、json、xml

    • http报⽂的头(header)中。

    1.URL路径参数

    如果想从URL中获取值,需要在正则表达式中使⽤分组
    获取值分为两种⽅式

    • 位置参数
      参数的位置不能错

    • 关键字参数
      参数的位置可以变,跟关键字保持⼀致即可

    注意:两种参数的⽅式不要混合使⽤,在⼀个正则表达式中只能使⽤⼀种参数⽅式

    分别使⽤以上两种获取URL值的⽅式提取出20 60 http://127.0.0.1:8000/20/60/

    位置参数

    路由url

    # urls.py
    from django.urls import re_path
    from film import views
    
    
    urlpatterns = [
        re_path('^httprequest/(\w+)/(\d+)/$', views.httpRequestView),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    视图函数

    # views.py
    from django.http import HttpRequest, HttpResponse
    
    # Create your views here.
    
    
    def httpRequestView(request, uname, age):
        return HttpResponse(f'My name is {uname} and I am {age} years old!')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    访问:http://127.0.0.1:8000/httprequest/awei/22/
    在这里插入图片描述

    关键字参数

    url

    # /urls.py
    from django.urls import path, re_path
    from project01 import views
    
    
    urlpatterns = [
        re_path('^people/(?P\w+)/(?P\d+)/$', views.peopleView),
        
        path('people///', views.peopleView),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    视图函数

    from django.http import HttpResponse
    
    
    def peopleView(request, age, name):
        """
        :param request: 
        :param age: 
        :param name: 
        :return: 
        """
        print(name)
        return HttpResponse('My name is %s and I am %s year old!' % (name, age))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    访问:
    在这里插入图片描述

    2. Django中的QueryDict对象

    HttpRequest对象的属性GET、POSTQueryDict类型的对象。

    访问:http://127.0.0.1:8000/people/awei/22/

    在这里插入图片描述

    GET请求

    在这里插入图片描述

    python字典不同,QueryDict类型的对象⽤来处理同⼀个键带有多个值的情况。

    ⽅法get():根据键获取值

    • 如果⼀个键同时拥有多个值将获取最后⼀个值

    • 如果键不存在则返回None值,可以设置默认值进⾏后续 处理

    • get('键',默认值)

    ⽅法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值

    • 如果键不存在则返回空列表[],可以设置默认值进⾏后续处理
    • getlist('键',默认值)

    3. 查询字符串Query String

    获取请求路径中的查询字符串参数(形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象。

    视图函数

    # /get/?uname=awei&age=22&age=18/
    from django.http import HttpResponse
    
    
    def queryView(request):
        uname = request.GET.get('uname')
        age = request.GET.get('age')
        age_list = request.GET.getlist('age')
        
        print(f'uname={uname}')
        print(f'age={age}')
        print(f'age_list={age_list}')
        
        return HttpResponse('QueryDict')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    路由

    urlpatterns = [
        path('query/', views.queryView)
    ]
    
    • 1
    • 2
    • 3

    访问:http://127.0.0.1:8000/query/?uname=awei&age=22&age=18/
    在这里插入图片描述

    重要:查询字符串不区分请求⽅式,即假使客户端进⾏POST⽅式的请求,依然可以通过request.GET获取请求中的查询字符串数据。

    4. 请求体

    请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。

    可以发送请求体数据的请求⽅式有POST、PUT、PATCH、DELETE

    Django默认开启了CSRF防护,会对上述请求⽅式进⾏CSRF防护验证,在测试时可以关闭CSRF防护机制,⽅法为在settings.py⽂件中注释掉CSRF中间件,如:

    4.1 表单类型 Form Data

    前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回
    QueryDict对象。

    def postView(request):
        uname = request.POST.get('uname')
        age = request.POST.get('age')
        alist = request.POST.getlist('uname')
    
        print(f'uname={uname}')
        print(f'age={age}')
        print(f'age_list={alist}')
    
        return HttpResponse('Post 请求')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    在这里插入图片描述

    4.2 ⾮表单类型 Non-Form Data

    ⾮表单类型的请求体数据,Django⽆法⾃动解析,可以通过request.body属性获取最原始的请求体数据,⾃⼰按照请求体格式(JSON、XML等)进⾏解析。

    request.body返回bytes类型。

    例如要获取请求体中的如下JSON数据

    # 注意测试时,key value必须⽤双引号,value为数字时可以不加。
    {"uname": "awei", "age": 22+}
    
    • 1
    • 2

    可以进⾏如下⽅法操作:

    import json
    
    
    def post_json(request):
        json_dict = json.loads(request.body.decode())
        print(req_data['uname'])
        print(req_data['age'])
        return HttpResponse('OK')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5. 请求头

    可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。

    常⻅的请求头如:

    CONTENT_LENGTH– The length of the request body (as a string).
    
    CONTENT_TYPE– The MIME type of the request body.
    
    HTTP_ACCEPT– Acceptable content types for the response.
    
    HTTP_ACCEPT_ENCODING– Acceptable encodings for the response.
    
    HTTP_ACCEPT_LANGUAGE– Acceptable languages for the response.
    
    HTTP_HOST– The HTTP Host header sent by the client.
    
    HTTP_REFERER– The referring page, if any.
    
    HTTP_USER_AGENT– The client’s user-agent string.
    
    QUERY_STRING– The query string, as a single (unparsed) string.
    
    REMOTE_ADDR– The IP address of the client.
    
    REMOTE_HOST– The hostname of the client.
    
    REMOTE_USER– The user authenticated by the Web server, if any.
    
    REQUEST_METHOD– A string such as"GET"or"POST".
    
    SERVER_NAME– The hostname of the server.
    
    SERVER_PORT– The port of the server (as a string).
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    具体使⽤如:

    def get_headers(request):
        print(request.META['CONTENT_TYPE'])
        return HttpResponse('OK')
    
    • 1
    • 2
    • 3

    6. 其他常⽤HttpRequest对象属性

    • method:⼀个字符串,表示请求使⽤的HTTP⽅法,常⽤值包括:'GET''POST'

    • user:请求的⽤户对象。

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

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

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

  • 相关阅读:
    如何在Linux系统下安装Docker
    GJB 128B-2021标准版本变更汇总 ,发布, 下载
    net-java-php-python-宠物销售系统计算机毕业设计程序
    SpringBootAdmin环境搭建与使用
    【halcon特征点专题系列】01/4--Harris角点检测
    linux server设置开机自动连接WIFI
    涨薪40%,从国企到一家小公司
    “就地拼柜”与“海外仓”:跨境电商的黄金组合
    Fast Large-Scale Trajectory Clustering(VLDB2019)
    面试官:设计模式之简单工厂模式
  • 原文地址:https://blog.csdn.net/m0_68744965/article/details/127601571