Jas*_*ard 2 django django-views
就像标题所说的那样,我想知道是否可以在基于函数的视图中使用 mixin。如果是这样,我将如何导入它?以下代码不起作用:
def payment_method_view(request, MyMixin):
Run Code Online (Sandbox Code Playgroud)
谢谢!
没有。
首先,这没有意义。mixin 是可以混合到一个类中的东西。您可以在 mixin 中“修补”某些函数。但是你会如何在一个函数上做到这一点呢?一个函数可以有属性,但其思想是通常一个函数对其属性做的不多。它通常没有调用附加函数的工作流。如果您能够应用 mixin,那将意味着您的函数突然有了一个payment_method_view.get_queryset函数。尽管这可能很有用,但这并不是函数的真正用途。
函数通常对一种计算形式进行编码,它通常不用作某种集合来存储相互交互的命名属性。类通常用于:它包含元素(类属性和方法),并且它们可以相互交互。
但除此之外,还会带来很多问题。函数没有内置的继承机制。所以这意味着如果你应用到修补函数的 mixin,那么就不会有一些方法解析顺序 (MRO)来“引导”super()调用等。因此,这很容易被破坏。
从语法上讲,它也没有任何意义。您只是定义了一个带有两个参数的函数:request, 和MyMixin。MyMixin碰巧是一个类的名称这一事实- 根据 Python - 是一个巧合。函数参数定义了一个作用域,因此这意味着如果您要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
Run Code Online (Sandbox Code Playgroud)
在这里,我们因此定义了一个将函数login_required作为输入的函数f,并且我们构造了一个新函数g。此函数将request,*args和用作参数**kwargs。首先g检查是否附接到所述用户request的autheticated(已登录),如果是这样的情况下,我们称给定函数f与request,*args,和**kwargs。如果没有,我们将返回 401 异常(未经身份验证)。
现在我们可以将装饰器应用于函数:
@login_required
def payment_method_view(request):
# ...
pass
Run Code Online (Sandbox Code Playgroud)
所以现在 Python 将login_required使用payment_method_viewas 参数调用我们的函数,结果(g函数)将代替payment_method_view. 因此,我们现在要求用户在调用原始 之前登录payment_method_view。