Я делаю рефакторинг в нашем коде. Декоратор @render_to_json
внутренне вызывал метод is_logged_in
. Я удаляю это в пользу простого добавления другого явного декоратора @login_required
.
Проблема в том, что некоторые из наших методов вызываются через AJAX и ожидают ответа json {"status": "logged_out"}
, на который они затем воздействуют. Поэтому мне нужно изменить наш метод login_required, чтобы как-то проверить одну из двух вещей.
- Был ли этот метод вызван через AJAX, возможно, обнаружение заголовка
XMLHttpRequest
- Был ли также вызван декоратор
render_to_json
для этого запроса. Мысль заключалась бы в том, что если бы методlogin_required
знал, что запрос ожидает json, то он мог бы вернуть пакет json, иначе перенаправить как обычно.
ОБНОВЛЕНИЕ Добавление третьего варианта.
- В каждом случае метод с декоратором
@render_to_json
, перед ним указывается декоратор@login_required
. Метод@login_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
X-Requested-With XMLHttpRequest
- person commadelimited   schedule 31.01.2013