Django 中的 login_required 装饰器和 urlresolver.reverse()

Posted

技术标签:

【中文标题】Django 中的 login_required 装饰器和 urlresolver.reverse()【英文标题】:login_required decorator and urlresolver.reverse() in Django 【发布时间】:2010-11-05 01:59:30 【问题描述】:

我对 @login_required 装饰器有几个视图。我将使用 django.core.urlresolvers.reverse() 函数重定向到它们。

我在 urls.py 中写了:

urlpatterns = ('myapp.views',
    '^(?P<key>[-a-zA-Z0-9]+)/some-operation/$', 'some_operation'),
)

在views.py中:

return HttpResponseRedirect(
     reverse('myapp.views.some_operation', kwargs='key': item.key)
)

使得some_operation 视图函数具有@login_required 装饰器。

Django 显示以下错误:

Reverse for '<django.contrib.auth.decorators._CheckLogin object at 0x866782c>' with arguments '()' and keyword arguments ''key': u'ab9d7x'' not found.

似乎 Django 正在尝试为 login_required 装饰器函数找到反向匹配。如何避免这个问题?

【问题讨论】:

【参考方案1】:

我从Django documentation 找到了另一种方法。像这样使用“命名网址”:

urlpatterns = ('myapp.views',
    url('^(?P<key>[-a-zA-Z0-9]+)/some-operation/$', 'some_operation', name='myapp-some-operation'),
)

reverse('myapp-some-operation', kwargs='key': item.key)

【讨论】:

如何在 @login_required 装饰器中传递额外的 kwargs?我做不到 您使用的是哪个版本的 Django?可以使用 url 模板标签来实现吗?

以上是关于Django 中的 login_required 装饰器和 urlresolver.reverse()的主要内容,如果未能解决你的问题,请参考以下文章

Django:在其他装饰器中重用 login_required 装饰器

是否可以使用 login_required 在 django url 中装饰 include(...)?

Django内置auth模块中login_required装饰器用于类视图的优雅方式

Django@login_required用法简介

使用 @login_required 时的 Django 缓存

Django @login_required 删除 https