jQuery $ .post для Django возвращает «500 Internal Server Error» - PullRequest
6 голосов
/ 09 мая 2011

Я работаю над руководством по jQuery ( Ссылка ), но застрял в разделе "RATE ME: USING AJAX"

JQuery:

 $(document).ready(function() {
   // generate markup
   $("#rating").append("Please rate: ");

   for ( var i = 1; i <= 5; i++ )
     $("#rating").append("<a href='#'>" + i + "</a> ");

   // add markup to container and apply click handlers to anchors
   $("#rating a").click(function(e){
     // stop normal link click
     e.preventDefault();

     // send request
     $.post("/vote", {rating: $(this).html()}, function(xml) {
       // format and output result
       $("#rating div").html(
         "Thanks for rating, current average: " +
         $("average", xml).text() +
         ", number of votes: " +
         $("count", xml).text()
       );
     });
   });
 });

urls.py:

urlpatterns = patterns('',
    (r'^rating/$', 'ajax_rating.views.rating'),
    (r'^vote/$', 'ajax_rating.views.vote'),
)

views.py:

@csrf_exempt
def vote(request):
    if request.is_ajax():
        rating = request['rating']
        f = open('ratings.dat', 'w')
        votes = json.load(f)
        votes.append(rating)
        f.close()
        dict = {}
        total_rating = sum(votes)
        dict['count'] = len(votes)
        dict['avg'] = total_rating / dict['count']
        return HttpResponse(serializers.serialize('xml', dict), 'application/xml')
    else:
        return HttpResponse(status=400)

В основном, html предлагает пользователю сделать выбор от 1 до 5 (якоря с class = rating). При нажатии на выбор элемент #rating будет обновлен с вычисленным результатом, возвращаемым с сервера.

Проблема: При нажатии на выбор появляется сообщение «Внутренняя ошибка сервера HTTP 500». Ошибка происходит еще до того, как запрос попадет в функцию просмотра, голосования (запроса). Я пытался выяснить, почему ошибка, но не имею никаких подсказок. Я не думаю, что это имеет какое-либо отношение к csrf, так как я использую @csrf_exempt в функции view и вынул 'django.middleware.csrf.CsrfViewMiddleware' из MIDDLEWARE_CLASSES.

Пожалуйста, помогите ~~ благодаря вашим экспертам

Ответы [ 2 ]

22 голосов
/ 09 мая 2011

Я считаю, что POST должен идти по URL /vote/, а не только /vote.

6 голосов
/ 10 мая 2011

rating не будет действительным ключом на request.Вы, вероятно, ищете request.POST['rating'].Или, чтобы быть в безопасности, чтобы не выдавать еще больше ключевых ошибок:

rating = request.POST.get('rating', None)
if rating is None:
    return HttpResponse(status=400) ## or some error.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...