如何请求登录以访问任意URL的Django?

3

我的views.py文件里有以下代码:

 @login_required()
 def dadmin(request):

我没有在dapost和dapage中使用@login_required()。

而在url.py中:

url(r'^dadmin/$', dadmin, name='dadmin'),
url(r'^dadmin/post/$', dapost, name='dapost'),
url(r'^dadmin/page/$', dapage, name='dapage'),

每次用户尝试访问domain.com/dadmin/any...时,我希望能重定向到登录页面。我如何做到这一点?而不是在dapost和dapage中放置@login_required()?
2个回答

3

您可以通过使用自定义中间件来实现

将此代码保存为custom_middleware.py文件在您的主应用程序中

from django.shortcuts import redirect


class CheckUser(object):

    def __init__(self, get_response):

        self.get_response = get_response

    def __call__(self, request):

        if not request.user.is_authenticated() and \
                        request.path.startswith('/dadmin/'):
            return redirect("/login/")

        response = self.get_response(request)


        return response

在您的 settings.py 文件中编辑 middleware

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    #custom middlewares
    'app.custom_middleware.CheckUser'
]

成功了。在Python3中,语法错误:调用'print'时缺少括号___ 修复方法print "init working"更改为print("init working")。谢谢! - Sagar Devkota
@DevkotaSagar 删除那行用于调试的代码 print("init working"). - Thameem
那么 def init(self, get_response): 也可以被移除吗? - Sagar Devkota
不是。它是一个构造函数,用于初始化get_response。只需访问此链接以了解有关中间件的更多信息。https://docs.djangoproject.com/en/1.11/topics/http/middleware/ - Thameem
我对那段代码进行了小改动。将我们的条件放在 self.get_response(request) 函数调用之前。因为我们需要在视图被调用之前执行我们的调用。请查看上面的链接,您会得到更多解释。 - Thameem
非常感谢。您能否回答这个问题或者让其他人来回答一下?http://stackoverflow.com/questions/43478355/form-control-in-django-foreignkey - Sagar Devkota

0
如果您在settings.py中设置了LOGIN_URL:

https://docs.djangoproject.com/en/1.8/ref/settings/#login-url

所有匿名用户在访问其视图中带有login_required()装饰器的URL时将被重定向。

编辑:您还可以创建一个自定义的LoginRequiredMiddleware,使用您想要的路径。


我想要重定向到登录页面,无论访问的链接是.com/dadmin/post、.com/dadmin/page还是.com/dadmin/(任何内容)。不仅仅是从views.py中实现。 - Sagar Devkota
为什么不将装饰器放在dapost、dapage和所有需要这种行为的视图中呢? - XaviP
你也可以制作一个自定义的LoginRequiredMiddleware,使用你想要的路径。在答案中进行编辑。 - XaviP

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