500服务器错误,我不知道有什么问题,ajax,django

时间:2011-11-14 18:03:55

标签: jquery python ajax django

我有这些代码,而且我已经使用了几个小时,但我无法弄清楚是什么问题。

我一直得到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 个答案:

答案 0 :(得分:4)

我看到了你的jquery代码,不应该有任何错误......

只是一个疯狂的猜测,因为之前我发生过类似的事情并花了一段时间才意识到它(忘记了追溯的样子)

您可能需要检查您的网址文件,并确保您没有使用相同的网址或现有网址格式的通配符。

答案 1 :(得分:1)

从我所看到的,你的追溯:

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)部分遇到不是字符串的元素(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的确切位置。

不看视图处理程序和表单代码我真的不能多说。

答案 2 :(得分:0)

请求不是ajax时尝试执行回滚。使用commit_manually装饰器时需要回滚或提交。

答案 3 :(得分:0)

您是否已使用ajax POST请求将此csrf保护所需代码添加到所有页面?

$(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'));
             }
         }
    });
});

它在docs中被删除。

试试这个,请提供一些反馈。

答案 4 :(得分:0)

您的目标视图应包含此模式,以使AJAX帖子请求正常:

def target_view(request)      如果request.method ==&#39; POST&#39;:          if request.is_ajax():

jQuery的.load()和.get()方法可以正常工作但是要使用$ .ajax()或$ .post()方法,你必须遵循上面的模式来定位函数。

这里我的js源函数是:

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

如果失败,请回复我。