gpt4 book ai didi

python - 无法制作自定义 Django View 装饰器(带参数)

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:20 25 4
gpt4 key购买 nike

所以我已经阅读了所有类似的问题并复制了他们写的内容,但我仍然遇到问题。所以我想要这样的东西

# Yes, I know django has one but I want to make my own
@rate_limit(seconds=10)
myview(request, somearg, *args, **kwargs):
# Return a response
...

def rate_limit(seconds=10):
def decorator(view):
def wrapper(request, *args, **kwargs):
# Do some stuff
return view(request, *args, **kwargs)
return wrapper
return decorator

运行时报错

decorator() got an unexpected keyword argument 'somearg'

所以我附加装饰器来接受 args 和 kwargs 并得到这个错误

# New decorator signature
def decorator(view, *args, **kwargs)

和错误

'function' object has no attribute 'status_code'

编辑:所以解决方案是使用。谢谢 Martijn Pieters!

@rate_limit()

代替

@rate_limit

最佳答案

您的第一次尝试工作得很好,但您可能忘记调用 rate_limit() 装饰器工厂。

换句话说,如果您这样做,就会出现您的第一个错误:

@rate_limit
def myview(request, somearg, *args, **kwargs):

代替:

@rate_limit(seconds=10)
def myview(request, somearg, *args, **kwargs):

你也很想用functools.wraps()在 Django 中使用的装饰器上,特别是如果你想将它与其他 Django 装饰器混合使用,例如 csrf_exempt:

from functools import wraps

def rate_limit(seconds=10):
def decorator(view):
@wraps(view)
def wrapper(request, *args, **kwargs):
# Do some stuff
return view(request, *args, **kwargs)
return wrapper
return decorator

这确保了在待包装函数上设置的任何属性都被正确地复制到包装器中。

关于python - 无法制作自定义 Django View 装饰器(带参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19965036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com