Django最好在views.py或模板中检查user.is_authenticated吗?

时间:2015-09-16 06:29:12

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

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

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

  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 %}
    
  3. 问题

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

3 个答案:

答案 0 :(得分:3)

我认为没有太大的性能差异。最重要的是你应该坚持MVC模式。

template只是为了显示view提供的某种数据。任何类型的逻辑,例如决定基于请求者状态显示什么类型的数据,应始终由视图实现。因此,您应该将逻辑移动到视图功能中,以保证设计的清洁。

答案 1 :(得分:1)

TL; DR

  

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

精心

  • 代码质量:您可以在您的python中测试您的业务逻辑,而不是在模板中。前者提高了您的代码质量和作为开发人员的价值;
  • 面向未来:您不知道您的应用将来会使用哪种技术,因此避免技术混合会在升级时帮助您(您可以升级不同的节奏)。
  • Separation of concerns principles:你想要一个意大利面条的代码,你不能在不影响其他人的情况下重构一件事吗?
  • 代码遗留:您不知道谁将会处理您的代码,也不知道您将使用哪种代码。不要让他们变得困难(这可能是你未来的自我);
  • 清洁代码:用单一方言表达自己总是比混合语言更好;
  • 知识范围:前端经常低编程技能的人(HTML / CSS是声明性的)的责任,你不希望他们搞砸你的业务逻辑。

答案 2 :(得分:1)

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

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

但如果items.htmllogin.html是不同的大模板,那么您一定要在视图中进行登录。