我该如何在我的URL中使用login_required装饰器?

25

我想检查用户是否对某些URL授权。我正在使用通用视图。

这里的文档说可以将login_required作为可选参数传递,但我不确定。可能是这样:(r'^$', 'archive_index', link_info_dict, 'coltrane_link_archive_index', login_required=True,),

我想在URL中使用login_required修饰符。这可行吗?我该怎么做?

from django.conf.urls.defaults import *

from coltrane.models import Link

link_info_dict = {
    'queryset': Link.live.all(),
    'date_field': 'pub_date',
}

urlpatterns = patterns('django.views.generic.date_based',
    (r'^$', 'archive_index', link_info_dict, 'coltrane_link_archive_index'),

    (r'^(?P<year>\d{4})/$', 'archive_year', link_info_dict, 'coltrane_link_archive_year'),

    (r'^(?P<year>\d{4})/(?P<month>\w{3})/$', 'archive_month', link_info_dict, 'coltrane_link_archive_month'),

    (r'^(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{2})/$', 'archive_day', link_info_dict, 'coltrane_link_archive_day'),

    (r'^(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{2})/(?P<slug>[-\w]+)/$', 'object_detail', link_info_dict, 'coltrane_link_detail'),

)


例如,我该如何保护这个页面(没有视图可以添加login_Required装饰器)?
(r'^$', 'django.views.generic.simple.direct_to_template', {
        'template': 'home.html'
    }, ),

链接已失效。 - Cœur
5个回答

34

要在urls.py中使用装饰器,您需要使用实际函数而不是它们的名称:

from django.contrib.auth.decorators import login_required
import django.views.generic.date_based as views

urlpatterns = patterns('',
    (r'^$', login_required(views.archive_index), link_info_dict,
            'coltrane_link_archive_index'),
    ...

7
在Django 1.11及以上版本中,你可以像你想要的那样直接完成它。例如:
# urls.py

from django.contrib.auth.decorators import login_required

urlpatterns = [
    # Home path
    path('', login_required(TemplateView.as_view(template_name='core/home.html')), name='home'),
    # Another paths
    # ...
]

在这种情况下,每次您尝试进入主页时,都必须先登录,否则您将进入登录界面,然后返回到您的主页。

1

5
您应该透露这是您自己的软件包。 - ggdx

0

对于Django v4.1.4, 除了@catavaran的答案之外,如果您正在使用自定义登录URL而不是Django的默认登录,则需要将自定义URL提供给login_url参数。

urls.py

from django.contrib.auth.decorators import login_required

urlpatterns = [
    path('', login_required(TemplateView.as_view(template_name='app_name/template_name.html'),login_url='/custom_login_url/'), name='path-name'),
]

0

这些文档是针对通用视图的,其与自定义视图略有不同。通常情况下,login_required 用于装饰视图;如果您想在 urlconf 中使用它,则需要编写一个 lambda 来包装视图。


你是在说我不能保护那些URL吗?我不能保护通用视图? - darren

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