简介:本文的首席执行官Note将向您介绍Django Decorator可以使用什么。我希望这对每个人都会有所帮助。让我们来看看。
在系统开发过程中,我们将遇到用户登录需求。使用Django用户认证(AUTH)组件可以帮助我们确定当前用户是否合法,并迅速实现用户登录,验证和退出。
django中的login_url是/accounts/login/。如果我们不设置,我们将跳到/帐户/登录/页面,因此我们需要编写此值以使其指向我们的登录页面。
使用Django自己的装饰@login_required来确定用户是否登录。您只需要在相应的视图方法的前面添加@login_required即可。
终于为所有人做一个展示:
您学会了,快点尝试!交叉探针
装饰器本质上是封闭功能。他可以在不更改源代码的情况下添加其他功能
应用程序方案:在较小的范围内,您可以使用其他功能来使用装饰设备
原则:脱色器遵循开放和关闭的原则
该功能的有效信息通常会记录一些有用的信息,但是一旦将其连接到装饰,打印现象将发生为空
这是因为我们执行的f()函数实际上在装饰设备中执行sublial()函数,因此将其打印为空
但是Django框架中使用的修复技术不是
重复一些事情多次(您现在在周期中所做的事情)
ieratable对象iTeraable内部实现__ITER__方法(可以直接充当可直接用于for循环的迭代对象,您可以使用isInstance()来判断iToserable)
迭代器迭代器具有__next__方法是迭代器。迭代器从第一个值始于一个一个。直到最后才结束。
发电机具有Yeild方法。发电机基于迭代器。它不仅可以获得值,还可以生成值。执行后,发电机生成器的本质是迭代器。
通过列表生成公式,我们可以直接创建一个列表。但是,由于内存限制,列表容量可能受到限制。此外,我们创建了一个包含100万个元素的列表,不仅占据了较大的存储空间。如果我们只是只能访问先前的元素,那么背后大多数元素所占据的空间都是浪费的。
在python中列表发电机循环的一侧计算的机制称为Generator Generator
有很多方法可以创建生成器生成器
python中迭代器的Next()方法的Next()方法返回下一个元素或容器对象的对象,该对象抛出了停止性
因为Python中没有“迭代器”,所以具有以下两个特征的类可以称为“迭代器”类:
1.有__next __()方法,返回容器的下一个元素或扔掉stopitetation异常
2.有一个__ITER __()方法,迭代器本身
尽管列表,字符串...这些不是迭代器,但我们可以将其转换为迭代器
让我们先拍照
内衣可用于掩盖,但在冬季,它不能保护我们免受风和寒冷的侵害。聪明的人发明了他们的裤子。裤子之后,婴儿不冷。在影响内衣角色的前提下,它为我们的身体提供了温暖的效果。
回到我们的主题
装饰器本质上是Python功能,它允许其他功能添加其他功能而无需更改代码。装饰器的返回值也是一个函数对象。它经常用于具有切割需求的方案,例如:插入日志,性能测试,交易处理,缓存,权限验证和其他场景。解决此类问题。使用装饰设备,我们可以绘制许多与功能本身无关的类似代码,并继续重复使用。总而言之,装饰器的作用是在现有对象中添加其他功能。
让我们看一个简单的例子:
def foo():
打印('我是foo')
现在有一个新的需求,我希望记录该函数的执行日志,因此将日志代码添加到代码:
def foo():
打印('我是foo')
logging.info(“ foo正在运行”)
bar(),bar2()也有类似的需求,该怎么做?在bar函数中编写另一个日志记录?这会导致许多类似的代码。为了减少重复的写作代码,我们可以执行此操作并重新定义一个函数:专门处理日志,然后在处理日志过程后执行真实的业务代码。
def use_logging(func):
logging.warn(“%s正在运行”%func .__名称__)
func()def bar():
print('i Am bar')use_logging(bar)
不难理解,
但是在这种情况下,我们必须每次将函数作为参数传递给use_logging函数。此方法已经破坏了原始代码逻辑结构。当执行业务逻辑之前,执行了运行bar(),但是现在必须更改为use_logging(bar)。所以有更好的方法吗?当然,答案是装饰器。
简单的装饰器
def use_logging(func):
def包装器(*args,** kwargs):
logging.warn(“%s正在运行”%func .__名称__)
返回func(*args,** kwargs)
返回WrapperDef bar():
print('i am bar')bar = use_logging(bar)bar()
函数use_logging是装饰器。它包装了在功能中执行真实业务方法的函数,并且看起来bar用use_logging装饰。在此示例中,当功能输入并退出时
,这种编程方法称为一个方面,称为面向方面的程序。
@是装饰器的语法,并在定义功能时使用它以避免再次分配操作
def use_logging(func):
def包装器(*args,** kwargs):
logging.warn(“%s正在运行”%func .__名称__)
返回功能(*args)
返回包装器@use_loggingdef foo():
print(“我是foo”)@use_loggingdef bar():
打印(“我是bar”)bar()
如上所示,我们可以保存bar =
使用use_logging(bar),直接调用bar()以获取所需的结果。如果我们有其他类似的功能,我们可以继续调用装饰以修改功能,而不是修改函数或添加新软件包。,我们改善了程序的重复利用,并提高了程序的可读性。
在Python中使用Python的使用归因于Python的函数,可以将其传递给其他函数,作为普通对象之类的参数。它可以分配给其他变量。它可以用作返回值。它可以在另一个函数中定义。
带有参数的脱色器
装饰器还具有更大的灵活性,例如带有参数的装饰器:在上面的装饰器调用中,例如@USE_LOGGIG,装饰器的唯一参数是执行业务的功能。装饰的语法使我们能够提供其他参数当打电话(例如@decorator(a))时,它以这种方式为编写和使用装饰提供了更大的灵活性。
def use_logging(level):
防御装饰器(func):
def包装器(*args,** kwargs):
如果等级==“警告”:
logging.warn(“%s正在运行”%func .__名称__)
返回功能(*args)
返回包装器
返回装饰器@use_logging(level =“ warn”)def foo(name ='foo'):
打印(“我am%s”%名称)foo()
上面的use_logging是一个允许参数的装饰器。它实际上是原始装饰的功能包并返回装饰器。我们可以将其理解为包含参数的封闭式。
当我们使用@se_logging(Level =“ Warn”)时,Python可以找到这层包装,并将参数传递到装饰的环境。
分类
让我们看一下装饰类型。与功能性装饰相比,装饰器具有高灵活性,高内部聚会和包装的优势。使用瓷砖也可以依靠班级内的__call__方法。当 @使用使用使用使用到该函数时,将调用此方法。
类foo(对象):
def __init __(self,func):
self._func = func
def __call __(self):
打印(“班级装饰者运行”)
self._func()
打印(“班级装饰者结束”)
@foo
def bar():
打印('bar')
酒吧 ()
functools.raps
该代码被装饰物重新使用,但他的缺点是原始功能的原始功能已经消失,例如DocString,__ name__和功能的参数列表。首先查看示例:
装饰师
def记录(func):
with_logging(*args,** kwargs):
打印func .__名称__ +“称为”
返回func(*args,** kwargs)
用_logging返回
功能
@loggeddef f(x):
“”“”“”“”
返回x + x * x
此功能等效于:
def f(x):
“”“”“”“”
返回x + x * xf =记录(f)
并不难找到函数f被_logging替换。当然,其Docstring是__名称__是with_logging函数的信息。
打印f。
这个问题相对严重。幸运的是,我们有funools.traps。包裹本身也是装饰师。它可以将原始功能的元信息复制到装饰功能。它的正确。
从函数引起的导入wrapsdef记录(func):
@wraps(func)
with_logging(*args,** kwargs):
打印func .__名称__ +“称为”
返回func(*args,** kwargs)
使用_logging@loggeddef f(x)返回:
“”“”“”“”
返回X + X * XPRINT f ._____#proprint f ._____#prop
建造的装饰器
@staticmathod,@classmethod,@property
装饰师的顺序
@a@b@cdef f():
相当于
f = a(b(c(f)))
装饰可以帮助检查某人是否有权使用Web应用程序的端点。它们在烧瓶和Django Web框架中主要使用。这里是使用基于装饰的授权:
日志是装饰器的另一个亮点。这就是一个例子:
我敢肯定,您已经在考虑装饰设备的其他智能之一。
带有参数的装饰器是一个典型的关闭功能(稍微,请参阅我的上一篇文章)
我们返回到日志的日志并创建一个软件包函数,以允许我们指定输出的日志文件。
现在我们有了可以用于正式环境的logit装饰效应,但是当我们应用程序的某些部分相对脆弱时,异常可能会更加紧迫。例如,有时您只想播放日志到文件。将您的注意力转移到电子邮件上,同时保留日志并留下记录。这是一种使用继承的场景,但是到目前为止,我们只看到用于构建装饰器的功能。
幸运的是,该类也可以用来构建装饰师。
有关详细信息,请参阅我的上一篇文章,Liao Shen解释了更清晰的解释
结论:以上是首席CTO注释为每个人编写的Django装饰器相关内容的相关内容。希望它对您有所帮助!如果您解决了问题,请与更多关心此问题的朋友分享?