压制;?下一步=废话;在django的行为';s登录\所需的装饰程序

压制;?下一步=废话;在django的行为';s登录\所需的装饰程序,django,django-authentication,Django,Django Authentication,我喜欢django的@login\u required decorator,但有一件事我不知道该怎么做 如果未经身份验证的用户尝试访问@login_必需的页面(例如“/private stuff/”),我想将他们踢回主页(例如“/home/”)。但我不想在url中附加“?next=”参数。换句话说,我只想重定向到“/home/”,而不是“/home/?next=/private stuff/” 我该怎么做?有没有比只写我自己的装饰师更好的方法呢?嗯,我可以想到两种方法。首先,这是一种“正确”的方

我喜欢django的@login\u required decorator,但有一件事我不知道该怎么做

如果未经身份验证的用户尝试访问@login_必需的页面(例如“/private stuff/”),我想将他们踢回主页(例如“/home/”)。但我不想在url中附加“?next=”参数。换句话说,我只想重定向到“/home/”,而不是“/home/?next=/private stuff/”


我该怎么做?有没有比只写我自己的装饰师更好的方法呢?

嗯,我可以想到两种方法。首先,这是一种“正确”的方式,因为您没有破坏任何功能,只是添加了新的功能:创建您自己的
login\u required
decorator。但问题是Django确实隐藏了登录后重定向功能,它需要很多部分。实际上,只是围绕的包装器,它反过来调用,正是该视图将
next
param添加到查询字符串中。在自定义decorator中,您可以将此功能的全部或部分直接滚动到decorator中,但您需要参考所有三个功能以获得必要的代码

另一个简单得多的选项是创建一些中间件来删除querystring(如果已设置):

from django.conf import settings
from django.http import HttpResponseRedirect

class RemoveNextMiddleware(object):
    def process_request(self, request):
        if request.path == settings.LOGIN_URL and request.GET.has_key('next'):
            return HttpResponseRedirect(settings.LOGIN_URL)
然后,将该中间件的导入路径添加到
中间件\u类
。记住,在请求阶段,中间件是从前到后或自顶向下处理的,换句话说。这应该在请求阶段相对较早地出现,但是您可能需要对它进行一些处理,以了解在它之前可以出现什么和不能出现什么


这种方法唯一真正的问题是它“破坏”了下一个重定向功能,而且不是以一种非常直观的方式,如果后来的开发人员继承了您的代码库以及允许重定向的授权,这可能会有点混乱

这不只是因为:

@decorators.login_required(redirect_field_name=None)

你真的试过这个吗?这是几个月前的事了,但我想我试过重定向_url=None,但没有成功。是的,我在Django的当前版本中试过。请注意,参数是
redirect\u field\u name
,而不是
redirect\u url
。这是标准@login\u必需功能的一部分吗?我在django文档中找不到任何引用,签名是
需要登录的([redirect\u field\u name=redirect\u field\u name,login\u url=None])
,那么问题是什么呢?难道不是
@login\u required(redirect\u field\u name=None)
。。。这并不一定在所有地方都有效。例如,
@method\u decorator
被设计为将
self
作为参数,可以在不同的场景中工作。。。has_密钥已弃用。改为使用“in”。@patrickbass但它不是不推荐使用的,它在Python 3中被完全删除。我已将答案更新为与python3兼容。Python 2已经过时了,我想知道为什么2017年人们仍然使用它。最好添加一些上下文来解释您的答案,而不仅仅是简单的代码。这使得它不仅对提问者更有帮助,而且对将来可能有同样问题的人也更有帮助。有关更多信息,请参见上的这些指南:)
login(request, user)
if request.POST['next']:
    return redirect(request.POST['next'])
else:
    msg = u"Welcome..."
    return render_to_response('members/welcome.html', {'msg':msg},
                                              context_instance=RequestContext(request))