【问题标题】:Using JSON data in Django view在 Django 视图中使用 JSON 数据
【发布时间】:2013-10-23 17:11:41
【问题描述】:

我正在建立一个评级系统,并且正在努力将 JSON 数据用于我的 Django 视图。最终目标是将评分保存到我的 BlogSiteRating 模型中:

#models.py
class BlogSiteReview(models.Model):
  blog_site = models.ForeignKey(BlogSite)
  review_rating = models.IntegerField()

但是,我还没有完全做到这一点。我遇到了 403 错误,但已通过在 POST 中正确使用 csrf 令牌解决了这些错误。现在我收到从服务器传回的 500 错误,可以在 chrome 控制台中看到。

编辑:终于找到了错误。有 2 个 POST 正在执行。两者都给出 MultiValueDictKeyError 错误

第一个说:“

第二个说:“Key 'rating' not found in ""

这是我传递给我的视图的 JSON。

//JSON object being passed into views.py
$(".rating").jRating({
      onSuccess : function(element,rate){
          var rating = [
            { "id":element.id.replace('rating', ''), "rating":rate}
          ];

          rating["csrfmiddlewaretoken"] = $('input[name=csrfmiddlewaretoken]').val();

          alert("Passed id:" + element.id.replace('rating', '') + " and rating:" + rate);

          //send post data to django view
          $.post('/blogsearch/setrating/', {"rating":rating}, function(msg)
            {
                if(msg.error == "yes")
                {console.log('Error Found: '+ msg.errorMsg);}
            }, 'json');
      },
      onError : function(){
        alert('Error : please retry again later, the server did not accept your submission.');
      }
    });

最后,这是我的views.py:

#views.py
from django.http import HttpResponse
from django.utils import simplejson

def setrating(request):
    if request.is_ajax():
        if request.method == 'POST':
            simplejson.loads(request.POST['rating'])
            #data = 1 #Note: when I uncomment this line, and 
                      #comment the above line, I don't get a 500 error
    return HttpResponse("success")

另外,我知道在这个示例中我并没有尝试在我的模型中保存任何内容。如果我可以在我的视图中获取 JSON 数据,我应该能够从那里毫无问题地保存它。但是,如果您愿意,可以在答案中提供该代码的帮助。


我这几天一直在看帖子,其中一些使我走上这条道路的帖子是:

internal server eroor 500 django when using simplejson.loads(request.raw_post_data)

Getting internal server error when trying to handle json in django

我也尝试过导入 json 而不是 simplejson,我得到了相同的结果。 我也尝试过使用 request.raw_post_data ,但是使用该方法时出现服务器错误。从我读到的内容看来 request.POST['rating'] 是正确的使用方法?

【问题讨论】:

  • 您收到什么错误信息?例如,您可以使用 Chrome 的检查器工具来查看响应。它应该为您提供有关正在发生的错误的一些指示。
  • 同时检查您发布的数据。是 JSON 编码,还是普通的 formdata 编码?
  • 终于找到错误了。它是“" 并且 CONTENT_TYPE 是 'application/x-www-form-urlencoded; charset=UTF-8' 看起来它正在返回 unicode 对象?

标签: jquery django json pythonanywhere


【解决方案1】:

我可以提出一些建议,至少可以帮助我们找出问题所在:

  1. 在您的设置中设置 DEBUG = True,这样您就可以在结果中获得整个回溯,而不仅仅是 500。

  2. 将您在视图中得到的答案发布给我们:print request['POST']

  3. 使用基于您的模型的 ModelForm,并使用 Django 内置的表单验证来帮助您处理数据。

希望对你有帮助。

【讨论】:

  • 我将 DEBUG 设置为 True,但它没有向我显示错误页面 - 我想可能是因为它是 AJAX 请求?我在 Chrome 的控制台日志中看到返回 500 错误。我一直试图通过打印查看数据,但什么也看不到。当我添加该行时,它会出错,我什么也看不到。我也没有在 linux 错误日志中看到任何内容:(你有什么建议可以解决这个问题,以便我们可以看到错误,或者可能是其他地方吗?#3 是有道理的,我会在我之后这样做可以看到视图中的数据。
  • 你应该可以在chrome调试控制台中查看500响应的详细信息——点击ajax错误,看看是否可以查看响应...
  • 好的,我现在有一些答案了。我收到的错误消息是“异常类型:/blogsearch/setrating/Exception Value 的 TypeError:'WSGIRequest' 对象没有属性 'getitem'”我在打印请求时收到此错误消息 [' POST'],但我可以看到帖子数据包含 action u'rating' rate u'11' idBox u'7'
【解决方案2】:

知道了 - 有 2 个问题。

首先,在 JS 中,我注意到有 2 个 POST 正在执行。我其实不需要写任何 JS,JRating 自己执行 POST,并将其发送到我在插件设置中设置的变量。

另一个问题(更重要的一个)在views.py 中。我期待一个名为“rating”的变量,因为这是我在 JS 中设置的。实际上,我需要分别获取每个变量,而其中一个 POST 调用甚至没有使用 rating 变量。

def setrating(request):
    if request.is_ajax():
        if request.method == 'POST':
            rating = json.loads(request.POST['rate'])
            id = json.loads(request.POST['idBox'])
    return HttpResponse("the rating for " + str(id) + " is " + str(rating))

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 2018-04-24
    • 2015-11-25
    • 2010-11-05
    • 1970-01-01
    • 2011-09-17
    • 2011-11-14
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多