【问题标题】:Django - Non-class-based views authorizationDjango - 非基于类的视图授权
【发布时间】:2015-07-28 21:09:27
【问题描述】:

我遵循本教程http://www.effectivedjango.com/tutorial/authzn.html。在那里我们创建了类,我们应该使用基于类的视图来扩展它。那么如果我有方法定义的视图呢?我该怎么办?

def some_private_view(request):
    ...

class LoggedInMixin(object):
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(LoggedInMixin, self).dispatch(*args, **kwargs)

【问题讨论】:

    标签: python django authentication django-views authorization


    【解决方案1】:

    您使用login_required 装饰器https://docs.djangoproject.com/en/1.8/topics/auth/default/#the-login-required-decorator

    你不能装饰一个类,因为装饰器是一个函数,它接受一个函数x 作为参数,用这个函数x 做一些事情,然后返回它。这就是为什么你需要在这里使用相当“无用”的dispatch 方法,它只是调用它的父级而不做任何事情,因为类不是函数。


    编辑:稍后注意 - 如果您想跳过“无用”dispatch 方法,您可以编写一个 Mixin(一个只覆盖特定函数的小类),只需添加 @method_decorator(login_required)todispatch@ 987654329@View`s.

    您实际上并不需要这样做。有django braces 可以为你做这件事。然后你可以这样做:

    class AdminView(braces.views.LoginRequiredMixin, View):
        def get(request, *args, **kwargs):
            pass  # Do some logged-in user stuff here
    

    【讨论】:

    • login_required 工作完美,谢谢。但我不明白你的第二小段。请你说得更准确些(我的英语不好)?我们创建 LoggedInMixin 类的目的是什么?
    • 我刚刚仔细查看了您的教程链接 - 它完全按照我的建议进行。继续本教程 :) 每次您想要一个需要登录的视图时,它都会节省您键入调度方法的时间。对于我的中型项目,这将是大约 500 条线路
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2014-02-16
    • 2018-05-14
    • 2014-02-21
    相关资源
    最近更新 更多