那麼,我可以想到兩種方法。首先,這將是「正確」的方式,因爲您不會破壞任何功能,只會增加新功能:創建您自己的login_required
修飾器。但問題是,Django 確實將登錄功能後的重定向捲起,它需要大量的零件。 login_required
decorator實際上只是user_passes_test
decorator的一個包裝,它依次調用redirect_to_login
view,它的即視圖將next
參數添加到查詢字符串中。在您的自定義裝飾器中,您可以將所有或部分功能直接放入裝飾器中,但您需要參考所有三個代碼。
另外,和更簡單的選擇,是創造一些中間件去除查詢字符串,如果它被設置:
from django.conf import settings
from django.http import HttpResponseRedirect
class RemoveNextMiddleware(object):
def process_request(self, request):
if request.path == settings.LOGIN_URL and request.GET.has_key('next'):
return HttpResponseRedirect(settings.LOGIN_URL)
而且,然後添加導入路徑,中間件MIDDLEWARE_CLASSES
。請記住,在請求階段,換句話說,中間件首先被處理或者從上到下被處理。這應該在請求階段相對較早,但您可能需要花一點時間才能看到可以和不可以到達的內容。
這種方法唯一真正的問題是它「打破」了下一個重定向功能,而不是以一種非常直觀的方式,如果後來的開發者繼承你的代碼庫以及允許重定向的任務,它可能是一個bit flummoxing。
對象的has_key已被棄用。請使用'in'代替。 –
@PatrickBassut它不被棄用,它在Python 3中完全刪除。我已經更新了python3兼容的答案。 Python 2已經過時,我想知道爲什麼人們仍然在2017年使用它。 –