2012-02-13 62 views
0

每当我尝试检查相应视图有@transaction.commit_manually装饰器的模板中的权限时,我收到此错误Transaction managed block ended with pending COMMIT/ROLLBACK当检查权限时,Django事务托管块以挂起的COMMIT/ROLLBACK结尾

模板:

<!-- html stuff --> 
{% if perms.myApp.add_table1 %} 
    {# show html elements #} 
{% endif %} 

一旦我删除权限,条件,不存在错误。与权限无关的if条件没问题,例如{% if user.is_superuser %}{% endif %}

UPDATE:即使权限检查不在视图呈现的模板上,但是从其扩展而来,它仍然存在此错误。

例如nav_bar.html中的权限检查,以及查看渲染扩展nav_bar.html的费用.html会导致相同的错误。

view.py:

@transaction.commit_manually 
def add_expense(request): 
    # do stuff here 

我试过去掉装饰,也没有任何形式的异常,一切正常。但是,当我把装饰上,出现错误

urls.py:

# other stuff omitted 
(r'^myApp/expenses/add/$', add_expense), 

更新#2:

当用户是超级用户,没有任何问题为好。我相信,这是因为它不打扰检查的权限,因为用户是超级用户

此外,我已经包括了代码

@login_required() 
@transaction.commit_manually 
def add_expense(request): 

    request.session.set_expiry(1800) 

    if request.method == 'POST': 
     form_input = AddExpense(request.POST) 

     if form_input.is_valid(): 
      try: 
      # after validation data is cleaned 
       cd = form_input.cleaned_data 
       # cleaned data is a dictionary 
       input_date = date.today() 
       user = request.user.username 


       new_record = table1.objects.create(
        amount = cd['amount'], 
        date = cd['date_of_expense'], 
        username = user 
        ) 
       new_record.save() 
       transaction.commit() 
       return render_to_response('forms/add_expense_success.html', context_instance=RequestContext(request)) 
      except Exception, e: 
       pass 
       transaction.rollback() 
       return HttpResponse(None) 
     else: 

      return render_to_response('forms/add_expense.html', {'form': form_input}, 
           context_instance=RequestContext(request)) 
    else: 
     # loading this gives error, not sure the top part 
     form = AddExpense() 
     return render_to_response('forms/add_expense.html', {'form': form, 'page_title': '新增支出'}, 
         context_instance=RequestContext(request)) 
+0

不是答案本身,而只是双重检查:你必须在你的“#do的东西在这里”代码块结束时器transaction.commit()? – aychedee 2012-02-13 11:21:06

+0

它是在一个条件下,所以不,不一定。但我不相信这会产生效果。向每个条件添加'transaction.commit()'/'transaction.rollback()'会导致相同的错误。 – 2012-02-13 11:23:50

回答

0

只是为了确认该错误消息意味着什么,你对Postgres的, 对?

如果是这样,一个建议:在上面的# do stuff here块中,我敢打赌,即使在写入之后,您也不会手动提交。

从Django 1.3开始,事务管理的读取被认为是脏的 - 不仅仅是写入 - 所以你也需要在commit()之后。

查看release notes了解更多详情。

+0

感谢您的回答,但我已经尝试过,同样的错误。将transaction.commit()添加到每个条件。如果你阅读我的问题,我只在检查模板中的权限时才会遇到问题,如果我不使用检查权限,则不会出现错误。所以我认为问题出在那里。 – 2012-02-13 11:30:09

+0

是的,那么听起来像是在你的权限检查中的错误。可能会离开肮脏的阅读未提交? – 2012-02-13 11:41:29

0

的解决方案,我收到此错误信息,同时试图降低对于接入用户权限。

  • PostgreSQL的9.1`
  • 蟒蛇2.7.3
  • 的Django 1.3。1

如果作为超级用户(管理角色)运行没有问题,如果以用户(用户角色)身份运行,则会出现错误。 用户拥有所有django相关表的所有(甚至授予)权限,甚至对数据库和模式也具有所有权限(甚至授予),但它仍然会给出错误。

这可能是什么原因造成的?到目前为止,我可以调试它,它只是超级用户权利缺失,否则超级用户和用户有相同的权利。

代码:

@login_required 
@transaction.commit_manually 
def sipuser_add(request, extension_id): 
    member = members.objects.get(nickname=request.user.username) 
    extension = extensions.objects.get(id=extension_id) 
    nickname = request.user.username 
    if extension.id_members.nickname == member.nickname: 
     from django.db import connection 
     cursor = connection.cursor() 
     secret = pwgen() 
     cursor.execute("SELECT func_create_sipuser('%s','%s',%s)" % (nickname, secret, extension_id)) 
     ret = cursor.fetchone() 
     logger.debug("created extension_id: %s - stored procedure 'func_create_sipuser' returned: %s" % (extension_id, ret)) 
     pin = 1234 
     timeout = 15 
     cursor.execute("SELECT func_create_voicemail_from_phonenumberid(%s,'%s',%s)" % (extension_id, pin, timeout)) 
     ret = cursor.fetchone() 
     logger.debug("created voicemail for extension_id %s - stored procedure 'func_create_voicemail' returned: %s" % (extension_id, ret)) 
     cursor.close() # is this needed and/or on the right position called? 
     connection.commit() 
    return HttpResponseRedirect('/extensions/')