【问题标题】:Post json to django but get 500 error将 json 发布到 django 但得到 500 错误
【发布时间】:2015-01-27 22:26:52
【问题描述】:

我正在编写一个将 json 发布到 Django 的应用程序,但在终端中出现 500 错误

[27/Jan/2015 20:50:38]“POST /datasave/ds/HTTP/1.1”500 10414

这是我的 jQuery 代码:

$(function() {
$('#upload').click(function() {
    var json_obj = {
        username: $('#username').val(),
        password: $('#password').val(),
        game_id1: '123',
        csrfmiddlewaretoken: '{{ csrf_token}}'
    };

    $.post("http://192.168.0.109:8000/datasave/ds/", JSON.stringify(json_obj), 
        function(data) {
          alert("OK");
        }, 
        "json");
})
})

而 Django 查看代码:

@csrf_exempt
def ds(request):
    dicty = {}
    if request.is_ajax:
        if request.method == 'POST':
            req = json.loads(request.body.decode("utf-8"))
            obj, created = 
                Gamer.objects.update_or_create(
                username=req.get(u'username', None), 
                password=req.get(u'password', None), 
                game_id1=req.get(u'game_id1', None))
            print obj, created
    dicty['username'] = req.get(u'username', None)
    dicty['password'] = req.get(u'password', None)
    dicty['create_at'] = str(timezone.now())
    return JsonResponse(dicty)

【问题讨论】:

  • 您可以调试视图以隔离和修复错误。 Apache / 控制台日志数据可以提供帮助。隔离问题的简单方法:注释代码行并填充虚假数据,直到视图正常,然后逐行取消注释。
  • 您在访问req['game_id1'] 时可能会得到一个KeyError,因为看起来该密钥不存在。
  • 这是一个 KeyError 就像 mattm 和 Simon 说的。非常感谢!

标签: python json django


【解决方案1】:

当您收到 500 内部服务器错误时,您可能会认为您的视图处理程序代码存在问题。很难说到底是什么原因造成的,所以你应该试着弄清楚它为什么会发生。通过查看您的代码,我可以看到可能导致此错误的两件事。

首先您使用dict 作为变量名,这可能是个坏主意,因为dict 是python 中的内置类型。

另一个可能的原因可能是您访问 req 字典的方式。您正在访问密钥 usernamepasswordgame_id1。如果 dict 中缺少这些中的任何一个,它将引发 KeyError 异常。我喜欢使用req.get('username', None) 来访问字典(如果您愿意,可以将None 替换为另一个默认值。解决该问题的另一种方法是尝试/捕获异常处理。

此外,根据您的 Gamer 模型,尝试使用现有用户名(假设您有 unique=True)创建一个可能也会引发异常,因此您也应该处理它(我认为 get_or_create 可能是在这里很方便)。

通常在处理此类问题时,请使用浏览器中的检查器。它可以让您查看在请求期间发送和接收的所有数据,这意味着(如果您在 DEBUG 模式下运行 django)您还可以在检查器中看到默认的堆栈跟踪页面。它应该对导致问题的原因有一些有价值的指示。另一种选择是write a small middlewareenable extended error logging 将错误记录到strout/stderr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2012-04-15
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2014-09-02
    相关资源
    最近更新 更多