目錄結構
由於大多數網路上及教學,專案大都只含一個 app,而實際上多數商用專案及實際情況都會需多管理多個 apps,這邊就來看看多個 app 的整個專案結構會變如何
先看一開始還沒有拆分多個 Apps 前的 Django 專案結構:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| my_project/ │ ├── manage.py ├── requirements.txt │ ├── backend/ │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ ├── wsgi.py │ ├── api/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── base_views.py │ ├── models.py │ ├── serializer.py │ ├── tests.py │ ├── migrations/ │ ├── urls/ │ ├── product_urls.py │ ├── views/ │ ├── product_views.py │
|
多新增 blog 這個 apps 後的專案結構:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| my_project/ │ ├── manage.py ├── README.md ├── requirements.txt ├── .gitignore ├── .env ├── backend/ │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ ├── wsgi.py │ ├── asgi.py│ ├── api/ │ ├── __init__.py │ ├── products/ │ │ ├── migrations/ │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── models.py │ │ ├── tests.py │ │ ├── views.py │ │ ├── urls.py │ └── blog/ │ ├── migrations/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── models.py │ ├── tests.py │ ├── views.py │ ├── urls.py └── static/ ├── css/ ├── js/ └── images/
|
原本只打算單純的透過在 urls
以及 views
目錄下命名不同的 Ex: product_views.py
、blog_views.py
來區分不同的 API 視圖,
- 但考慮到專案未來擴展性,
models.py
可能會變得非常雜亂及龐大,且不同的資料表欄位可能會衝突,Ex: product 與 blog 都會有 Tag 資料表,這樣會造成混淆及不易管理
- 因此決定將不同的功能拆分成不同的 apps,並各自管理自己的
models.py
、views.py
、urls.py
等
專案目錄結構差別圖

程式修改
apps
由於大幅移動的目錄結構,所以再次執行 python manage.py runserver
時會出現找不到模組的錯誤 ModuleNotFoundError: No module named 'api.apps'
是正常的,這時候就需要進行一些程式碼的調整
首先 apps 的部分就跟先前稍微不同的,大多都是路徑的調整而已,像是 apps.py
就需要調整成 api.products
,這樣 Django 才能正確的辨識到這個 app
產品的:
1 2 3 4 5 6 7 8 9
|
class ApiConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'api.products'
|
文章的
1 2 3 4 5 6
|
class BlogConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'api.blog' verbose_name = "文章管理"
|
settings
然後在 INSTALLED_APPS 中也多註冊新增的 app
1 2 3 4 5 6 7 8 9 10 11
| INSTALLED_APPS = [ ... 'api.products.apps.ProductsConfig', 'api.blog.apps.BlogConfig', 'rest_framework', 'corsheaders', ]
|
urls
然後在專案的路由總管 urls.py
中也要調整路由的設定成我們更新完的路徑
1 2 3 4 5 6 7 8 9
|
urlpatterns = [ path('admin/', admin.site.urls),
path('api/products/', include('api.products.urls')), path('api/blog/', include('api.blog.urls')), ]
|
測試兩個 apps 是否都能正常運行
解決所有路徑問題後,就可以來測試兩個 apps 是否都能正常運行
文章管理後端
views
先簡單的在 blog 中新增一個 API 視圖,並回傳一個 JSON
1 2 3 4 5 6 7 8 9 10 11 12
|
from django.http import JsonResponse from django.views import View
class BlogPostListView(View): def get(self, request): data = { "message": "HEEEEEEEEEEEELLLLOOOOOOOOOOOOOO~~~~~ (BlogPostListView)", "posts": [] } return JsonResponse(data)
|
urls
1 2 3 4 5 6
| from django.urls import path from .views import BlogPostListView
urlpatterns = [ path('', BlogPostListView.as_view(), name='blog-list'), ]
|
成功畫面

產品管理後端
在產品的部分主要會有的問題就是由於先前已經 migrate 過資料表,而 Django 會使用 app_label_modelname 的格式來命名資料表,所以會有 django.db.utils.OperationalError: (1050, "Table 'products_product' already exists")
找不到指定資料表的錯誤
所以先去 MySQL 中刪舊的 api_product
..api_productimage
… 資料表
1
| DROP TABLE api_product,...;
|
再進行一次 migrate 並新增資料就能正常啟動服務了
成功畫面

若您覺得這篇文章對您有幫助,歡迎分享出去讓更多人看到⊂◉‿◉つ~
留言版