2014-09-04 2 views
0

Я пытаюсь использовать Django с вызовами AJAX, и это дает мне HTTP 500 даже MultiValueDictKeyError, хотя нет ничего плохого?Ошибка HTTP 500 с Django Ajax

Я послал 3 переменные: SendEmail, имя пользователя, ошибка

Я был в состоянии использовать request.POST на 3 переменных, и получить следующий вывод:


SendEmail = True

имя пользователя = someUserName

ошибка = Войти


Тем не менее, веб-страница возвращается с 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">&times;</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, а в моих view.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, имя пользователя и ошибки, однако он до сих пор называет 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 Осмотреть Element инструмент:

enter image description here

Он говорит, что это POST, однако , когда вы идете внутрь:

enter image description here

Это показывает GET

+0

Очень длинный выстрел: есть ли у вас какие-нибудь причудливые посредники? – frnhr

+0

Нет, все стандартные средние – user1157751

ответ

2

Я не знаю!
:)

Действительно, ваш код выглядит хорошо.

Возможно ли, что вы дважды вызываете URL-адрес 'sendMail /'? Однажды с «POST» (что действительно проходит), и один раз с GET откуда-то еще?

Я предлагаю засорить функцию ajax_sendMail() с вызовами в журнал (только временно, конечно), чтобы точно увидеть, когда возникает исключение, и если по какой-либо причине вызов может быть вызван дважды.


Также возможно добавить if request.method == 'POST': условия в первой строке ajax_sendMail() тела. И всегда полезно делать request.POST.get('some_key', default_if_not_existing), когда есть вероятность, что ключ может отсутствовать. Это не решит вашу проблему, но может помочь отладить ее.

+1

Я думаю, что этот ответ прав - ошибка возникает в запросе 'GET', поэтому' request.POST' будет пустым и 'request.POST ['email']' будет поднять 'MultiValueDictKeyError '. Попробуйте использовать инструменты вашего браузера для просмотра запросов, которые он создает. – tcarobruce

+0

Я пытался это сделать, и он показывает только запрос POST, но не GET-запрос – user1157751

+1

Можете ли вы получить ответ от фактического запроса POST? Нажмите строку 'SendMail /' в сетевой таблице, а затем перейдите на вкладку «ответ». – tcarobruce

0

В файле settings.py измените значение DEBUG на, DEBUG = True. Это даст вам стопку того, что пошло не так. Не думайте, что инструмент проверки хрома понадобится, если DEBUG = True.