在django中,我想在爲視圖調用login_required()之前執行特定操作。一個簡單的解決方法就是讓網址指向不需要登錄的視圖,然後執行該特定操作(操作:在request.session中設置一些內容),然後重定向到需要登錄的主視圖。Django在login_required調用之前執行一個操作?
我應該如何處理它,如果有一些選項可以滿足django中的這些需求?
有沒有比編寫我自己的裝飾器來做到這一點更好或更簡單的方法?
在django中,我想在爲視圖調用login_required()之前執行特定操作。一個簡單的解決方法就是讓網址指向不需要登錄的視圖,然後執行該特定操作(操作:在request.session中設置一些內容),然後重定向到需要登錄的主視圖。Django在login_required調用之前執行一個操作?
我應該如何處理它,如果有一些選項可以滿足django中的這些需求?
有沒有比編寫我自己的裝飾器來做到這一點更好或更簡單的方法?
只需使用user_passes_test
修飾符,然後在手動驗證它們已通過身份驗證之前執行您的自定義操作。請參閱:https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.user_passes_test
+1:'login_required'裝飾器實際上在內部使用'user_passes_test',所以這可能會起作用。我仍然認爲中間件是正確的方法,基於OP的例子。 – elo80ka 2011-12-29 06:13:21
中間件很可能是拿着一把火箭筒來對抗。 'user_passes_test'將簡單地替換他已經使用的'login_required'裝飾器,並允許他訪問會話以添加任何額外的變量。 – 2011-12-29 15:12:25
修飾器是最好的方法,因爲它使代碼易於理解,而且出於安全原因,用戶可以阻止重定向,因此您需要考慮如何避免這種情況。
這個arcticle看起來很有用How to make a chain of function decorators?,因爲我認爲你需要傳遞請求變量,並且讓你的裝飾器首先處理檢查。
你的問題沒有給出太多的細節,但通過你的例子(設置一些請求變量),這聽起來像你需要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
,並且如果用戶已通過身份驗證,併爲當前請求設置所需的任何變量。
你的黑客並不能保證你的行爲被執行;使用'login_required'知道視圖網址的用戶可以輕鬆繞過其他視圖。不幸的是,我不知道解決您的問題。 – 2011-12-28 22:03:47