Python - Django - 合并两个django项目,将一个项目作为另一个项目的子项目

Python - Django - 合并两个django项目,将一个项目作为另一个项目的子项目

前言

我开发了一个小项目,是BUCT的学生访客申请的后端,叫LetVisit;我校有一个已有的项目,是平安校园管理系统,叫ZJSystem。

LetVisit已经基本开发好且测试好了,但是突然要把LetVisit整合到ZJSystem中。怎么办?重构?太麻烦了。

于是我就想有没有一个较好的合并两个django项目的方法,发现基本上没有。跟着为数不多的文章尝试也失败了。

最后,借助ChatGPT的帮助,成功合并了两个项目,特将方法记录如下。

How

平安校园的目录结构为:

1
2
3
4
5
6
ZJSystem
ZJSystem
urls.py
settings.py
...
manage.py

访客申请后端的目录结构为:

1
2
3
4
5
6
LetVisit
LetVisit
urls.py
settings.py
...
manage.py

现在将LetVisit作为ZJSystem的一个APP并合并到ZJSystem中

首先,将LetVisit整个文件夹移动到ZJsystem/ZJSystem下:

1
2
3
4
5
6
7
8
9
10
11
12
ZJSystem
ZJSystem
LetVisit
LetVisit
urls.py
settings.py
...
manage.py
urls.py
settings.py
...
manage.py

然后,将LetVisit修改为一个APP。怎么做呢?只需要在ZJSystem/ZJSystem/LetVisit/LetVisit/urls.py中添加一段代码:

1
app_name = 'LetVisit'

然后在ZJSystem中使用这个APP。怎么做呢?需要在ZJSystem/ZJSystem/settings.pyINSTALLED_APPS中,加上LetVisit

1
2
3
4
INSTALLED_APPS = [
...
'LetVisit'
]

最后,我们需要做的就是:将访问LetVisit的请求转发给LetVisit这个APP处理。这里,我们可以选择将所有以LetVisit开头的请求转交给LetVisit这个APP。怎么做呢?我们只需要在ZJSystem/ZJSystem/urls.py中添加一行path('LetVisit/', include('LetVisit.urls', namespace='LetVisit'))

1
2
3
4
urlpatterns = [
...
path('LetVisit/', include('LetVisit.urls', namespace='LetVisit'))
]

这样,所有的以LetVisit/开头的请求都会转交给LetVisit这个APP来处理啦!

先别着急,运行一下试试:

1
2
cd ZJSystem
python manage.py runserver

咦?发现LetVisit这个APP报错了:

1
2
    from LetVisit import a
ModuleNotFoundError: No module named 'LetVisit'

这是因为,在单独的LetVisit项目中,LetVisit/manage.pyLetVisit/LetVisit是同级的,因此自然能找到LetVisit这个“包”。但是LetVisit作为ZJSystem的子项目后,运行的是ZJSystem/manage.py,找不到ZJSystem/ZJSystem/LetVisit/LetVisit

怎么办呢?也不难,把LetVisit添加到Python执行路径的环境中就好了。在ZJSystem/ZJSystem/settings.py中,添加:

1
2
3
4
import sys
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
PathToAdd = os.path.join(PROJECT_ROOT, 'LetVisit/')
sys.path.insert(0, PathToAdd)

这样执行ZJSystem时,就能找到LetVisit了。

大功告成。

More

注意,这时候所有对LetVisit的请求的URL都要以LetVisit开头,可能会与原始的地址不匹配,注意修改一下。

相当于对于整个项目ZJSystem来说,127.0.0.1:8000/LetVisit/HelloWord会被转发给LetVisit,但是对于LetVisit来说,它所匹配的URL是HelloWorld,而不是LetVisit/HelloWorld

原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/130248202


Python - Django - 合并两个django项目,将一个项目作为另一个项目的子项目
https://blog.letmefly.xyz/2023/04/19/Other-Python-Django-Merge2DjangoProject/
作者
Tisfy
发布于
2023年4月19日
许可协议