django rest framework中的request
REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。因为前后端分离的项目,[在drf中可以通过request._request拿到原生的django的http请求对象],drf的request有一个内置的parser解析器,可以接受客户端传来的各种数据,但是如果想用drf的request,就需要继承drf专有的APIView,APIView继承的是django里的View。
from rest_framework.views import APIView
class UserAPIView(APIView):
def get(self, request):
print(request)
# drf的request : <rest_framework.request.Request: GET '/user/test'>
print(request._request)
# django的httprequest : <WSGIRequest: GET '/user/test'>
return HttpResponse("ok")
从django rest framework的request中取值
第一种: request.data
request.data 返回解析之后的请求体数据。类似于Django中标准的request.POST和 request.FILES属性,但提供如下特性:
- 包含了解析之后的文件和非文件数据
- 包含了对POST、PUT、PATCH请求方式解析后的数据
- 利用了REST framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据
- 相当于drf的request.data替代了 django的request.POST,request.FILES,request.body,但是不能替代request.GET
# post请求,例如: 在postman的form—data中上传 'user':'ybc' 'age':22 'file':'123.jpg'
request.data ---> <QueryDict: {'name':['ybc'], 'age':[17], 'file':[<InMemoryUploadedFile:123.jpg (image/jpeg)>]}>
request.data直接获取的到文件类型的,不用像django中一样request.FILE了
第二种: request.query_params
request.GET可以被request.query_params替代(delete方法也可以这样取值)
# 127.0.0.1:8000/user/test?name=ybc&love=girl&lovegame&love=code # 这里面拼接了三个love
request.query_params ----->
<QueryDict:{'user:['ybc'], 'love':['girl','game','code']}>
# 想拿到里面的值就和request.GET.get()一样,用.get():
request.query_params.get('user') -----> 'ybc'
request.query_params.get('love') -----> 'girl'
# 但是get只能拿到列表里的最后一个值,想全拿到要用getlist
request.query_params.getlist('love') -----> ['girl','game','code']
request.query_params.getlist('love')[0] -----> 'girl'
django rest framework中的response
- django(View)中可以使用JsonResponse, HttpResponse, 但是不能使用Response
- drf(APIView)中都可以使用,但是大多数情况下使用Response,这个Response里面封装了模板,可以展示出来一个模板界面,而不是空白页上只有数据的那种
Response可以接到并操作
response = Response('ok',status=200,)
# 设置cookie
response.set_cookie('username', 'ybc')
# 设置响应头,有时候前端会要通过响应头来操作,就可以自定义添加响应头,但是很少用到
response['company'] = 'Oldboy'