簡體   English   中英

如何在django的每個視圖中運行一段代碼?

[英]How to run a piece of code in every view in django?

如果授權失敗,我需要在我的一個Django應用程序的每個視圖中檢查用戶授權(我不使用Django內置的auth系統)並將用戶重定向到“login please”頁面。

代碼如下所示:

try:
    admin_from_session = request.session['admin'];
    admin = Administrator.objects.get(login = admin_from_session.login, password = admin_from_session.password, enabled=True);
except KeyError, Administrator.DoesNotExist:
    return HttpResponseRedirect('/controlpanel/login')

問題是: 如何在每個視圖的開頭運行此代碼,而不是每次都重復?

如果我在PHP上編寫我的程序,我會將這些代碼放在單獨的文件中,並在需要授權的每個頁面的開頭寫下這樣的代碼:

include("redirect_if_not_logged_in.inc.php");

我找到的解決方案是:

  • 包含標簽 - 沒有,因為我無法從那里重定向
  • 自定義功能 - 也不做,因為同樣的原因。

這項任務似乎微不足道,但我無法找到解決方案。 我會非常感謝任何幫助。

查看django.contrib.auth裝飾器源代碼 它們完全符合您的要求,但對於內置的Django身份驗證系統( 請參閱文檔 )。 為您的身份驗證系統做類似的事情應該不難。

順便說一下,你為什么不使用內置的auth? 您可以將它與自定義身份驗證后端一起使用...

我找到了我正在尋找的答案。 函數裝飾器允許在函數開頭運行代碼。

您必須定義裝飾器功能

def login_please_decorator(view_func):
    """
        Redirect if admin was not logged in
    """
    def _decorated(request, *args, **kwargs):
        #Check authorization
        try:
            admin_from_session = request.session['admin'];
            admin = Administrator.objects.get(login = admin_from_session.login, password = admin_from_session.password, enabled=True);
            return view_func(request,*args, **kwargs);
        except KeyError, Administrator.DoesNotExist:
            return HttpResponseRedirect('/cp/login?ret=' + request.path);

    return _decorated 

並使用此函數名稱裝飾視圖:

@login_please_decorator
def some view(request):   
    # do something ...
    # ...

Ludwik Trammer,bugspy.net,謝謝你的幫助。

想到功能裝飾器

請查看此處的用戶身份驗證頁面http://docs.djangoproject.com/en/dev/topics/auth/

繼續閱讀“login_required decorator”。

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
   ...

如果未通過設置“settings.LOGIN_URL”進行身份驗證,您可以設置用戶重定向的位置。

在頁面上還有一個特殊身份驗證模板的示例,您可以根據自己喜歡的方式設置樣式!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM