gpt4 book ai didi

python - Python/Django 装饰器可以访问哪些信息?

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

我对我们的代码进行了一些重构。 @render_to_json 装饰器在内部调用 is_logged_in 方法。我将其删除,而只是添加另一个显式 @login_required 装饰器。

问题是我们的一些方法是通过 AJAX 调用的,并且需要 {"status": "logged_out"} 的 json 响应,然后它们会执行该响应。所以我需要更改我们的 login_required 方法以某种方式检查两件事之一。

  • 此方法是否通过 AJAX 调用,可能检测 XMLHttpRequest header
  • render_to_json 装饰器是否也针对此请求调用?我们的想法是,如果 login_required 方法知道请求需要 json,那么它可以返回 json 数据包,否则正常重定向。

更新添加第三个选项。

  • 在每种情况下,带有 @render_to_json 装饰器的方法都会在其之前引用 @login_required 装饰器。如果用户注销,@login_required 方法将返回 HttpResponseRedirect。在 @render_to_json 方法中,我如何检查 login_required 方法的返回类型并做出适当的响应?

想法?有问题吗?

我应该补充一点,我对 Python 也相当陌生,所以我可能会错过一些基本的东西。如果有的话,帮我学习一下吗?

更新

我将继续在此处添加两个装饰器以供引用。

def render_to_json(fn):

@wraps(fn)
def inner(request, *args, **kwargs):
result = fn(request, *args, **kwargs)
return HttpResponse(json.dumps(result), mimetype='application/json')

return inner

def login_required(func):
@wraps(func)
def _decorator(request, *args, **kwargs):
if not is_logged_in(request):
from apps.core.extendedLogging import ExtendedLogging
ExtendedLogging.log("In login req'd: it appears that the user is not logged in", request)
request.session['login_referrer_uri'] = request.build_absolute_uri()
return HttpResponseRedirect(settings.LOGIN_URL)
return func(request, *args, **kwargs)
return _decorator

最佳答案

装饰者可以访问“装饰者”正在接收的所有数据:

def method_decorator(operation):
"""
On this case operation = view_method
"""
def wrapper(*args, **kwargs):
"""
Receives all arguments the requested operation would receive
"""
request = args[0]
param = args[1]
more_param = args[2]

return operation(request, param, more_param)
return wrapper

@method_decorator
def view_method(request, param, more_param):
#something

所以,当你调用“view_method”时,首先你会抛出“method_decorator”,然后它会调用“view_method”。

现在,在装饰器中,您可以验证您需要的任何内容并传递新信息,例如:

def wrapper(*args, **kwargs):
...
if some_condition:
request.new_content = new_content
return operation(request, param, more_param)
return wrapper

这将允许您通过请求的 view_method 接收 new_content:

@method_decorator
def view_method(request, param, more_param):
new_content = request.new_content

并且希望 view_method 现在知道要做什么。

您还可以使用相同的方法将数据从装饰器冒泡到装饰器。

关于python - Python/Django 装饰器可以访问哪些信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14629528/

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