Django LOGIN_REDIRECT_URL不适用于“下一个”请求参数

时间:2019-02-14 17:17:43

标签: django url redirect login

Django 1.11.3 有关LOGIN_REDIRECT_URL的文档说:

  

登录后将请求重定向到的URL   contrib.auth.login视图没有下一个参数。

我的setting.py中有LOGIN_REDIRECT_URL =“ some_url” 登录时,我在请求url中看到“ next =“(没有值,只有键),因此我怀疑这使Django忽略了LOGIN_REDIRECT_URL,最终进入了Admin默认页面。 我使用默认的登录Django功能,没有自定义模板或其他任何东西。登录(完全没有密钥)以查看是否会(希望)实际使用LOGIN_REDIRECT_URL时,如何摆脱请求中的“ next=”?

2 个答案:

答案 0 :(得分:0)

如果您的settings.py中包含LOGIN_REDIRECT_URL,则如果您不给url提供任何下一个参数,它将使用LOGIN_REDIRECT_URL中提到的默认URL。

如果LOGIN_REDIRECT_URL ='some / path /'

https://yourdomain.com/login/ 将重定向到“ some / path /”

https://yourdomain.com/login/?next=/override/default/path 将重定向到“覆盖/默认/路径”

答案 1 :(得分:0)

这是预期的行为。通常,您希望用户请求任何需要登录的视图(使用@login_required装饰器)在登录后重定向到同一视图。已记录here

由于您的查看网址为空(主网址),因此您得到next=。从用户角度来看,首页上要求登录是非常罕见的,这意味着您看不到要注册的内容。

如果您删除视图的@login_required装饰器,而只在首页上添加一个登录按钮(转到常规LoginView),它将没有next参数,并且您的用户将被重定向到LOGIN_REDIRECT_URL

现在,如果真的希望用户必须登录您的主页并重定向到LOGIN_REDIRECT_URL,则有两个选择:

  • 删除@login_required装饰器,然后在您的视图中进行检查和重定向:

    from django.conf import settings
    
    def homepage(request):
        if not request.user.is_authenticated:
            return redirect(settings.LOGIN_URL)
        # rest of view code
    
  • 如果您使用的是基于类的视图,请在视图中使用LoginRequiredMixin并自己处理handle_no_permission()

    from django.contrib.auth.views import redirect_to_login
    from django.contrib.auth.mixins import LoginRequiredMixin
    
    class Home(LoginRequiredMixin, View):
    
        def get(self):
             # your view code
    
        def handle_no_permission(self):
             # pass None to redirect_field_name in order to remove the next param
             return redirect_to_login(self.request.get_full_path(), self.get_login_url(), None)