我在我们的代码中做了一些重构。@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