简体   繁体   English

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

[英]500 server error, I have no idea what's wrong, ajax, django

I have these bits of code and I've been at it for hours but I cannot figure what is wrong. 我有这些代码,已经花了几个小时了,但是我不知道出了什么问题。

I keep getting a 500 server response, and it wouldn't even start debugging in the view definition when I trigger the ajax. 我一直收到500个服务器的响应,而当我触发ajax时,它甚至都不会在视图定义中开始调试。

I'm really at a loss, any help would be fantastic! 我真的很茫然,任何帮助都太棒了!

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

UPDATE: I don't think syntacticly there are anything wrong with my view, so I took it out and added the traceback, is it something wrong with the csrf token? 更新:我不认为语法上我的观点有什么问题,因此我将其删除并添加了回溯,csrf令牌有问题吗? All of my other ajax functions work 我所有其他的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

I saw ur jquery code and there should not be any errors... 我看到了您的jquery代码,应该没有任何错误...

just a wild guess because something similar happened to me before and took me a while to realize it (forgot what the traceback looks like) 只是一个疯狂的猜测,因为之前发生过类似的事情,并且花了我一段时间才意识到(忘记了回溯的样子)

You may want to check your urls file and make sure you're not using the same url or the wildcard of an existing url pattern. 您可能要检查您的url文件,并确保没有使用相同的url或现有url模式的通配符。

From what I can see, your traceback: 从我所看到的,您的回溯:

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

indicates that ''.join(self._container) part encounters an element that is not a string (NoneType) ie some piece of the form ends up a NoneType and cannot be serialized properly when CSRF field is supposed to be added. 表示''.join(self._container)部分遇到的元素不是字符串(NoneType),即,该表单的某些部分以NoneType结尾并且在应该添加CSRF字段时无法正确序列化。 Looking at the django code self._container is actually the content if HttpResponse passed in. That means Django tries to add csrfmiddletoken field in the response's form and the regular expression that tried to match the form and insert it somehow ended up catching a NoneType instead of just strings. 查看Django代码self._container实际上是HttpResponse传入的内容。这意味着Django尝试在响应的表单中添加csrfmiddletoken字段,并尝试以某种形式匹配该表单并将其插入的正则表达式最终捕获了NoneType而不是只是字符串。

The regular expression in question is: 正则表达式为:

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

I would check the response form you are generating and make sure it is correctly formed. 我会检查您所生成的响应表,并确保其格式正确。 It would also help to step through the csrf code and see exactly where it is catching the NoneType. 这也将有助于单步执行csrf代码,并准确查看其捕获NoneType的位置。

Without looking at the view handler and the form code I can't really say more. 如果不查看视图处理程序和表单代码,我真的不能多说。

Your targeted view should contain this pattern to make AJAX post requests fine: 您的目标视图应包含以下模式,以使AJAX发布请求正常进行:

def target_view(request) if request.method == 'POST': if request.is_ajax(): def target_view(request)如果request.method =='POST':如果request.is_ajax():

jQuery's .load() and .get() methods will work fine but to use $.ajax() or $.post() methods you must follow pattern like above in targeting function. jQuery的.load()和.get()方法可以正常工作,但要使用$ .ajax()或$ .post()方法,则必须在目标函数中遵循上述模式。

Here my js source function is: 这是我的js源函数:

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

Reply me if it fails. 如果失败请回复我。

Try doing a rollback when the request is not ajax. 当请求不是ajax时,尝试回滚。 You need to rollback or commit when using the commit_manually decorator. 使用commit_manually装饰器时,您需要回滚或提交。

Have you add this csrf protection required code to all your pages with ajax POST requests? 您是否已将这个带有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'));
             }
         }
    });
});

It is expalined in docs . docs中有解释

Try this and, please, give some feedback. 试试这个,请提供一些反馈。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM