dojo /请求PUT方法dosn工作

时间:2015-03-22 15:44:46

标签: javascript python django dojo

我有一个使用Python Django和Dojo框架的Web应用程序。 我想从Dojo(使用dojo /请求)向服务器Django发送PUT请求,但是当服务器收到请求时,其中的数据为空并验证无效。 但是当我将方法从PUT更改为POST时,它正常工作。

这是我的代码:

_save: function(data){
        var idForm = "editForm" + this.id;
        var value = dijit.byId(idForm).get('value');
        console.log(value);
        request.put("/api/guestbook/"+this.bookName+"/greeting/"+this.id+"/", {
            data: {
                book_name: this.bookName,
                message: value.message
            },
            headers: { "X-CSRFToken": _cookie('csrftoken') }
        }).then(lang.hitch(this, function(text){

        }));
    },

在Django中:

def put(self, request, *args, **kwargs):
    form = self.get_form(self.form_class)
    logging.warning(form)
    logging.warning(request.PUT)
    if form.is_valid():
        logging.warning("This form is VALID")
    else:
        logging.warning("This form is INVALID!!!")

任何人都可以帮助我吗? 谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

我找到了接收PUT方法的方法:

def put(self, request, *args, **kwargs):
    request.PUT = QueryDict(request.body)
    form = self.form_class(request.PUT)
    if form.is_valid():
        logging.warning("This form is VALID")
    else:
        logging.warning("This form is INVALID")

没关系:)

全部谢谢!

答案 1 :(得分:1)

我猜你的X-CSRFToken标题是你在做跨域请求,即CORS

如果您查看浏览器的控制台,您可能会看到OPTIONS请求被发送到服务器。这称为“预检请求”,您的服务器需要使用CORS标头进行响应,告诉浏览器可以进行跨域PUT请求。

在您的情况下,您希望服务器使用类似于:

的标头进行响应
Access-Control-Allow-Origin: http://your-site-hostname-and-port
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-CSRFToken

简单的POST请求不需要预检OPTIONS请求,这可能就是它的工作原理。关于html5rocks here的一个非常好的教程。