django中的HTTP视图接受请求的过程和request对象的调用

视图接收http请求

在http请求和响应过程中, 用户往往会在请求过程中发送请求信息给服务端.
1. 查询字符串[Query String]
   所谓的查询字符串就是url地址上面?号后面的数据,例如:
   http://127.0.0.1:8000/index?name=xiaoming&pwd=123456
   上面name=xiaoming&pwd=123456就是查询字符串
   可以通过 request.GET 来获取,注意: GET不是http请求,也就是说,只要地址上有查询字符串,都可以获取

获取查询字符串的参数

request.GET  //<QueryDict: {'name': ['xiapming'], 'mobile': ['13312345678']}>获取到的是通过request得到的客户端请求数据,基本都是会保存成QueryDict类字典给视图的
获取参数的一个值,或者第一个值
request.GET.get("name") // 因为QueryDict是一个伪字典对象,所以可以通过get或者中括号获取到数据
request.GET["name"])
request.GET.getlist("lve") // # ['swimming', 'shopping', 'game']获取多个值
request.GET['lve'] // # 如果字典的值是个列表多个值时,使用[""]字典方式获取多个值值时,后面的值覆盖了前面的值
request.POST  //获取请求体数据,返回数据结果是QueryDict,只能过去表单数据
request.body //获取请求体数据,返回的事二进制字节流,可以接受Json原生数据和其他格式的数据

request.META//获取请求头数据
request.FILES //获取上传文件 返回<MultiValueDict>字典对象

HTTP协议:

  请求首行:

    请求方式、url路径、HTTP协议版本

  请求头:

    常见的请求头有:

    Content-Type:文本的数据类型

    User-Agent:产生请求的浏览器类型

    Host:发送请求的主机名

    Accept:返回的数据格式

    Server、Cookie等等。

  请求体:

常见的请求方式get、post、put、delete

获取请求行视图代码:

"""查询字符串[Query String]"""
def index3(request):
    print(request.GET)
    """
    访问地址: 
        http://127.0.0.1:8000/home/index3
    打印效果:
        <QueryDict: {}>
        
    分析: 通过request得到的客户端请求数据,基本都是会保存成QueryDict类字典给视图的,上面是空字典
          QueryDict的声明位置: from django.http import QueryDict
          QueryDict的父类继承的就是dict字典,所以字典提供的方法或者操作, QueryDict都有
    """
    """
    访问地址:
         http://127.0.0.1:8000/home/index3?name=xiapming&mobile=13312345678
    打印效果:
         <QueryDict: {'name': ['xiapming'], 'mobile': ['13312345678']}>
    分析:
        这次就获取到了name和mobile参数以及参数的值
        注意:
            因为客户端传递过来的参数有可能多个值的情况,所以查询字符串返回的数据值都是列表格式
    """
    """
    访问地址:
         http://127.0.0.1:8000/home/index3?name=xiapming&mobile=13312345678&lve=swimming&lve=shopping&lve=game
    打印效果:
        <QueryDict: {'name': ['xiapming'], 'mobile': ['13312345678'], 'lve': ['swimming', 'shopping', 'game']}>
    分析:
        因为lve有多个值的存在, 所以值就是列表中有3个成员
    """

    """获取QueryDict对象中的参数值"""
    # 获取参数的一个值,或者第一个值
    # 因为QueryDict是一个伪字典对象,所以可以通过get或者中括号获取到数据
    # print(request.GET.get("name"))
    # print(request.GET["name"])

    # 获取参数的所有值
    print(request.GET.getlist("lve")) # ['swimming', 'shopping', 'game']
    print(request.GET['lve']) # game,后面的值覆盖了前面的值

路由代码:

from django.urls import path

from . import views
urlpatterns = [
    path("index", views.index ),
    path("index2", views.index2 ),
    path("index3", views.index3 ),
]

获取请求体数据的试图代码:

def index4(request):
    """获取请求体数据,返回数据结果是QueryDict"""
    print(request.POST)
    """
    打印效果:
    <QueryDict: {'name': ['root'], 'password': ['123456']}>
    
    """

    print(request.body) #  b'{\n\t"title": "\xe5\x9c\xa3\xe8\xaf\x9e\xe6\xa0\x91",\n    "username":"\xe5\x9c\xa3\xe8\xaf\x9e\xe8\x80\x81\xe5\xa4\xb4",\n    "age": 1200\n}'
    """
    打印效果:
    b'{\n\t"title": "\xe5\x9c\xa3\xe8\xaf\x9e\xe6\xa0\x91",\n    "username":"\xe5\x9c\xa3\xe8\xaf\x9e\xe8\x80\x81\xe5\xa4\xb4",\n    "age": 1200\n}'
    """
    import json
    ret = json.loads(request.body)
    print(ret) # {'title': '圣诞树', 'username': '圣诞老头', 'age': 1200}

    return HttpResponse("ok")

django中的request.POST只能取到Content-Type(请求头)为application/x-www-form-urlencoded(form表单默认格式)的数据,如果请求头为application/json(json格式),multipart/form-data(文件)等格式无法取到,只有在request.body里面能取到原生的数据。当发送过来的是JSON数据是,request.POST取到的数据是空的,这时只有用request.body取,再反序列化才能使用。

 

获取请求体数据的路由代码:

 

from django.urls import path

from . import views
urlpatterns = [
path("index", views.index ),
path("index2", views.index2 ),
path("index3", views.index3 ),
path("index4", views.index4 ),
]

 

获取请求头数据:

def index4(request):
    """获取请求头信息"""
    print( request.META.get("CONTENT_TYPE") ) # application/json
    """获取自定义请求头"""
    print( request.META.get("HTTP_COMPANY")) # oldboyedu

    return HttpResponse("ok")

 

posted @ 2021-07-03 21:27  Fleeting__Time  阅读(281)  评论(0编辑  收藏  举报