
Django官方并没有提供标准的项目结构,于是网上众说纷纭,百花齐放,一千个读者有一千个哈姆雷特。那我们该怎么设计项目结构呢?在回答这个问题之前,先了解一下Django原生的目录和文件都是干嘛的。
project在使用django-admin startproject命令后就会创建这样的目录文件,如下:
mysite/ manage.py mysite/ __init__.py settings.py urls.py asgi.py wsgi.py根目录mysite/根目录的mysite/,仅仅是个目录而已,Django不会拿它做什么,它的名字可以随意修改。
带短横线的根目录
分享一个踩坑经验,有时候我们想把项目名命名为带短横线的,如 hello-world,通过命令直接创建会报错:
...\> django-admin startproject hello-worldCommandError: 'hello-world' is not a valID project name. Please make sure the name is a valID IDentifIEr.startproject不支持直接创建带短横线的项目名。
方法1 加参数
其实!它是支持的,只是我们漏了一个参数。startproject的完整格式为django-admin startproject name [directory],可以在后面追加一个目录参数:
...\> django-admin startproject helloworld hello-world就可以了。根目录是hello-world,里面的project是helloworld。
方法2 改名字
先用helloworld创建,然后再修改,可以①在资源管理器中直接修改文件夹,②也可以在 PyCharm 中修改:
选择Rename directory:
注意去掉勾选Search,不修改其他位置:
只修改这个根目录的名字即可。
manage.pyDjango的命令行工具,使用频繁,格式为:
python manage.py <command> [options]内部mysite.py/Django项目实际使用到的Python包,存放项目配置、URL路由等。
mysite/__init__.py表明这个目录是Python包。
mysite/settings.pyDjango项目配置。
mysite/urls.pyURL路由。
mysite/asgi.py兼容Asgi Web服务器的入口。
mysite/wsgi.py兼容Wsgi Web服务器的入口。
appAsgi和Wsgi,都是一种Python的Web服务网关接口协议,是在CGI通用网关接口,Common Gateway Interface)的标准上构建的。
app是Django项目的应用,一个project可以包含多个app。在使用django-admin startapp命令后就会创建这样的目录文件,如下:
polls/ __init__.py admin.py apps.py migrations/ __init__.py models.py tests.py vIEws.pypolls/app的Python包,可以放在任意路径。修改存放路径,相关配置中的路径也需要修改。
admin.py存放Django自带后台管理的models。
apps.pyapp配置信息,例如:
from django.apps import AppConfigclass PollsConfig(AppConfig): name = 'polls'存放路径不同,name的值也不同。
migrations/Django数据迁移生成的迁移记录文件。
models.py存放app的models。
tests.py单元测试。
vIEws.py视图函数(类)。
urls.pyapp的路由配置,需要手动添加,可通过include()函数导入到mysite/urls.py中,例如:
from django.contrib import adminfrom django.urls import include,pathurlpatterns = [ path('admin/',admin.site.urls),path('polls/',include('polls.urls')),]polls/urls.py:
from django.urls import pathfrom . import vIEwsurlpatterns = [ path('',vIEws.index),]访问xxx/polls/就会路由到vIEws.index。
虽说是百家争鸣,但也有公认的工程化实践。我找了GitHub上star最多的叫做Django Edge的project skeleton,它的设计如下:
top-directory├── docs├── logs├── README.md├── requirements│ ├── base.txt│ ├── development.txt│ └── production.txt├── requirements.txt└── src ├── Your project name │ ├── __init__.py │ ├── logger.py │ ├── settings │ │ ├── base.py │ │ ├── development.py │ │ ├── local.sample.env │ │ └── production.py │ ├── urls.py │ ├── vIEws.py │ └── wsgi.py ├── accounts │ ├── admin.py │ ├── forms.py │ ├── migrations │ ├── models.py │ ├── templates │ ├── tests.py │ ├── urls.py │ └── vIEws.py ├── manage.py ├── media ├── profiles │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations │ ├── models.py │ ├── signals.py │ ├── templates │ ├── tests.py │ ├── urls.py │ └── vIEws.py ├── static │ ├── bootstrap │ │ ├── CSS │ │ ├── Fonts │ │ └── Js │ └── site │ ├── CSS │ ├── ico │ ├── img │ └── Js └── templates非常的像那么回事。我又搜了其他实践的文章,找到了这张图:
国内的文章也有提到类似这2种项目结构的设计,特点是①app放置在单独目录统一管理,②requirements和settings按环境做拆分,等等等。我说说我的观点,一开始没有必要就按照这种标准的工程化实践来写项目,我更倾向于先凭自己的能力写一版,再不断重构和优化的方式。业务不同,能力不同,经验不同,写出来的代码自然也不同。不过在碰到问题时,可以参考借鉴,很可能别人已经提供了解决方案。
小结我看了一些Django开源项目代码,很少见到真像这么设计项目结构的,所以不必过分在意。
本文介绍了Django startproject和startapp命令产生的目录文件的结构和作用。然后给出了工程化项目参考。项目结构没有标准,只有适用于当前的最佳实践,可能这就是官方没有给出标准项目结构的原因吧。
总结参考资料:
https://docs.djangoproject.com/en/3.1/intro/tutorial01/
https://django-edge.readthedocs.io/en/latest/Architecture/
https://studygyaan.com/django/best-practice-to-structure-django-project-directories-and-files
以上是内存溢出为你收集整理的Django官方为什么没有标准项目结构全部内容,希望文章能够帮你解决Django官方为什么没有标准项目结构所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)