1

コードでリファクタリングを行っています。@render_to_jsonデコレータは内部的にメソッドを呼び出していましたis_logged_in@login_required別の明示的なデコレータを追加するだけで、これを削除します。

問題は、いくつかのメソッドがAJAXを介して呼び出され、json応答を期待していて、その応答が{"status": "logged_out"}実行されることです。したがって、login_requiredメソッドを変更して、2つのことのいずれかをチェックする必要があります。

  • このメソッドはAJAXを介して呼び出されましたか、おそらくXMLHttpRequestヘッダーを検出しました
  • デコレータrender_to_jsonもこのリクエストを求めていました。メソッドがリクエストがjsonを期待していることを知っていれば、login_requiredjsonパケットを返すことができ、そうでない場合は通常どおりリダイレクトできると考えられます。

UPDATE3番目のオプションを追加します。

  • @render_to_jsonいずれの場合も、デコレータを使用するメソッドでは、デコレータ@login_requiredはその前に参照されます。ユーザーがログアウトすると、メソッド@login_requiredは戻ります。HttpResponseRedirectこの@render_to_jsonメソッドで、login_requiredメソッドの戻りタイプを確認して適切に応答するにはどうすればよいですか?

考え?問題?

私もPythonにかなり慣れていないので、基本的なものが欠けている可能性があることを付け加えておきます。もしそうなら、私が学ぶのを手伝ってください?

アップデート

参考までに、ここに2つのデコレータを追加します。

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
4

1 に答える 1

1

デコレータは、「デコレータ」が受信しているすべてのデータにアクセスできます。

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は今何をすべきかを知っています。

これと同じ方法で、デコレータからデコレータにデータをバブルアップすることもできます。

于 2013-01-31T17:43:35.250 に答える