django - @login_required 和 is_authenticated() -- 在

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

假设我的 views.py 中有一个 function:

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

login_required 装饰器相同的功能:

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

除了 is_authenticated(),这两个 function 都做类似的检查,如果没有 loggedhomepage 的选项 在.

使用一种优于另一种的任何其他好处以及它们不能互换使用的地方?

谢谢

最佳答案

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

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

但是,@login_required 是“声明性的”,这很好。例如,您可以编写一个脚本,列出所有 View 函数以及它们是否具有 @login_required 装饰器地点。当检查发生在您自己埋藏在函数中的代码中时,您就失去了这种可能性。

所以这实际上是一个开发风格的问题:您是否需要灵 active 来处理这种特殊情况?或者使用声明式风格是否有意义?

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

关于django - @login_required 和 is_authenticated() -- 在 Django 中什么时候使用哪个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22488601/

相关文章:

php - 在尝试使用 phpseclib 创建 SFTP 目录之前检查它是否存在

sapui5 - 禁用诊断工具快捷键

version-control - Mercurial : Change root of named

django - Django 中的弱实体

cartopy - 在 cartopy 轴之间画线

authentication - oAuth 2.0 - 代表用户行事

google-maps-api-3 - 地理距离 : Wolfram Alpha not agree

sql - 有没有办法删除已经绑定(bind)到存储过程的用户定义表类型?

google-chrome-extension - 我可以在我的网站上有一个 chrome 扩展的安

sql - 如何从 Rails 中的数据库中选择具有 ID 的不同记录?