重定向到管理员进行登录

问题描述 投票:0回答:4

我有一个为网址'site / main /'定义的视图。我希望能够将(未经身份验证的)用户重定向到默认的“/ admin /”页面进行登录,然后在成功登录后重定向到“/ main /”页面。我按照django文档,但我必须遗漏一些东西,因为我无法让它工作。我的观点如下:

def main(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('admin/?next=%s' % request.path)
    else:

我收到一个错误:

找不到页(404) 请求方法:GET 请求网址:http:// sitename:8080 / main / admin /?next = / main /

任何帮助是极大的赞赏 !

django
4个回答
5
投票

你错过了URL中的初始//admin/?next=...

但是这仍然不起作用,因为admin URL对next参数一无所知。这仅适用于实际的登录视图。使用您的代码,用户将登录管理员,但不会被重定向回您的页面。

您应该构建一个登录模板并将其连接到内置的登录视图。然后,您应该只使用is_authenticated装饰器,而不是在视图中检查login_required

@login_required
def main(request):
   ...

2
投票

你的request.path不应该是/main/。没有第一个尝试它。


1
投票
  1. urls.py: url('^', include('django.contrib.auth.urls')),
  2. 登记/ login.html:

  <h3>Login foo</h3>
    <form method="post" action="">
    {% csrf_token %}
    {{form.as_p}}
    <input type="submit" value="Login">
    </form>
  1. views.py def only_for_users(request):if if request.user.is_authenticated():return HttpResponseRedirect('/ login /?next =%s'%request.path) //获取一些非常有趣的数据 env =(django.get_version(),settings.BASE_DIR,sys.version)envMod = collections.OrderedDict(sorted(sys.modules.items()))return render(request,'env.html',{'env': env,'envMod':envMod})

它适用于Django 1.6并使用内置登录(查看urls.py)和模板。所以你不需要构建一个视图函数。

关于urls的信息


0
投票

如果你想要redirect to admin for login获取特定视图,然后在成功登录后再访问redirect back to the view url,你只需要做两件事:

  1. LOGIN_URL添加到settings.py内的django project module
...
LOGIN_URL = '/admin/login/'
  1. @login_required添加为views.py中的视图函数的装饰器:
from django.contrib.auth.decorators import login_required
...
@login_required
def main(request):

一旦你设置了LOGIN_URL = '/admin/login/',就可以在整个django项目中的任何@login_required上使用view,并将will redirect to admin for loginafter successful login will redirect back用于视图网址。

此外,现在你不需要在视图中使用is_authenticated了,就像Daniel Roseman已经说过的那样。

好消息是,现在您还不需要构建登录模板并将其连接到内置登录视图。

这种方法的好处还在于您可以灵活地轻松地将此类身份验证添加或删除到您想要的任何视图。

© www.soinside.com 2019 - 2024. All rights reserved.