コードでリファクタリングを行っています。@render_to_json
デコレータは内部的にメソッドを呼び出していましたis_logged_in
。@login_required
別の明示的なデコレータを追加するだけで、これを削除します。
問題は、いくつかのメソッドがAJAXを介して呼び出され、json応答を期待していて、その応答が{"status": "logged_out"}
実行されることです。したがって、login_requiredメソッドを変更して、2つのことのいずれかをチェックする必要があります。
- このメソッドはAJAXを介して呼び出されましたか、おそらく
XMLHttpRequest
ヘッダーを検出しました - デコレータ
render_to_json
もこのリクエストを求めていました。メソッドがリクエストがjsonを期待していることを知っていれば、login_required
jsonパケットを返すことができ、そうでない場合は通常どおりリダイレクトできると考えられます。
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