像标题一样,我想知道是否可以在基于函数的视图中使用mixins。如果是这样,我将如何导入?以下代码不起作用:
def payment_method_view(request, MyMixin):
谢谢!
答案 0 :(得分:3)
否。
首先,这没有道理。 mixin是将 mix 混合成 class 的东西。您可以在混合中“ 修补”某些功能。但是您将如何在函数上执行此操作?一个函数可以具有属性,但是想法是通常一个函数对其属性的作用不大。它通常没有调用附加函数的工作流程。如果您能够应用mixin,则意味着您的函数突然有了一个payment_method_view.get_queryset
函数。尽管这可能有用,但实际上并不是设计功能的使用方式。
一个函数通常编码一种计算形式,通常不用作某种存储相互交互的命名属性的集合。类通常用于此目的:它包含元素(类属性和方法),并且它们可以彼此交互。
但是,这还会导致很多问题。函数没有 builtin 继承机制。因此,这意味着,如果您将修补程序应用于混合函数,则不会有某些方法解析顺序(MRO)会“ guide ” super()
结果,很容易就会中断。
从语法上讲,这也没有任何意义。您只需定义一个带有两个参数的函数:request
和MyMixin
。根据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
之前登录。