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
    头吗
  • 是否也为该请求调用了
    render\u to\u json
    decorator。我们的想法是,如果
    login\u required
    方法知道请求需要json,那么它可以返回json数据包,否则会像正常情况一样重定向
更新添加第三个选项

  • 在任何情况下,使用
    @render\u to_json
    装饰器的方法都会在其前面引用
    @login\u required
    装饰器。如果用户注销,则
    @login\u 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\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
谢谢。回复非常彻底…感谢您抽出时间。谢谢。非常彻底的回应…感谢您的时间。