代码之家  ›  专栏  ›  技术社区  ›  Silver Light

如何在django的每个视图中运行一段代码?

  •  10
  • Silver Light  · 技术社区  · 15 年前

    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");
    

    我找到的解决办法是:

    • 因为我哪儿都改不了方向
    • 自定义函数 - 也不行,因为一样 原因。

    这项任务似乎微不足道,但我找不到解决办法。我将非常感谢任何帮助。

    4 回复  |  直到 15 年前
        1
  •  6
  •   Ludwik Trammer    15 年前

    看看这个 source code for django.contrib.auth decorators . 他们做的正是你想要的,但是对于内置的Django认证系统( see the documentation

    顺便说一句,为什么不使用内置的auth呢?您可以将其用于自定义身份验证后端。。。

        2
  •  2
  •   ATOzTOA    11 年前

    我找到了我想要的答案。函数修饰符允许在函数的开头运行一段代码。

    必须定义修饰函数

    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,谢谢你的帮助。

        3
  •  1
  •   GabiMe    15 年前

        4
  •  0
  •   initall    15 年前

    请看这里的用户身份验证页面 http://docs.djangoproject.com/en/dev/topics/auth/

    请继续阅读“登录所需的装饰器”。

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def my_view(request):
       ...
    

    如果没有通过设置“settings.LOGIN\u URL”进行身份验证,您可以设置用户重定向的位置。