如何在Django中指定需要登录后重定向的URL?

75

我有一个视图函数:

@login_required
def myview():
    # do something
    # respond something
    pass

我该如何指定要重定向到的视图函数的确切URL?


在 Django 中是否有类似于“logout_required”的功能? - Syed Ali
10个回答

106

78

你可以在视图中这样做,不需要在settings.py中声明,这对我很有效。

from django.contrib.auth.decorators import login_required

@login_required(login_url='/example url you want redirect/') #redirect when user is not logged in
def myview(request):
    do something
    return something #returns when user is logged in

7
这是正确的且完美运作的,但最好始终使用LOGIN_URL,因为登录网址在将来可能会更改,如果不使用LOGIN_URL,则可能需要更改许多地方。 - Yash
2
最好使用URL名称而不是路径,因为它可能随时更改。例如,在以下示例中,re_path(r"login$", LoginView.as_view(template_name="registration/login_form.html"), name="player_login"),装饰器是@login_required(login_url ="player_login"),它将替代设置中的login_url和login_url_redirect。感谢分享。 - Doogle
如果你能说明从哪里导入 login_required 会更好。 - Rishabh Agrahari

16

默认的登录网址是:'/accounts/login/'。如果您想更改它,请前往settings.py。

LOGIN_URL='/path/to/url'
LOGIN_REDIRECT_URL='/path/to/redirecturl'

10

假设我尝试从未经身份验证的用户访问http://mysite/home,此login_url尝试从http://mysite/home/login_user.html进入登录页面。问题在于它保留了/home/路径,因此无法正常工作。有什么想法吗? - Robin

3

前往setting.py文件

您可以在settings.py文件的任何位置添加此内容,但我更喜欢将其放在底部。

LOGIN_URL = '/login/'

注意:'/login/'是将用户带到登录页面的URL段。完整的URL类似于“myexample.com/login/”。


2
我们有两种方法,第一种是为未来的代码维护提供最佳实践,第二种则会在登录URL更改时带来麻烦。
第一种方法:在setting.py中导入reverse_lazy,并将LOGIN_URL设置为登录命名空间。
from django.urls import reverse_lazy
LOGIN_URL = reverse_lazy('login')

在您的代码中,您需要在每个函数前导入login_required和require login

from django.contrib.auth.decorators import login_required

@login_required()
def view_name(request):
    pass

第二种方法
这种方法不可靠,因为您没有定义一个变量来保存您的登录URL命名空间

在您的视图中,您需要在每个函数之前导入login_required和require login

from django.contrib.auth.decorators import login_required

@login_required(login_url='/path/to/login/')
def view_name(request):
    pass

在这两种情况下,静态的是您需要在视图中导入login_required。

1

Django 4+ 让这变得非常容易。

在 urls.py 中确保你有一个带有可引用名称的路径:

path('login/', login_view, name='login_name'),

接下来在settings.py文件中,你只需将以下代码添加到文末:

LOGIN_URL = 'login_name'

现在,所有使用@login_required 装饰器的代码都会自动将未登录用户重定向到登录页面。如果您将来更改了该url,settings.py文件将保持更新,因为它引用名称而不是绝对url路径。
我建议不要使用上述任何“路径/到/url”的方法,因为一旦更改该路径,您就需要更改所有相关内容。只需在settings.py文件中一次引用“login_name”,然后就可以永久完成了。

1
你可以从视图中获取URL。
例如:
path('login/', login_view, name='login_name'),

然后decorator将是
@login_required(login_url='login_name')

我尝试了这个,但对我没有起作用。 - Robin
如果您想使用name属性,必须使用django.urls.reverse函数,例如@login_required(login_url=reverse('login_name')) - Fabian
勘误:在 @login_required() 中不要使用反向操作,否则将会浪费一个小时来调试 :( 它会生成一个“循环”问题,并导致崩溃(即URL不再被识别)。 - Fabian

0

我的登录/注册页面忽略了路径中的?next=...部分,直接重定向到主页 '/'。

通过包含以下内容: <input type="hidden" name="next" value="{{ request.GET.next }}">

在提交按钮后,重定向正常工作。


0
在 Django 项目设置中,添加以下代码。
LOGIN_REDIRECT_URL = 'path/to/url'

接着在你的视图中引入这个LOGIN_REDIRECT_URL,并添加

`@login_required(login_url=LOGIN_REDIRECT_URL)`

如果您想限制视图的顶部,它将起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接