【问题标题】:Django Class Based Views - is it bad style to put all code in urls.py?Django 基于类的视图 - 将所有代码放在 urls.py 中是不是很糟糕?
【发布时间】:2015-08-19 18:30:03
【问题描述】:

刚刚完成了一些 CBV 工作,想知道这是否是一种糟糕的风格。通常,您的views.py 中有一个类,urls.py 中有一个用于该视图的 URL。比如:

views.py

from django.views.generic.list import ListView
from project.models import Contact

class ContactList(ListView):
  model = Contact

urls.py

from django.views.generic.list import ListView   
from project.views import ContactList

urlpatterns = [
    url(r'contacts/$', ContactList.as_view()),
]

然后是显示数据的模板。

但是,完全跳过视图代码并在 urls.py 文件中执行所有这些操作怎么样:

from django.views.generic.list import ListView
from project.models import Contact

urlpatterns = [
    url(r'contacts/$', ListView.as_view(model=Contact)),
]

将其全部归入urls.py 文件是不是很糟糕?我的意思是,它消除了views.py 中的多余代码,那不是很好吗?或者这是以牺牲清晰度为代价的减少?

【问题讨论】:

    标签: python django django-class-based-views


    【解决方案1】:

    将视图逻辑排除在 URLConf 之外会更好。 乍一看url(r'contacts/$', ListView.as_view(model=Contact)) 可能看起来不错,但实际上它违反了 Django 设计理念:

    • url、views、models 之间的松耦合已被替换为紧耦合,因此现在您无法重用视图。
    • URL 的灵活性被破坏。继承,CBV 的主要优点是不可能在 URL 中使用它们。
    • 还有很多其他的事情,例如,如果您想添加身份验证怎么办?授权?您需要将所有这些都包装在装饰器中,您的网址很快就会变得混乱。

    所以:

    • 视图模块应包含视图逻辑。
    • URL 模块应包含 URL 逻辑。

    【讨论】:

    • 我当然不相信,在您需要重用该视图之前,您可以使用url(r'contacts/$', ListView.as_view(model=Contact)) - 但显然您在这个阶段没有理由这样做。
    • 将视图的定义从 urls.py 移动到 views.py 无论如何都不会实现松耦合!它只是移动代码!天哪
    • 如果要添加认证怎么办?您仍然可以在 urls.py 中装饰视图。如果您需要更复杂的东西怎么办?然后只需在views.py中声明视图,务实,关心你现在需要什么,而不是你明天可能需要什么
    • @jpic,你明白单词shouldmust的区别吗?
    • 我明白了,但这仍然使您关于松散耦合的说法无效。
    【解决方案2】:

    答案是:视情况而定。

    如果您正在编写一个非常小的应用程序,而且您知道它不会变得更大,那么没关系,除非您无法抗拒代码异味,否则您实际上可以将整个应用程序编写在一个文件中,检查这个 SO 问题的答案,例如 How do I write a single-file Django application?

    P.S:这个问题是普遍的,绝不是 Django 特有的。

    【讨论】:

    • “杀死 MVT”是什么意思?当代码增长时,将其移开,您谈论 MVC 以支持较差的参数,这如何使代码更难阅读,因为您无论如何都要阅读 urls.py 以找出用于特定 url 的视图(除非您当然使用 django-debug-toolbar,否则您就是现在)。把你列入观察名单?天哪……
    • 不得不从 views.py 跳转到 urls.py 来判断视图的作用是代码味道,是的,你说的是对的,我只是通过提到 MVC 离开了这个主题,我可能有其他想法,我没有很好地表达。谢谢
    【解决方案3】:

    嗯,“减少views.py 中的多余代码”当然不是原因。如果你打算用几个简单的参数来实例化通用视图,你可以将它保存在 urls.py 中,只要它适合你。当它不再工作时,可能将其移至views.py 或将视图作为模块并将其移至views/someview.py,没关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 2010-10-18
      • 2013-04-17
      • 1970-01-01
      相关资源
      最近更新 更多