【问题标题】:Django is it better to check user.is_authenticated in views.py or in template?Django在views.py或模板中检查user.is_authenticated更好吗?
【发布时间】:2015-09-16 06:29:11
【问题描述】:

我有一个主页,我想在用户未登录时显示登录表单,或者如果他/她已经登录,则显示属于该用户的项目列表。

到目前为止,我想出了两种方法:

  1. 检查用户是否在views.py中被认证并渲染相应的视图(在我的views.py中):

    if request.user.is_authenticated():
        return render(request, 'items.html')
    else
        return render(request, 'login.html')
    
  2. 直接在模板中检查并为每种情况生成相应的HTML(在我的index.html中):

    {% if user.is_authenticated %}
        HTML for my items list
    {% else %}
        HTML for my login form
    {% endif %}
    

问题

那么哪种方法更适合处理这个问题?这些方法的性能差异很大吗?是否有我们应该在 views.py 或模板本身中处理这些的任何标准?

【问题讨论】:

  • 我会将逻辑保留在视图中,并使用单独的特定页面模板进行身份验证(登录/注销)。这不仅更干净,而且允许您在用户尝试直接匿名访问资源时重定向用户。在这种情况下,您可以将它们重定向到登录页面,添加一个 url 参数,该参数将用于在它们成功验证后将它们带回资源页面。
  • 老实说,我更喜欢第一种方法,因为这样我的代码更干净。但是性能呢?直接在模板中移动检查和生成视图会为后端节省一些负载吗?
  • 在我看来,中间件更适合那个任务:middleware example
  • 如果你想为不同的用户状态呈现一个完全不同的页面,第一个可能会起作用。但是,如果您只想更改页面的一部分怎么办?在导航栏上说登录下拉菜单?
  • 是的,确切地说,只更改页面的一小部分,我仍在模板内使用 user.is_authenticated。但我的问题是主要呈现整个页面,将这些模板分开用于不同目的会更干净

标签: python django model-view-controller django-templates


【解决方案1】:

TL;DR

逻辑应该尽可能在你的 python 代码中,而不是你的模板中。由于维护和面向未来的原因

详细说明

  • 代码质量:您可以在 Python 中而不是模板中时测试您的业务逻辑。前者可以提高您的代码质量和您作为开发人员的价值;
  • 面向未来:您不知道您的应用程序将来会使用哪种技术,因此避免技术混合将有助于您升级它(您将能够以不同的速度升级) .
  • Separation of concerns principles:你想要一个像意大利面一样的代码,你不能在不影响其他十个的情况下重构一个东西吗?
  • 代码遗留:您不知道谁将处理您的代码,也不知道您将处理哪些代码。不要让他们为难(这可能是你未来的自己);
  • 简洁的代码:用一种方言表达自己总是比混合语言更好;
  • 知识范围:前端是通常低编程技能的人的责任(HTML/CSS 是声明性的),你不希望他们弄乱你的业务逻辑.

【讨论】:

    【解决方案2】:

    我不认为有很大的性能差异。最重要的是你应该坚持多少MVC模式。

    template 仅用于显示view 提供的某种数据。任何类型的逻辑,比如根据请求者的状态决定显示什么样的数据,都应该由视图来实现。因此,您应该将您的逻辑移动到视图函数中,以使您的设计更加简洁。

    【讨论】:

    • 谢谢,我会记住的。我试图支持您的回答,但我没有足够的声誉来做到这一点。当我有能力时,我会回来投票。 :)
    • 虽然我以某种方式同意你的观点,但我认为你不能避免在template 中使用逻辑,因为view 对此一无所知。前任。在导航栏上添加登录用户下拉菜单。我想知道你如何在不使用template 中的逻辑的情况下使用views 来控制它。如果有这样的方法,请分享。 PS。不讽刺。说真的,我想知道是否有这样的方法。
    • @DigitalDouble 你说的是改变“数据”的样子。因此,在模板中做这种事情是完全正常的。 OP 的示例是关于根据用户状态(即数据)呈现不同的模板。所以我说,这种事情应该在视图中处理,而不是在模板中处理,因为您决定显示哪些数据,而不是它的外观。
    【解决方案3】:

    这取决于您的 html。如果您只想根据条件更改一小部分代码,请检查模板内部:

    {% if user.is_authenticated %}
        <h3>Welcome</h3>
    {% else %}
        <a href="/path/to/login">Login</a>
    {% endif %}
    

    但如果items.htmllogin.html 是不同且大的模板,您绝对应该在视图中进行登录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 2012-03-20
      • 2019-11-19
      • 2011-01-06
      • 1970-01-01
      • 2017-09-08
      • 2011-09-07
      相关资源
      最近更新 更多