2011-12-28 32 views
0

在django中,我想在爲視圖調用login_required()之前執行特定操作。一個簡單的解決方法就是讓網址指向不需要登錄的視圖,然後執行該特定操作(操作:在request.session中設置一些內容),然後重定向到需要登錄的主視圖。Django在login_required調用之前執行一個操作?

我應該如何處理它,如果有一些選項可以滿足django中的這些需求?

有沒有比編寫我自己的裝飾器來做到這一點更好或更簡單的方法?

+1

你的黑客並不能保證你的行爲被執行;使用'login_required'知道視圖網址的用戶可以輕鬆繞過其他視圖。不幸的是,我不知道解決您的問題。 – 2011-12-28 22:03:47

回答

1

編寫你自己的裝飾器是解決這個問題的最好方法。無論您擁有@login_required,只需添加您自己的裝飾器以及login_required裝飾器。

或者,你可以從你的裝飾器調用login_required函數。

+0

無需替換Django裝飾器,只需在適當的地方添加自己的裝飾器,它們就會被一個接一個地調用。 – demalexx 2011-12-29 10:28:29

+0

我不清楚。我的意思是說你添加了兩個,所以我會編輯我的答案,使其更加清晰。 – Jordan 2011-12-29 19:09:27

1

只需使用user_passes_test修飾符,然後在手動驗證它們已通過身份驗證之前執行您的自定義操作。請參閱:https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.user_passes_test

+0

+1:'login_required'裝飾器實際上在內部使用'user_passes_test',所以這可能會起作用。我仍然認爲中間件是正確的方法,基於OP的例子。 – elo80ka 2011-12-29 06:13:21

+0

中間件很可能是拿着一把火箭筒來對抗。 'user_passes_test'將簡單地替換他已經使用的'login_required'裝飾器,並允許他訪問會話以添加任何額外的變量。 – 2011-12-29 15:12:25

2

修飾器是最好的方法,因爲它使代碼易於理解,而且出於安全原因,用戶可以阻止重定向,因此您需要考慮如何避免這種情況。

這個arcticle看起來很有用How to make a chain of function decorators?,因爲我認爲你需要傳遞請求變量,並且讓你的裝飾器首先處理檢查。

1

你的問題沒有給出太多的細節,但通過你的例子(設置一些請求變量),這聽起來像你需要Request Middleware。看看內建django.contrib.auth.middleware.AuthenticationMiddleware爲例:

class AuthenticationMiddleware(object): 
    def process_request(self, request): 
     assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'." 

     request.user = SimpleLazyObject(lambda: get_user(request)) 

你需要定義與process_request方法的類(如上圖所示)。將爲每個請求調用process_request方法,並傳遞一個請求實例。在該方法中,您可以檢查request.user,並且如果用戶已通過身份驗證,併爲當前請求設置所需的任何變量。

相關問題