django中的HTTP视图接受请求的过程和request对象的调用
在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")