2

我没有看到使用@login_required装饰器和is_authenticated(): 之间的明显区别,我认为它们执行类似的检查(尽管不完全是)。

假设我有function一个views.py

def dosomethingNow(request):
     if request.user.is_authenticated():
         //carry out the function
     else:
          //redirect to login page

function装饰器相同login_required

@login_required
def dosomethingNow(request):
     //carry out the function

两者都进行function类似的检查,除了 ,如果不在is_authenticated(),则提供重定向到的选项。homepagelogged

使用其中一个的任何其他好处以及它们不能互换使用的地方?

谢谢

4

1 回答 1

2

就您在示例代码中使用它们的方式而言,它们本质上是等价的。

使用user.is_aunthenticated更灵活(正如您所注意到的,您可以决定如果它们不是要做什么 - 输出不同的模板,重定向到登录表单,重定向到其他地方等)

但是,@login_required是“声明性的”,这可能很好。例如,您可以编写一个脚本,列出所有视图函数以及它们周围是否有@login_required装饰器,这样您就有了一份关于站点“需要登录”部分的漂亮报告。当检查发生在您自己埋在函数中的代码中时,您就失去了这种可能性。

所以这真的是一个开发风格的问题:你需要灵活性来处理这种特殊情况吗?或者使用声明式风格是否有意义?

(而且,如果你想要一个不同的实现,但需要一种声明式的风格——比如,如果你经常想将未登录的用户重定向到主页,你可以编写自己的装饰器@homepage_if_not_auth,并使用它)

于 2014-03-18T19:06:17.337 回答