《Python實戰進階》專欄 第3集:Django 項目結構解析與入門DEMO
在本集中,我們將深入探討 Django 的項目結構,并實際配置并運行一個入門DEMO博客網站,幫助你在 Web 開發中更高效地使用 Django。Django 是一個功能強大的 Python Web 框架,它提供了開箱即用的工具和清晰的項目結構,但要真正掌握它,需要理解其內部機制并遵循良好的開發習慣。
本文將涵蓋以下內容:
- Django 項目結構解析
- 項目結構的最佳實踐
- 實際代碼示例:構建一個簡單的博客系統
- 總結與建議
一、Django 項目結構解析
當你運行 django-admin startproject myproject
創建一個新的 Django 項目時,Django 會生成一個默認的項目結構。以下是典型的 Django 項目結構:
myproject/
├── manage.py
├── myproject/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── app1/├── migrations/│ └── __init__.py├── admin.py├── apps.py├── models.py├── tests.py├── views.py└── __init__.py
1. 核心文件說明
- manage.py: 項目的命令行工具,用于運行服務器、遷移數據庫等。
- settings.py: 項目的配置文件,包含數據庫設置、應用注冊、中間件等。
- urls.py: 定義項目的 URL 路由規則。
- wsgi.py: 用于部署 WSGI 應用的入口文件。
- app1/: 這是一個應用目錄,Django 鼓勵將功能模塊化為多個應用。
2. 應用結構說明
每個 Django 應用通常包含以下文件:
- models.py: 定義數據模型。
- views.py: 處理請求并返回響應。
- admin.py: 配置 Django 管理后臺。
- tests.py: 編寫單元測試。
- migrations/: 數據庫遷移文件。
二、項目結構的最佳實踐
項目最終總體結構圖如下:
1. 模塊化設計
Django 提倡“可插拔的應用”理念。每個應用應該專注于一個特定的功能模塊,例如用戶管理、博客文章、評論系統等。這樣可以提高代碼的復用性和可維護性。
建議:
- 將通用功能(如用戶認證、日志記錄)封裝成獨立的應用。
- 使用
INSTALLED_APPS
注冊所有應用。
2. 配置分離
在實際項目中,開發環境和生產環境的配置可能不同。可以通過以下方式實現配置分離:
- 創建
settings/
目錄,分為base.py
,dev.py
,prod.py
。 - 在
manage.py
和wsgi.py
中動態加載配置。
# manage.py
import os
import sysdef main():os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.dev')try:from django.core.management import execute_from_command_lineexcept ImportError as exc:raise ImportError("Couldn't import Django. Are you sure it's installed?") from excexecute_from_command_line(sys.argv)if __name__ == '__main__':main()
3. 遵循 MVC 模式
雖然 Django 更像是 MTV(Model-Template-View),但核心思想是一致的:
- Model: 數據層,負責與數據庫交互。
- Template: 視圖層,負責渲染 HTML。
- View: 控制層,處理業務邏輯。
4. 使用 Django REST Framework (DRF)
如果你需要構建 API,推薦使用 DRF。它可以快速創建 RESTful 接口,并支持序列化、權限控制等功能。
三、實際代碼示例:構建一個簡單的博客系統
我們將通過一個簡單的博客系統來演示 Django 的項目結構和最佳實踐。
1. 創建項目和應用
pip install django
# 等待安裝完成
pip show django
# 顯示Django版本信息,我使用的是最新的 5.1.6版本
Name: Django
Version: 5.1.6
Summary: A high-level Python web framework that encourages rapid development and clean, pragmatic design.
Home-page:
Author:
Author-email: Django Software Foundation <foundation@djangoproject.com>
License: BSD-3-Clause
Location: D:\python_projects\django_demo\Lib\site-packages
Requires: asgiref, sqlparse, tzdata
Required-by:
# 新建一個Django項目,名字為 blog_project
django-admin startproject blog_project
cd blog_project
python manage.py startapp blog
2. 定義數據模型
在 blog/models.py
中定義博客文章模型:
from django.db import models
from django.utils import timezoneclass Post(models.Model):title = models.CharField(max_length=200)content = models.TextField()created_at = models.DateTimeField(default=timezone.now)updated_at = models.DateTimeField(auto_now=True)def __str__(self):return self.title
運行遷移命令以創建數據庫表:
python manage.py makemigrations
python manage.py migrate
命令執行結果:
Operations to perform:Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:Applying contenttypes.0001_initial... OKApplying auth.0001_initial... OKApplying admin.0001_initial... OKApplying admin.0002_logentry_remove_auto_add... OKApplying admin.0003_logentry_add_action_flag_choices... OKApplying contenttypes.0002_remove_content_type_name... OKApplying auth.0002_alter_permission_name_max_length... OKApplying auth.0003_alter_user_email_max_length... OKApplying auth.0004_alter_user_username_opts... OKApplying auth.0005_alter_user_last_login_null... OKApplying auth.0006_require_contenttypes_0002... OKApplying auth.0007_alter_validators_add_error_messages... OKApplying auth.0008_alter_user_username_max_length... OKApplying auth.0009_alter_user_last_name_max_length... OKApplying auth.0010_alter_group_name_max_length... OKApplying auth.0011_update_proxy_permissions... OKApplying auth.0012_alter_user_first_name_max_length... OKApplying sessions.0001_initial... OK
3. 創建視圖和模板
在 blog/views.py
中定義視圖函數:
from django.shortcuts import render, get_object_or_404
from .models import Postdef post_list(request):posts = Post.objects.all().order_by('-created_at')return render(request, 'blog/post_list.html', {'posts': posts})def post_detail(request, pk):post = get_object_or_404(Post, pk=pk)return render(request, 'blog/post_detail.html', {'post': post})# 示例數據,創建一條博客
Post.objects.create(title='新文章標題', content='這是文章的內容')# 示例數據,創建一條博客
Post.objects.create(title='今日日記', content='今天我創建了第一個django項目。')
在 blog_project/blog/templates/blog/
目錄下創建模板文件 post_list.html
和 post_detail.html
:
<!-- post_list.html -->
<h1>Blog Posts</h1>
<ul>{% for post in posts %}<li><a href="{% url 'post_detail' post.pk %}">{{ post.title }}</a></li>{% endfor %}
</ul><!-- post_detail.html -->
<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
<p>Created at: {{ post.created_at }}</p>
4. 配置 URL 路由
在 blog/urls.py
中定義路由:
from django.urls import path
from . import viewsurlpatterns = [path('', views.post_list, name='post_list'),path('<int:pk>/', views.post_detail, name='post_detail'),
]
在主項目的 urls.py
中包含應用的路由:
from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('blog/', include('blog.urls')),
]
在主項目文件夾 blog_project 下面的 settings.py 配置文件中注冊APP和路由:
- 注冊一行 ‘blog’,
# Application definitionINSTALLED_APPS = ["django.contrib.admin","django.contrib.auth","django.contrib.contenttypes","django.contrib.sessions","django.contrib.messages","django.contrib.staticfiles",'blog',
]
- 配置 templates 地址
TEMPLATES = [{"BACKEND": "django.template.backends.django.DjangoTemplates","DIRS": [BASE_DIR / 'templates'],# 如果使用項目根目錄的 templates 文件夾"APP_DIRS": True,"OPTIONS": {"context_processors": ["django.template.context_processors.debug","django.template.context_processors.request","django.contrib.auth.context_processors.auth","django.contrib.messages.context_processors.messages",],},},
]
再次運行遷移命令以更新數據庫表:
python manage.py makemigrations
python manage.py migrate
5. 啟動服務器
運行開發服務器并訪問博客系統:
python manage.py runserver
打開瀏覽器訪問 http://127.0.0.1:8000/blog/
,即可看到博客列表。
要增加博客內容,您可以通過以下幾種方式來豐富您的博客:
如果您使用的是 Django 的模型來存儲博客文章,您可以通過 Django 管理后臺添加更多內容。
- 使用 Django 管理后臺
- 創建超級用戶:
如果您還沒有創建超級用戶,可以在項目根目錄下運行以下命令:
python manage.py createsuperuser
按照提示輸入用戶名、電子郵件和密碼。
- 在 admin.py 中注冊模型
# blog/admin.py
from django.contrib import admin
from .models import Post# 注冊 Post 模型
admin.site.register(Post)
- 訪問管理后臺:
啟動 Django 服務器后,訪問 http://localhost:8000/admin/,使用您剛剛創建的超級用戶登錄。
- 添加博客文章:
在管理后臺中,您應該能看到 Blog 應用下的 Posts(或您定義的模型名稱)。點擊進入后,您可以添加新的博客文章,輸入標題、內容等信息。
四、總結與建議
通過本集的學習,你應該對 Django 的項目結構有了更深入的理解,可以發現,由于出色的封裝,Django成為一個非常容易上手而且功能強大的CMS,是開發個人博客和網站的利器。 以下是一些額外的建議:
- 學習 Django REST Framework:如果需要構建 API,請務必掌握 DRF。
- 編寫單元測試:確保代碼的可靠性。
- 使用 Docker 部署:簡化開發和部署流程。
- 關注性能優化:例如緩存、數據庫索引等。
希望這篇文章對你有所幫助!如果你有任何問題或想法,歡迎在評論區留言討論。
下集預告:第4集將聚焦于 GraphQL 與 RESTful API 對比與實現 。敬請期待!