我发现one问题与此类似,但不确定解决方案是否最好(它看起来不是很干)并且它已经很老了所以我希望我可以问另一个问题。
我有一个包含各种页面的django项目,要求您登录才能查看它们。如果你没有登录,让django重定向到登录页面是很简单的,但我想做的是用javascript启动模态登录。显然,我可以通过每个链接并手动确定是否需要登录并为这些链接或类别分配类,但我认为必须有更好的方法。
我正在考虑用自己的内置替换内置的url模板标签来检查视图是否需要登录(不确定是否可行)然后如果是,则将url替换为可以使用的内容被javascript识别以指定一个点击处理程序来调出模态。理想的解决方案会以某种方式允许没有javascript的人仍被重定向到登录页面。
我问得太多了吗?
更新
好的,已经提出了一些基本的代码,所以我希望这可能会鼓励有人指出我哪里出错/正确。我认为您可能无法使用模板标签检查视图是否为login_required,因此视图的装饰器可能是最佳选择。
#decorators.py
def AJAX_login_required(view_func):
@wraps(view_func)
def wrapper(request, *args, **kwargs):
if request.is_ajax():
if not request.user.is_authenticated():
return HttpResponse(json.dumps({'login_required': True}), mimetype='application/json')
else:
if request.user.is_authenticated():
return view_func(request, *args, **kwargs)
else:
path = request.get_full_path()
login_url = reverse('login')
return redirect_to_login(path, login_url, 'next')
return wrapper
#views.py
@AJAX_login_required
def view_which_requires_login(request):
//etc.
def view_that_does_not(request):
//etc.
#javascript
$('a').click(function(e) {
var link = $(this).attr('href');
$.ajax({
type:"POST",
url:link,
data:'',
success: function(response){
if (response.login_required) {
//open modal login
return;
}
else {
document.location.href = link;
}
},
error: function(){
document.location.href = link;
}
});
});
我认为这应该会产生我想要的内容,但它确实要求每个不需要登录的页面都能有效地发送两次。一旦进入ajax查询,然后再次重定向页面。还有更好的方法吗?
答案 0 :(得分:0)
就更好的方式而言......您可以创建一个视图,其中包含所有登录所需(或非登录要求)视图的列表。发出对该视图的ajax调用,该调用将发送一个轻量级的json消息。如果不是您的服务器开销,则为您的用户节省带宽。
问题是,您如何获取并保留信息?我尝试使用装饰器来注册视图函数和库。 (这种模式在Django本身很常见,请参阅管理和模板标记系统。)确保您的库对象始终具有计数并将其存储在数据库或缓存中。不要动态编译它 - 听起来像一个很好的管理功能。