2012-02-13 16 views
0

対応するビューに@transaction.commit_manuallyデコレータがあるテンプレートで権限をチェックしようとすると、このエラーが発生します。Transaction managed block ended with pending COMMIT/ROLLBACKDjangoトランザクション管理されたブロックがパーマネントのチェック時に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を拡張するexpense.htmlのレンダリングで同じエラーが発生します。

view.py:

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

私はデコレータを削除しようとしたといかなる種類の例外は、すべての作品はありません。しかし、私は上のデコレータを入れたときに、エラーが

urls.py発生します

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

UPDATE#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

+0

それは条件の下にありますので、必ずしもそうではありません。しかし、私はこれが効果があるとは思わない。すべての条件に 'transaction.commit()' /'transaction.rollback()を追加すると、同じエラーが発生します。 –

答えて

0

ちょうどエラーメッセージが意味するものを確認するには、スーパーユーザー

また、私は含まれたコードであるため、パーミッションをチェック気にしないので、それがあると信じて、あなたはPostgresのにしています、 右?

もしそうなら、1つの提案:あなたの# do stuff hereブロックでは、上記のように、あなたが書き込み後でも手動でコミットしていないと確信しています。

Django 1.3以降、トランザクション管理の読み込みは、書き込みだけでなくダーティとしてカウントされます。そのため、後でcommit()が必要になります。

詳細はrelease notesを参照してください。

+0

あなたの答えをありがとうが、私はすでに、同じエラーを試してみました。すべての条件にtransaction.commit()を追加する。私の質問を読んだら、チェック・パーミッションを使用しないとエラーが出ないので、テンプレートのパーミッションをチェックするときだけ問題が発生します。だから問題はどこかにあると思う。 –

+0

あなたの権限のバグのように思えます。そこにチェックします。コミットされていない汚れた読みを残しているかもしれませんか? –

0

でダウンここに解決策を参照してください。

  • のpostgresql 9.1`
  • のpython 2.7.3
  • 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/') 
関連する問題