《Python實戰進階》專欄 No.3:Django 項目結構解析與入門DEMO

《Python實戰進階》專欄 第3集:Django 項目結構解析與入門DEMO

在這里插入圖片描述


在本集中,我們將深入探討 Django 的項目結構,并實際配置并運行一個入門DEMO博客網站,幫助你在 Web 開發中更高效地使用 Django。Django 是一個功能強大的 Python Web 框架,它提供了開箱即用的工具和清晰的項目結構,但要真正掌握它,需要理解其內部機制并遵循良好的開發習慣。

本文將涵蓋以下內容:

  1. Django 項目結構解析
  2. 項目結構的最佳實踐
  3. 實際代碼示例:構建一個簡單的博客系統
  4. 總結與建議

一、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.pywsgi.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.htmlpost_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,是開發個人博客和網站的利器。 以下是一些額外的建議:

  1. 學習 Django REST Framework:如果需要構建 API,請務必掌握 DRF。
  2. 編寫單元測試:確保代碼的可靠性。
  3. 使用 Docker 部署:簡化開發和部署流程。
  4. 關注性能優化:例如緩存、數據庫索引等。

希望這篇文章對你有所幫助!如果你有任何問題或想法,歡迎在評論區留言討論。


下集預告:第4集將聚焦于 GraphQL 與 RESTful API 對比與實現 。敬請期待!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71592.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71592.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71592.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

每日一題——376. 擺動序列

題目鏈接&#xff1a;376. 擺動序列 - 力扣&#xff08;LeetCode&#xff09; 代碼&#xff1a; class Solution { public:int wiggleMaxLength(vector<int>& nums) {int curdiff 0;int prediff 0;int result 1; for(int i 0;i < nums.size()-1;i){curdiff …

DeepSeek與ChatGPT:AI語言模型的全面技術解析與對比

DeepSeek與ChatGPT:AI語言模型的全面技術解析與對比 一、誕生背景與技術演進路徑 1.1 OpenAI與ChatGPT的生態布局 ChatGPT的研發主體OpenAI成立于2015年,早期定位為非營利性研究機構,核心目標為實現通用人工智能(AGI)。其技術路徑以Transformer架構為基礎,通過堆疊參數規…

[原創](Modern C++)現代C++的關鍵性概念: 學習新算法: std::unique_copy

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 開發工具: Visual Studio、Delphi、XCode、Eclipse…

前端(vue)學習筆記(CLASS 1):vue框架入門

1、vue上手 概念&#xff1a;vue是一個用于構建用戶界面的漸進式框架 vue的兩種使用方式&#xff1a; 1、vue的核心包開發 場景&#xff1a;局部模塊改造 2、vue核心包&vue插件工程化開發 場景&#xff1a;整站開發 1、創建實例 核心步驟 1、準備容器&#xff08;…

synchronized鎖字符串

示例一 在沒有使用synchronized鎖的情況下: import java.util.HashMap; import java.util.Map;public class NonSynchronizedSchoolExample {private static final Map<String, Integer> schoolCountMap new HashMap<>(); // 存儲每個學校的交卷數量public sta…

1.14作業

1 if($x[scheme]http||$x[scheme]https){ $ip gethostbyname($x[host]); echo </br>.$ip.</br>; if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {die(ip!); }echo file_get_contents($_POST[url]);可以DNS重…

Hopper架構 GEMM教程

一 使用 1.1 makefile compile:nvcc -arch=sm_90a -lcuda -lcublas -std=c++17 matmul_h100_optimal.cu -o testrun:./test加入-lcublas,不然會有函數無法被識別 二 代碼分析 2.1 kernel外參數分析 2.1.1 基本參數 constexpr int BM = 64*2;constexpr int BN = 256;cons…

DeepSeek模型快速部署教程-搭建自己的DeepSeek

前言&#xff1a;在人工智能技術飛速發展的今天&#xff0c;深度學習模型已成為推動各行各業智能化轉型的核心驅動力。DeepSeek 作為一款領先的 AI 模型&#xff0c;憑借其高效的性能和靈活的部署方式&#xff0c;受到了廣泛關注。無論是自然語言處理、圖像識別&#xff0c;還是…

數據倉庫、數據湖和數據湖倉

數據倉庫、數據湖和數據湖倉是三種常見的數據存儲和管理技術&#xff0c;各自有不同的特點和適用場景。以下是它們的詳細比較&#xff1a; 1. 數據倉庫&#xff08;Data Warehouse&#xff09; 定義&#xff1a;用于存儲結構化數據&#xff0c;經過清洗、轉換和建模&#xff…

學習aigc

DALLE2 論文 Hierarchical Text-Conditional Image Generation with CLIP Latents [2204.06125] Hierarchical Text-Conditional Image Generation with CLIP LatentsAbstract page for arXiv paper 2204.06125: Hierarchical Text-Conditional Image Generation with CLIP L…

POI pptx轉圖片

前言 ppt頁面預覽一直是個問題&#xff0c;office本身雖然有預覽功能但是收費&#xff0c;一些開源的項目的預覽又不太好用&#xff0c;例如開源的&#xff1a;kkfileview pptx轉圖片 1. 引入pom依賴 我這個項目比較老&#xff0c;使用版本較舊 <dependency><gro…

零基礎學python--------第三節:Python的流程控制語法

Python&#xff0c;浮點數 11.345(單&#xff1a;4個字節&#xff0c; 雙&#xff1a;8個字節) 。 十進制的數字25 ---> 11001 講一個小數轉化為二進制&#xff1a; 不斷的乘以2 。取整數部分。 十進制的0.625 ----> 二進制&#xff1a; 0&#xff0c; 101 。 0.3 ---…

2025.2.21 Restless And Brave

今天是2025年的2月21日&#xff0c;星期五。 距離考研出分還有兩天半的時間。 這種時候&#xff0c;我想考的特別好的同學或者考的特別差的同學都不會太焦慮&#xff0c;只有我這種考的不上不下的人才會焦慮。 我曾不止一次的想過如何面對失敗&#xff0c;但每每想到這個問題…

骶骨神經

骶骨腫瘤手術后遺癥是什么_39健康網_癌癥 [健康之路]匠心仁術&#xff08;七&#xff09; 勇闖禁區 骶骨腫瘤切除術

DeepSeek智能測試知識庫助手PRO版:多格式支持+性能優化

前言 測試工程師在管理測試資產時,需要面對多種文檔格式、大量文件分類及知識庫的構建任務。為了解決這些問題,我們升級了 DeepSeek智能測試知識庫助手,不僅支持更多文檔格式,還加入了 多線程并發處理 和 可擴展格式支持,大幅提升處理性能和靈活性。 主要功能亮點: 多格…

Ubuntu編譯ZLMediaKit

下載 git clone https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init安裝工具 sudo apt install -y build-essential sudo apt install -y gcc g sudo apt install -y cmakesudo apt install -y build-essential cmake git libssl-dev libsdl1.…

如何做接口自動化測試?

一、前言 接口通俗來講就是前端和后段之間傳輸數據的橋梁&#xff0c;注意&#xff1a;不是每一個項目都有接口&#xff0c;一些大型項目是前后端分離的&#xff0c;那么他們怎么實現數據的傳遞和返回呢&#xff1f;在通俗來講就是前端和后段都有一個模擬參數數據 二、接口自…

數據分析和數據挖掘的工作內容

基本的數據分析工作通常包含以下幾個方面的內容&#xff1a; 確定目標&#xff08;輸入&#xff09;&#xff1a;理解業務&#xff0c;確定指標口徑。獲取數據&#xff1a;數據倉庫&#xff08;SQL提數&#xff09;、電子表格、三方接口、網絡爬蟲、開放數據集等。清洗數據&am…

基于Python+Vue開發的反詐視頻宣傳管理系統源代碼

項目簡介 該項目是基于PythonVue開發的反詐視頻宣傳管理系統&#xff08;前后端分離&#xff09;&#xff0c;這是一項為大學生課程設計作業而開發的項目。該系統旨在幫助大學生學習并掌握Python編程技能&#xff0c;同時鍛煉他們的項目設計與開發能力。通過學習基于Python的反…

StarRocks FE leader節點CPU使用率周期性的忽高忽低問題分析

背景 本文基于 StarRocks 3.3.5 最近在做一些 StarRocks 相關的指標監控的時候&#xff0c;看到了FE master的CPU使用率相對其他FE節點是比較高的&#xff0c;且 呈現周期性的變化&#xff08;周期為8分鐘&#xff09;&#xff0c; 于此同時FE master節點的GC頻率相對于其他節…