可以在基于函数的视图中使用mixins吗?

时间:2018-07-12 14:20:24

标签: django django-views

像标题一样,我想知道是否可以在基于函数的视图中使用mixins。如果是这样,我将如何导入?以下代码不起作用:

def payment_method_view(request, MyMixin):  

谢谢!

1 个答案:

答案 0 :(得分:3)

首先,这没有道理。 mixin是将 mix 混合成 class 的东西。您可以在混合中“ 修补”某些功能。但是您将如何在函数上执行此操作?一个函数可以具有属性,但是想法是通常一个函数对其属性的作用不大。它通常没有调用附加函数的工作流程。如果您能够应用mixin,则意味着您的函数突然有了一个payment_method_view.get_queryset函数。尽管这可能有用,但实际上并不是设计功能的使用方式。

一个函数通常编码一种计算形式,通常不用作某种存储相互交互的命名属性的集合。类通常用于此目的:它包含元素(类属性和方法),并且它们可以彼此交互。

但是,这还会导致很多问题。函数没有 builtin 继承机制。因此,这意味着,如果您将修补程序应用于混合函数,则不会有某些方法解析顺序(MRO)会“ guide super()结果,很容易就会中断。

从语法上讲,这也没有任何意义。您只需定义一个带有两个参数的函数:requestMyMixin。根据Python的说法,MyMixin恰好是类的名称,这是一个巧合。函数参数定义范围,因此,这意味着如果您在函数中使用MyMixin,则将引用与给定参数对应的值。

通常要更改功能的方法是编写装饰器。装饰器是一种将功能作为输入,更改功能或创建新功能的功能。在这种情况下,将使用装饰功能。例如,我们可以制作一个装饰器@login_required

from functools import wraps

def login_required(f):
    @wraps(f)
    def g(request, *args, **kwargs):
        if request.user.user.is_authenticated():
            return f(request, *args, **kwargs)
        else:
            return HttpResponse('Unauthorized', status=401)
    return g

因此,在此我们定义了一个函数login_required,该函数以一个函数f作为输入,并构造了一个新函数g。此函数采用参数request*args**kwargs作为参数。首先g检查request附带的用户是否已通过身份验证(已登录),如果是这种情况,我们用{{1}调用给定的函数f },request*args。如果没有,我们将返回401异常(未经身份验证)。

现在我们可以将装饰器应用于函数:

**kwargs

因此,现在Python将以@login_required def payment_method_view(request): # ... pass 作为参数调用我们的login_required函数,结果(payment_method_view函数)将代替g。因此,我们现在要求用户在调用原始 payment_method_view之前登录。