项目的目录结构(特别是在Flask上)

本文将回答导致许多程序员浪费时间的问题:未来或现有项目应使用哪种目录结构? 哪种结构不仅对于当前的项目构想是最佳的,而且将来在扩展项目或将其分成多个部分时不会那么痛苦?

根源


因此,我们开始了该项目。 让它成为myapp最简单的项目。 我们在要开发的主文件夹中为其创建目录(我有这个Devel)。

mkdir myapp cd myapp 

将来,所有操作都将在主项目目录中

吉特


初始化一个空的存储库

 git init 

.gitignore


 #   *.pyc *.pyo **/__pycache__/ #      **/config/ #       **/data/ **/logs/ #        (  ) **/bin/ 

读我


下一步是创建所需的自述文件。 该文件包含我们未来项目的主要和关键描述。 有些人制作了一个名为README.txt的文本/纯文件。 在大型门户网站上,Markdown标准使用名称为README.md的存储库。 我更喜欢html,因为 我可以更方便地进行颜色选择,嵌入链接,图片和其他多媒体,在浏览器中打开,在<pre>和<code>标记中嵌入代码段,使用现成的框架(例如Bootstrap)进行装饰以及在Hogwarts之外进行其他操作。 因此,名称为README.html

 touch README.html 

如果项目是由多个团队进行的,那么我建议每个团队在每个独立开发的模块,组件,库等中都有自己的README文件。

应用程式


我以与项目目录相同的方式命名主应用程序目录。 就本文而言,myapp

 mkdir myapp touch myapp/__init__.py 

模块和组件


在应用程序目录中,默认情况下会创建__init__.py,其中包含应用程序的初始化代码,并将所有必要的部分连接到应用程序。 特别是,这些是单分支URL的蓝图,或者是单独服务的逻辑的名称空间,但是具有不同的URL(一个简单的示例是为博客文章服务创建名称空间,其中形式/页面和/页面/ ID显然存在不同的路径)

 mkdir myapp/bp_component touch myapp/bp_component/__init__.py 



 mkdir myapp/ns_component touch myapp/ns_component/__init__.py 

数据库模型


数据库模型包含数据库初始化代码以及连接。 当然,还有表和关系的结构。 还希望根据应用程序的业务逻辑在单独的文件中选择表。 将表和链接的几种类别描述到一个单独的文件中非常方便,因为您可以通过将所需的文件复制到另一个项目中或使用共享库中的文件的符号链接轻松地重用代码,以用于不同项目。

 mkdir myapp/models touch myapp/models/__init__.py touch myapp/models/page.py 

模板引擎的模板


某些应用程序(主要是Web应用程序)的特征在于使用模板来生成叶子页面。 由于主要目标是将可执行代码与数据表示分离,因此此步骤将提供程序员和设计师并行工作的可能性,从而帮助团队节省大量时间,精力和金钱。

 mkdir myapp/templates mkdir myapp/templates/html mkdir myapp/templates/js mkdir myapp/templates/css 

我注意到在这种情况下,js和css子目录不是用于存储静态JavaScript库或CSS样式的,而是用于可变代码,参数代码或嵌入代码的。 例如,如果有一个日历绘图组件,其按钮具有附加功能,则将日历组件放入js,并在html文件中启用该组件,但带有必需的参数会更加方便。 也许这对某人来说似乎很可惜,但是它比创建现成的静态日历库要好得多,并且半年或一年后才知道您需要向组件添加更多三个属性和方法(例如,不仅要以一个月的形式创建日期选择器,并添加了将其转换为日历一年的功能),里面有什么样的魔力,没人会记住。 插入物将提高透明度。

静力学


在这里,所有永不改变(或很少改变)的主要样式都是样式,图片,声音,JS库和框架。

 mkdir myapp/static mkdir myapp/static/css mkdir myapp/static/js mkdir myapp/static/images 

功能库


连接库的难易程度主要取决于应用程序核心的语言和框架。 没有从存储库连接并由独立开发人员支持的库。 这是您自己的帮助程序功能。 例如,在处理路由时但在调用main函数之前,我有一些装饰器函数。

 mkdir myapp/lib touch myapp/lib/__init__.py 

设置和配置


如何存储定义全局应用程序设置的设置? 在这方面有多少打架没有计算在内。 没有细节,我该怎么做:我将其作为Python模块存储在单独的目录中。 不同启动模式的内部文件。

 mkdir config echo "CONFIG = 'config.devel'" > config/__init__.py touch config/devel.py touch config/prod.py 

为什么是py? 是的,因为XML,YAML,INI和其他废话的解析在很容易创建手头形式的变量时并没有传递给任何人:

 import os DEBUG = True TITLE = 'SpecialistOff.NET' DIR_BASE = '/'.join(os.path.dirname(os.path.abspath(__file__)).split('/')[:-1]) DIR_DATA = DIR_BASE + '/data' DIR_FILES = DIR_DATA + '/files' MIMETYPES = { 'gif': 'image/gif', 'jpg': 'image/jpeg', 'jpeg': 'image/jpeg', 'png': 'image/png', 'txt': 'text/plain' } SERVERS = [ {'name': 'server1', 'IP': '8.8.8.8', 'port': '80'} ] 

资料


操作期间加载的文件,日志和其他数据存储在单独的数据目录中

 mkdir data mkdir data/files 

测试中


测试模块和固定装置

 mkdir tests mkdir tests/fixture touch tests/__init__.py touch test.py chmod +x test.py 

该文件


所有项目文档应分开存放。 我为此使用doc目录,并将其存储为带有index.html入口点的静态网页。 这很方便,因为我可以通过任何Web服务器共享一个单独的文档目录。 或使用任何网络浏览器(包括控制台(如lynx,elinks))直接从目录浏览。

 mkdir doc touch doc/index.html 

部署方式


这完全取决于任务。 而且,在评论中(我的拙见)并不是特别需要。

 mkdir deploy touch deploy/requirements.txt touch deploy/build.sh mkdir deploy/config touch deploy/config/__init__.py touch deploy/config/demo.py mkdir deploy/cron touch deploy/cron/myapp mkdir deploy/docker touch deploy/docker/Dockerfile touch deploy/docker/docker-compose.yml mkdir deploy/nginx touch deploy/nginx/myapp.conf mkdir deploy/uwsgi touch deploy/uwsgi/conf.ini mkdir deploy/uwsgi/conf.d touch deploy/uwsgi/conf.d/myapp.conf 

记录中


在这里,您可以为测试启动或应用程序本身的结论添加日志。

 mkdir logs 

辅助脚本和实用程序


 mkdir utils touch utils/useradd.py chmod +x utils/useradd.py 

而不是结论


原则上就是这样。 我为什么这么简洁? 因为代码比我自己更能代表我。 我的其余评论可能会混淆或引发关于哪种方法更好/更坏的争论。

Source: https://habr.com/ru/post/zh-CN421887/


All Articles