为什么django不处理PUT方法带过来的表单

做项目的时候纠结了一下,找到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的表单不符合标准么?

阅读 9k
2 个回答

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

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

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

新手上路,请多包涵

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

from django.views import View
from django.http import JsonResponse, QueryDict
from django.utils import timezone

from .models import Todo

class 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 resp

class 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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题