2013-12-12 68 views
1

我正在使用Django 1.5.4,並且好像它有這個調試設置,導致save方法不能保存直到視圖成功完成。這使用戶註冊和登錄後的權利不可能。我試着設置DEBUG=False,沒有幫助。 它發生在每一個模型。 我正在使用MySQL,但我很確定那根本不相關。 我使用電子郵件認證 - 後端,那就是:只有在視圖成功完成後才能保存Django

from django.contrib.auth.models import User 


class EmailBackend(): 
    def get_user(self, user_id): 
     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 

    def authenticate(self, username=None, password=None): 
     try: 
      user = User.objects.get(email=username) 
     except User.DoesNotExist: 
      return None 

     if user.check_password(password): 
      return user 

我使用保存的代碼是很平常:

user = User() 
user.first_name = full_name[0] 
user.last_name = ' '.join(full_name[1:]) 
user.email = data['email'] 
user.username = create_username(user.first_name, user.last_name) 
user.set_password(data['password']) 
user.save() 

auth_form = AuthenticationForm(data=request.POST or None) 
if auth_form.is_valid(): 
    login(request, auth_form.get_user()) 

我也看了起來的Django文檔的版本1.5.4和專業,但沒有發現任何東西。

現在,這裏可能會發生什麼?

回答

1

Django立即保存,但當啓用TransactionMiddleware時,僅在請求結束時提交事務

https://docs.djangoproject.com/en/1.5/topics/db/transactions/#tying-transactions-to-http-requests

推薦的方法來處理Web請求的交易是通過Django的TransactionMiddleware以配合他們的請求和響應階段。

它的工作原理如下:當請求開始時,Django啓動一個事務。如果響應沒有問題產生,Django會提交任何待處理的事務。如果view函數產生一個異常,Django回滾任何未決的事務。

要激活該功能,只需添加TransactionMiddleware中間件到你MIDDLEWARE_CLASSES設置

 

您可以commit manually或關閉autocommit對整個視圖:

from django.db import transaction 

@transaction.autocommit 
def viewfunc(request): 
    .... 

您也可以從中刪除,但我不會推薦。

+0

非常感謝。我真的沒有在網上找到任何東西。儘管這可能是一個簡單的問題。 –

1

剛擡起頭約TransactionMiddleware 從Django文檔:

在Django的1.6,TransactionMiddleware是過時和ATOMIC_REQUESTS取代。雖然一般行爲是相同的,但有兩點不同。

使用以前的API,可以切換到自動提交或顯式提交視圖中的任何位置。由於ATOMIC_REQUESTS依賴於強制原子性的atomic(),所以不再允許這樣做。但是,在頂層,仍然有可能避免在事務中包裝整個視圖。要實現這一點,請使用non_atomic_requests()而不是autocommit()裝飾視圖。

交易中間件不僅用於查看功能,而且還用於其後的中間件模塊。例如,如果您在事務中間件之後使用了會話中間件,則會話創建是事務的一部分。 ATOMIC_REQUESTS僅適用於視圖本身。

相關問題