因此,我已经阅读了所有类似的问题,并复制了他们写的内容,但是我仍然遇到问题。所以我想要这样的东西
# 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
这样可以确保将要包装的函数上设置的所有属性正确复制到包装器中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句