request.POST与request.data
request.POST
在发JSON数据
的时候是取不到值的,只有发urlecoding数据
form-data数据才会有值.
REST已经对
request再次封装了,发送
JSON,
urlecoding,
form-data等常用等常用的数据都封装到
data里了,这样就解决了
request.POST在发
JSON数据`的时候是取不到值的情况
示例:接收POST请求
views.py
class BookView(APIView):
def get(self,request):
book_list=Book.objects.all()
ps=BookSerializers(book_list,many=True)
# 序列化完成的数据
return Response(ps.data)
def post(self,request):
# 添加一条数据
# request.POST 在发JSON数据的时候是取不到值的,只有发urlecoding才会有值
# REST已经对request再次封装了,发送JSON,urlecoding,form-data等常用等常用的数据都封装到data里了,这样就解决了request.POST 在发JSON数据的时候是取不到值的情况
print("data",request.data)
print("POST",request.POST)
return Response("post")
测试urlencoded数据:
image.pngprint结果: data与POST都能收到urlencoded数据
data <QueryDict: {'1': ['2'], '2': ['1']}>
[05/Aug/2018 04:00:21] "POST /books/ HTTP/1.1" 200 6
POST <QueryDict: {'1': ['2'], '2': ['1']}>
测试JSON数据:
image.pngprint结果:POST接收不到JSON数据
data {'1': 2, 'q': 2, 'x': 1}
POST <QueryDict: {}>
[05/Aug/2018 04:08:11] "POST /books/ HTTP/1.1" 200 6
测试form-data数据:
image.pngprint结果: data与POST都能收到form-data数据
data <QueryDict: {'x': ['1'], 'y': ['2']}>
POST <QueryDict: {'x': ['1'], 'y': ['2']}>
[05/Aug/2018 04:10:19] "Ps
看request.data源码分析
Book为例
Django 启动后执行的urls.py最后都会执行的dispatch分发方法那,然后用户访问后在执行dispatch分发方法.
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/$', views.LoginView.as_view()),
url(r'^courses/$', views.CourseView.as_view()),
url(r'^publishes/$', views.PublishView.as_view()),
url(r'^books/$',views.BookView.as_view()),
]
区分request
image.png谁调用as_view
,self
就是谁,从urls.py
中可以看出是我们自己写的视图BookView
调用的as_view
,那self.dispatch
应该先去找自己的和继承的
class BookView(APIView):
def get(self,request):
book_list=Book.objects.all()
ps=BookSerializers(book_list,many=True)
# 序列化完成的数据
return Response(ps.data)
BookView
没有dispatch方法,继续去BookView
继承的是APIView
里边找;找到了
initialize_request
这个方法返回的是一个新的request
对象
data里边的源码不在分析,意思大致是:
- 拿到你这次编码的请求格式
- 根据请求体(media_type)的格式解析数据 # media_type = self.content_type
- 最后调用
request.data
就是解析后的数据是字典格式
网友评论