コードでリファクタリングを行っています。@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