Python/Django装饰程序可以访问哪些信息?
我正在对代码进行重构。Python/Django装饰程序可以访问哪些信息?,python,django,http-headers,decorator,Python,Django,Http Headers,Decorator,我正在对代码进行重构。@render\u to\u json装饰程序在内部调用is\u logged\u方法。我将其删除,而只是简单地添加另一个显式的@login\u required装饰器 问题是,我们的一些方法是通过AJAX调用的,并且期望json响应为{“status”:“logged_out”},然后它们会对其进行操作。因此,我需要更改我们的登录所需的方法,以某种方式检查以下两件事之一 这个方法是通过AJAX调用的,可能是检测XMLHttpRequest头吗 是否也为该请求调用了ren
@render\u to\u json
装饰程序在内部调用is\u logged\u
方法。我将其删除,而只是简单地添加另一个显式的@login\u required
装饰器
问题是,我们的一些方法是通过AJAX调用的,并且期望json响应为{“status”:“logged_out”}
,然后它们会对其进行操作。因此,我需要更改我们的登录所需的方法,以某种方式检查以下两件事之一
- 这个方法是通过AJAX调用的,可能是检测
头吗XMLHttpRequest
- 是否也为该请求调用了
decorator。我们的想法是,如果render\u to\u json
方法知道请求需要json,那么它可以返回json数据包,否则会像正常情况一样重定向login\u required
- 在任何情况下,使用
装饰器的方法都会在其前面引用@render\u to_json
装饰器。如果用户注销,则@login\u required
方法返回@login\u required
。在HttpResponseRedirect
方法中,我如何检查login_required方法的返回类型并做出适当的响应@render_to_json
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\u方法”时,首先抛出“method\u decorator”,然后调用“view\u方法”
现在,在decorator中,您可以验证所需的任何内容并传递新信息,例如:
def wrapper(*args, **kwargs):
...
if some_condition:
request.new_content = new_content
return operation(request, param, more_param)
return wrapper
这将允许您通过所请求的view_方法接收新的_内容:
@method_decorator
def view_method(request, param, more_param):
new_content = request.new_content
而且,希望view_方法现在知道该做什么了
您还可以使用相同的方法将数据从一个decorator冒泡到另一个decorator。Decorators可以访问“decoree”正在接收的所有数据:
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\u方法”时,首先抛出“method\u decorator”,然后调用“view\u方法”
现在,在decorator中,您可以验证所需的任何内容并传递新信息,例如:
def wrapper(*args, **kwargs):
...
if some_condition:
request.new_content = new_content
return operation(request, param, more_param)
return wrapper
这将允许您通过所请求的view_方法接收新的_内容:
@method_decorator
def view_method(request, param, more_param):
new_content = request.new_content
而且,希望view_方法现在知道该做什么了
您也可以使用相同的方法将数据从一个装饰器冒泡到另一个装饰器。装饰器可以访问它所装饰的函数调用的所有参数,因此我不确定我是否理解第一个要点。David。请记住,我一般都是Python新手。我怀疑会是这样,但不确定。根据这篇文章,我将使用request.META来访问所有的请求头?我会特别寻找这个请求头
X-request-With-XMLHttpRequest
一个decorator可以访问它所修饰的函数调用的所有参数,所以我不确定我是否理解第一个要点。请记住,我一般都是Python新手。我怀疑会是这样,但不确定。根据这篇文章,我将使用request.META来访问所有的请求头?我会特别寻找这个请求头X-request-With-XMLHttpRequest
谢谢。回复非常彻底…感谢您抽出时间。谢谢。非常彻底的回应…感谢您的时间。