Django Ajax 的 HTTP 500 错误
我正在尝试用Django配合AJAX调用,但遇到了HTTP 500错误,提示MultiValueDictKeyError,明明没有什么问题。
我发送了三个变量:sendEmail、username和error。
我能通过request.POST获取这三个变量,得到的结果是:
sendEmail = True
username = someUserName
error = Login
但是,网页却返回了HTTP 500的错误。
这是我的View.py文件:
def loginUser(request):
username = ""
type = ""
logger = logging.getLogger('views.logger.login')
try:
username = request.POST['username'];
logger.info("User:" + username + " in Login Page")
except MultiValueDictKeyError:
logger.info("Cannot Identify User")
try:
type = request.POST['submit']
logger.info("User:" + username + " requests:" + type)
except MultiValueDictKeyError:
logger.info("Cannot Identify User's Request")
if(type=="Login"):
try:
username = request.POST['username']
password = request.POST['password']
logger.info("UserName:" + username + " is trying to login")
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
logger.info("User is active, and logged in")
return redirect('index.html')
else:
logger.info("User is not active, and will not be logged in")
return redirect('disabled.html')
else:
logger.info("User:" + username + " is not valid");
context = {'Status': "Please sign in", 'Error': "Invalid", 'username':username}
return render(request, 'webapp/login.html', context)
except MultiValueDictKeyError:
logger.info("The user have missing forms")
context = {'Status': "Please sign in", 'Error': "Null"}
return render(request, 'webapp/login.html', context)
except Exception as e:
context = {'Status': "Please sign in", 'Error': "Null"}
return render(request, 'webapp/register.html', context)
logger.error("Error occured in Registering user");
logger.error("Error:" + str(e.args))
elif(type == "Register"):
logger.info("Redirecting user to Register Page")
return redirect('/webapp/register.html')
else:
logger.info("Startup Login Page");
context = {'Status': "Please sign in", 'Error': "Null"}
return render(request, 'webapp/login.html', context)
def ajax_sendMail(request):
logger = logging.getLogger('views.logger.sendEmail')
sendEmail = request.POST['email']
username = request.POST['username']
error = request.POST['error']
logger.info("Sending email to admins, sendEmail:" + sendEmail + ", username:" + username + ", error:" + error)
if(sendEmail == "true"):
mail_admins("User:" + username + " failed to " + error, "The time of error is at:" + datetime.datetime.now())
return HttpResponse("Success in Sending Email")
这是login.html文件:
<!DOCTYPE html>
<html>
<head>
<!-- Load css -->
{% load staticfiles %}
<link rel="stylesheet" href="{% static 'WebApp/bootstrap-3.2.0-dist/css/bootstrap.min.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'WebApp/login.css' %}"/>
<title> WebStats Login </title>
</head>
<body>
<!-- Load javascripts -->
{% load staticfiles %}
<script type="text/javascript" src="{% static 'WebApp/jquery-2.1.1.min.js' %}"></script>
<script type="text/javascript" src="{% static 'WebApp/login.js' %}"></script>
<script type="text/javascript" src="{% static 'WebApp/bootstrap-3.2.0-dist/js/bootstrap.min.js' %}"></script>
<!-- Variables that we pass to javascript -->
<script type="text/javascript">
var errorMessage = "{{ Error }}";
var username = "{{ username }}";
</script>
<!-- Inputs and Buttons -->
<div class="container">
<form class="form-signin" role="form" action="{% url 'WebApp:login'%}" method="post">
{% csrf_token %}
<h2 class="form-signin-heading">{{ Status }}</h2>
<input type="username" id="username" name="username" class="form-control" placeholder="User Name" autofocus>
<input type="password" id="password" name="password" class="form-control" placeholder="Password">
<label class="checkbox">
<input type="checkbox" value="remember-me"> Remember me
</label>
<button class="btn btn-lg btn-primary btn-block" type="submit" value="Login" name="submit" id="login">Sign in</button>
<button class="btn btn-lg btn-primary btn-block" type="submit" value="Register" name="submit" id="register">Register</button>
</form>
</div>
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
<h4 class="modal-title" id="myModalLabel">Error during Sign In</h4>
</div>
<div class="modal-body">
<p> Possible Reasons: </p>
<ol>
<li> Wrong Username or Password </li>
<li> User does not exist </li>
<li> Login Server is down </li>
<li> Account is Disabled </li>
<li> Check your internet cable </li>
<li> Programming error done by the Tool Owner </li>
<br>
<form>
<button type="button" id="sendErrorEmail" value="send" class="btn btn-danger" data-dismiss="modal"> Report Problem </button>
</ol>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</body>
</html>
这是url.py文件:
from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.contrib.auth.views import logout
from WebApp import views
urlpatterns = patterns('',
url(r'^index', views.index, name='index'),
url(r'^login', views.loginUser, name='login'),
url(r'^logout', views.logoutUser, name='logout'),
url(r'^register', views.registerUser, name='register'),
url(r'^sendMail', views.ajax_sendMail, name='sendMail'),
)
这是login.js文件:
var main = function()
{
if(errorMessage == "Invalid")
{
$('#myModal').modal("show");
}
else
{
$('#myModal').modal("hide");
};
$("#sendErrorEmail").click(function(event)
{
var csrftoken = getCookie('csrftoken');
event.preventDefault();
$.ajax(
{
type:"POST",
url:"sendMail/",
data:{
'email': "true",
'error': "login",
'username' : username,
'csrfmiddlewaretoken':csrftoken
}
});
$('#myModal').modal("hide");
return false;
});
};
//To get the csrf token
function getCookie(name)
{
var cookieValue = null;
if (document.cookie && document.cookie != '')
{
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++)
{
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == (name + '='))
{
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
$(document).ready(main);
我成功发送了AJAX POST请求,在views.py中的Ajax_sendEmail函数里也能获取到我的数据。这是日志的详细信息:
2014-09-04 16:04:20,901 [INFO] views.logger.login: User:adfafasdfa requests:Login
2014-09-04 16:04:20,901 [INFO] views.logger.login: UserName:adfafasdfa is trying to login
2014-09-04 16:04:21,124 [INFO] views.logger.login: User:adfafasdfa is not valid
2014-09-04 16:04:22,095 [INFO] views.logger.sendEmail: Sending email to admins, sendEmail:true, username:adfafasdfa, error:login
我能获取到sendEmail、username和Error,但仍然出现HTTP 500的MultiValueDictKeyError错误。
MultiValueDictKeyError at /webapp/sendMail/
"'email'"
Request Method: GET
Request URL: http://127.0.0.1:8000/webapp/sendMail/
Django Version: 1.6.5
Exception Type: MultiValueDictKeyError
Exception Value:
"'email'"
Exception Location: C:\Python27\lib\site-packages\django\utils\datastructures.py in __getitem__, line 301
Python Executable: C:\Python27\python.exe
Python Version: 2.7.6
有没有人知道为什么会这样?真是奇怪……
更奇怪的是Chrome的检查元素工具,
这是Chrome检查元素工具的截图:
它显示这是一个POST请求,但当你深入查看时:
却显示是一个GET请求。
2 个回答
在你的settings.py文件中,把DEBUG的值改成DEBUG=True。这样做会让你看到出错的详细信息。别担心,如果DEBUG=True,通常就不需要使用Chrome的检查工具了。
我不知道!
:)
其实,你的代码看起来没问题。
你有没有可能是把 'sendMail/' 这个网址调用了两次?一次是用 'POST' 方法(这个是有效的),另一次是从别的地方用 GET
方法调用的?
我建议在 ajax_sendMail()
这个函数里加一些日志记录的代码(当然只是暂时的),这样你就能看到到底是什么时候出现了异常,或者是否因为某种原因这个视图被调用了两次。
另外,可以在 ajax_sendMail()
函数的第一行加一个 if request.method == 'POST':
的条件判断。而且,当你不确定某个键是否存在时,使用 request.POST.get('some_key', default_if_not_existing)
是个好主意。这样虽然不能解决你的问题,但可能会帮助你调试。