500 ошибка сервера, я понятия не имею, что не так, ajax, django - PullRequest
2 голосов
/ 14 ноября 2011

У меня есть эти фрагменты кода, и я занимался этим часами, но я не могу понять, в чем дело.

Я получаю ответ от 500 серверов, и он даже не начнет отладку впосмотреть определение, когда я запускаю AJAX.

Я действительно в растерянности, любая помощь будет фантастической!

    $('.cheque_info_edit_button').live('click', function(){

var new_cheque = {
    // cheque number is taken from the cell, not input box for this one.
    cheque_no: $(this).closest('td').closest('tr').find('.inv_prof_cheque_no').text(),
    their_bank: $(this).closest('td').closest('tr').find('.new_their_bank_input_ajax').val(),
    our_bank: $(this).closest('td').closest('tr').find('.new_our_bank_input_ajax').val(),
    cash_in_date: $(this).closest('td').closest('tr').find('.new_cash_in_date_input_ajax').val(),
    cheque_amount: $(this).closest('td').closest('tr').find('.new_cheque_amount_input_ajax').val(),
    info_type: 'edit'
   };

    var cheque_json = JSON.stringify(new_cheque);
    $.ajax({
       type: 'POST',
       url: '/best_choose/invoice/profile/inv_add_or_edit_cheque/',
       data: cheque_json,
       success: function(){
       // do stuff
}

ОБНОВЛЕНИЕ: я не думаю, что синтаксически естьчто-то не так с моим мнением, поэтому я вынул его и добавил трассировку, что-то не так с токеном csrf?Все остальные мои функции ajax работают

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/best_choose/invoice/profile/inv_add_or_edit_cheque/

Django Version: 1.3
Python Version: 2.7.2
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'SY_SYSTEM.sy_system',
 'django.contrib.humanize']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.middleware.csrf.CsrfResponseMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


 Traceback:
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  178.                 response = middleware_method(request, response)
 File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/middleware/csrf.py" in process_response
  287.             response.content, n = _POST_FORM_RE.subn(add_csrf_field, response.content)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/http/__init__.py" in _get_content
  596.         return smart_str(''.join(self._container), self._charset)

Exception Type: TypeError at /best_choose/invoice/profile/inv_add_or_edit_cheque/
Exception Value: sequence item 0: expected string, NoneType found

Ответы [ 5 ]

4 голосов
/ 03 декабря 2011

Я видел ваш код JQuery, и не должно быть никаких ошибок ...

просто дикая догадка, потому что что-то подобное случалось со мной раньше и мне потребовалось некоторое время, чтобы понять это (забыл, как выглядит трассировка)

Возможно, вы захотите проверить файл urls и убедиться, что вы не используете тот же URL или подстановочный знак существующего шаблона URL.

1 голос
/ 03 декабря 2011

Из того, что я вижу, ваш след:

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/http/__init__.py" in _get_content
   596.         return smart_str(''.join(self._container), self._charset)

Exception Type: TypeError at /best_choose/invoice/profile/inv_add_or_edit_cheque/
Exception Value: sequence item 0: expected string, NoneType found

указывает, что ''.join(self._container) part встречается с элементом, который не является строкой (NoneType), т.е. некоторый фрагмент формы заканчивается NoneType и не может быть сериализован должным образом, когда предполагается, что поле CSRF добавлено. Просмотр кода django self._container на самом деле является содержимым, если передан HttpResponse. Это означает, что Django пытается добавить поле csrfmiddletoken в форму ответа и регулярное выражение, которое пытается сопоставить форму, и вставить его каким-то образом в конечном итоге перехватывает NoneType вместо просто струны.

Рассматриваемое регулярное выражение:

_POST_FORM_RE = \
re.compile(r'(<form\W[^>]*\bmethod\s*=\s*(\'|"|)POST(\'|"|)\b[^>]*>)', re.IGNORECASE) 

Я бы проверил форму ответа, которую вы генерируете, и убедился, что она сформирована правильно. Это также поможет пошагово пройти через код csrf и точно определить, где он перехватывает NoneType.

Не глядя на обработчик представления и код формы, я не могу сказать больше.

0 голосов
/ 03 июля 2013

Ваше целевое представление должно содержать этот шаблон для корректной отправки запросов AJAX:

def target_view (запрос) if request.method == 'POST': if request.is_ajax ():

Методы jQuery .load () и .get () будут работать нормально, но для использования методов $ .ajax () или $ .post () вы должны следовать шаблону, как описано выше в функции таргетинга.

Здесь моя функция источника js:

$.ajax({
     type: 'POST',
     url: '/target view url/',
     success: function(data){
         alert('it works');
     }
});

Ответь мне, если не получится.

0 голосов
/ 03 декабря 2011

Добавили ли вы этот код защиты csrf на все свои страницы с помощью запросов ajax POST?

$(document).ready(function(){    
    $.ajaxSetup({
         beforeSend: function(xhr, settings){
             function getCookie(n) {
                 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, n.length + 1) == (n + '=')){
                             cookieValue = decodeURIComponent(cookie.substring(n.length + 1));
                             break;
                         }
                     }
                 }
                 return cookieValue;
             }
             if(!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))){
                 xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
             }
         }
    });
});

Он уточняется в документах .

Попробуйте это иПожалуйста, оставьте отзыв.

0 голосов
/ 14 ноября 2011

Попробуйте выполнить откат, если запрос не является ajax.При использовании декоратора commit_manually вам нужно откатиться или зафиксировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...