我正在编写一个应用程序将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)
答案 0 :(得分:1)
当您收到500内部服务器错误时,可能会认为您的视图处理程序代码存在问题。很难说它究竟是什么造成的,所以你应该试着弄清楚它为什么会发生。通过查看代码,我可以看到两个可能导致此错误的事情。
首先你使用dict
作为变量名,这可能是一个坏主意,因为dict
是python中的内置类型。
另一个可能的原因可能是您访问req
词典的方式。您正在访问密钥username
,password
和game_id1
。如果dict中缺少任何这些,则会抛出KeyError
异常。我喜欢使用req.get('username', None)
来访问dicts(如果您愿意,可以将None
替换为另一个默认值。解决该问题的另一种方法是尝试/捕获异常处理。
此外,根据您的Gamer模型,尝试使用现有用户名创建(假设您有unique=True
)也可能会抛出异常,所以您也应该处理它(我认为{{3这里可能很方便)。
通常在处理此类问题时,请在浏览器中使用检查器。它允许您查看请求期间发送和接收的所有数据,这意味着(如果您在DEBUG
模式下运行django),您还可以在检查器中查看默认堆栈跟踪页面。它应该对导致问题的原因持有一些有价值的指示。另一种选择是get_or_create
或write a small middleware将错误记录到strout
/ stderr
。