这段python django源码不处理PUT方法带表单什么原因,pythondjango,做项目的时候纠结了一下,


做项目的时候纠结了一下,找到django.http.request里面看了一下,发现199行写着:

def _load_post_and_files(self):        """Populate self._post and self._files if the content-type is a form type"""        if self.method != 'POST':            self._post, self._files = QueryDict('', encoding=self._encoding), MultiValueDict()            return

这意味着只有POST才有request.POST这个表单信息。否则都是空的。。我只能自己hack了一下。。
为什么Django不打算处理PUT的表单信息呢?
我试了一下http://httpbin.org/put的接口,好像它就会处理。。。
难道PUT的表单不符合标准么?

Django是基于页面表单处理的框架

Web页面表单的form只支持GET和POST:参考
只有POST方法可以传递文件,所以Django进行了那样的处理

PUT方法一般用于RESTful风格的接口中,Django目前没有太好的支持

最近刚好做了一个Django+React的Todo程序,也遇到了同样的问题,我的代码如下,供你参考:

from django.views import Viewfrom django.http import JsonResponse, QueryDictfrom django.utils import timezonefrom .models import Todoclass TodoView(View):    def post(self, request):        form = request.POST        todo = Todo(content = form['content'], time = timezone.now())        todo.save()        resp = JsonResponse({'result' : 'success'})        resp['Access-Control-Allow-Origin'] = '*'        return resp    def get(self, request):        todos = Todo.objects.all()        resp = JsonResponse({'result' : 'success', 'todos' : [todo.toJSON() for todo in todos]})        resp['Access-Control-Allow-Origin'] = '*'        return respclass TodoItemView(View):    def delete(self, request, todo_id):        todo = Todo.objects.get(id = todo_id)        todo.delete()        resp = JsonResponse({'result' : 'success'})        resp['Access-Control-Allow-Origin'] = '*'        return resp    def put(self, request, todo_id):        todo = Todo.objects.get(id = todo_id)        put = QueryDict(request.body, encoding=request.encoding)        todo.status = put.get('status')        todo.save()        resp = JsonResponse({'result' : 'success'})        resp['Access-Control-Allow-Origin'] = '*'        return resp            def get(self, request, todo_id):        todo = Todo.objects.get(id = todo_id)        resp = JsonResponse({'result' : 'success', 'todo' : todo.toJSON()})        return resp    def options(self, request, todo_id):        todo = Todo.objects.get(id = todo_id)        resp = JsonResponse({'result' : 'success'})        resp['Access-Control-Allow-Origin'] = '*'        resp['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS'        return resp

编橙之家文章,

评论关闭