检查权限时,Django事务管理的块以挂起的提交/回滚结束

2024-06-02 08:49:09 发布

您现在位置:Python中文网/ 问答频道 /正文

每当我试图检查模板中的权限时,它对应的视图有一个@transaction.commit_manually修饰符,就会出现这个错误Transaction managed block ended with pending COMMIT/ROLLBACK。在

模板:

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

删除权限条件后,不会出现任何错误。与非权限相关的if条件正常,例如{% if user.is_superuser %}{% endif %}

更新:即使权限检查不在视图呈现的模板上,而是从中扩展的,它仍然会有此错误。在

例如,nav中的权限检查_工具栏.html,并查看渲染费用.html扩展了导航_工具栏.html会导致同样的错误。在

在视图.py公司名称:

^{pr2}$

我试过把装饰工拆了,没有任何例外,一切都可以。但是当我装上装饰器时,错误就发生了

在网址.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))

Tags: 用户formadd权限inputdatereturnif
3条回答

我在尝试减少访问用户的权限时收到此错误消息。在

  • postgresql 9.1`
  • python 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/')

为了确认错误信息的含义,你在Postgres上,对吗?在

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

从django1.3开始,事务管理的读取被视为脏的——而不仅仅是写操作——所以您也需要在这些读操作之后commit()。在

有关详细信息,请参阅release notes。在

它由context引起,instance=RequestContext(request)

看看下面@Marcin的解决方案

Django Transaction managed block ended with pending COMMIT/ROLLBACK

相关问题 更多 >