python - 为什么django不处理PUT方法带过来的表单
天蓬老师
天蓬老师 2017-04-17 13:11:09
[Python讨论组]

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
PHP中文网

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

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

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

PHPz

最近刚好做了一个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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号