Django与MVC(MVT)布局
我之前用过其他基于MVC的框架,现在开始用Django,感觉有点不习惯。比如,在其他MVC框架中,我的布局可能是这样的:
root:
- config (houses the config files (like settings), url.conf, db connections, etc.)
- controllers (houses the main logic of each section of the site. The middle ground between views and models)
- models (handles all the data to be validated and anything that interacts with the database. declares the DB structure. each model a class, each attribute a db field. in django, a template?)
- views (the html displayed to the end user, put together by the controllers)
- tests (all the tests)
- plugins (3rd party apps you install into yours.)
- uploads (user uploaded files)
- public_html (the actual public facing files)
-\ css|js|img (the various static file types for page manipulation)
-\ index.html
这是我习惯的方式,但Django的做法似乎很不一样。以前如果我有一个投票应用,我会这样做:
controllers/PollController.py
models/Poll.py
views/poll/index.py
这样就会在数据库中创建一个投票表。但在Django中,我该怎么做呢?这样的布局可以接受吗?根据我看到的,上面的内容更像是这样:
root:
- project (this would be the main app, and what glues everything together)
--/ settings.py
--/ urls.py
--/ templates/
- apps
-/ Poll
--/ models.py (i would have no Poll.py model, so it would all go in here)
--/ urls.py (any url.conf specific to this model would go in here)
--/ templates/ (the various views for this app)
虽然在某些方面这样做是有道理的,但对我来说感觉很陌生。这样的布局相比于第一个例子中的传统MVC布局有什么好处吗?有没有其他更好的布局?我这个“项目”的目的是建立一个基本框架供我自己使用,我会为这个框架创建几个不同的“应用”。在旧版本中,每个应用只是通过在那个目录下作为插件来扩展主框架。
顺便提一下,我大部分的经验都是在PHP和那一系列框架(主要是cakephp和yii)中,如果这有影响的话。这将是我在Python/Django上的第一个主要项目,我只是想把它做好。
2 个回答
这种布局相比于第一个例子中的传统MVC布局有什么好处吗?
有的。
你所说的“传统MVC”其实只是另一种框架。它并不是神奇地更好或更正确,只是不同而已。
还有其他更受欢迎的布局吗?
可能有成百上千种方法来实现这个。Django选择了一种与Python和网页应用非常契合的方式。
我只是想做好这件事。
那就这样做。
抛掉你之前做过的事情留下的成见。
像个完全的新手一样,从头开始学习Django。
等你学完第六个框架后,才能比较这六个框架。直到你学完六个,每一个都要当作新的、完整的、不同的和独特的来看待。
现在不要比较和对比。
就把Django当作Django,按照Django的方式去做。
(如果想要更形象的建议,可以了解一下Django Reinhardt的音乐;他对吉他的看法和方法都是独一无二的。)
注意事项
root # 没有任何意义
config -- 不存在。
controllers -- 不存在。
models -- 一个包含持久对象类定义的Python模块。与关系数据库的结构相对应。可以有特定于模型的测试。
views -- 一个包含响应请求并生成响应的视图函数的Python模块。
test -- 一个包含视图特定和模板特定测试的Python模块。
plugins -- 不存在。
uploads -- 运行时,而不是应用开发时。
public_html -- 不存在。
css|js|img -- 静态“媒体”文件。运行时,而不是开发时。
index.html -- 不存在。
你遗漏的内容
templates -- 你的HTML模板页面,由视图函数使用。
admin -- 默认管理网站的管理绑定。依赖于模块和表单。
forms -- 表单定义;这些是用于输入验证的表单类。
urls -- 从URL路径到视图函数的映射。
settings -- 包含默认数据库配置、中间件等的模块。
最大的好处就是应用程序是模块化的。你只需要删除一个文件夹,就可以把你的投票应用程序移除,而不是到处找好几个文件夹,逐个删除每个部分。相反,如果你找到一个想用的投票应用程序,只需把那个文件夹放进去就可以了,简单方便。
如果你把网站看作是由几个独立且大部分不同的“应用程序”组成的,并且有一些东西把它们连接在一起,那么这种组织方式就更容易理解了。