玩蛇网提供最新Python编程技术信息以及Python资源下载!

这段python 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的表单不符合标准么?

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

玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd19595.html

相关文章 Recommend

玩蛇网Python互助QQ群,欢迎加入-->: 106381465 玩蛇网Python新手群
修订日期:2017年05月19日 - 17时33分59秒 发布自玩蛇网

您现在的位置: 玩蛇网首页 > Python问题解答 > 正文内容
我要分享到:

必知PYTHON教程 Must Know PYTHON Tutorials

必知PYTHON模块 Must Know PYTHON Modules