《Python实战进阶》专栏 No.3:Django 项目结构解析与入门DEMO

news/2025/2/22 18:36:59

《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 中动态加载配置。
python"># manage.py
import os
import sys

def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.dev')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed?"
        ) from exc
    execute_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 中定义博客文章模型:

python">from django.db import models
from django.utils import timezone

class 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... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

3. 创建视图和模板

blog/views.py 中定义视图函数:

python">from django.shortcuts import render, get_object_or_404
from .models import Post

def 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 中定义路由:

python">from django.urls import path
from . import views

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('<int:pk>/', views.post_detail, name='post_detail'),
]

在主项目的 urls.py 中包含应用的路由:

python">from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),
]

在主项目文件夹 blog_project 下面的 settings.py 配置文件中注册APP和路由:

  • 注册一行 ‘blog’,
# Application definition

INSTALLED_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.niftyadmin.cn/n/5862629.html

相关文章

迅为RK3568开发板篇Openharmony配置HDF控制UART-实操-HDF驱动配置UART-修改HCS配置

对于不同的平台&#xff0c;需要在对应的平台目录修改对应的 hcs 文件&#xff0c;接下来示例为在 rk3568下新增 uart4 uart9 uart7 的修改方法。 修改 vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs 文件&#xff0c;device_info.hcs 中添加以下内容&…

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

List的基本功能(1)

前言 上一节我们结束了对vector的讲解&#xff0c;本节我们主要来讲解一下list的功能&#xff0c;那么废话不多说&#xff0c;我们正式进入今天的学习 List的功能介绍 list的结构我们应该相当的熟悉了&#xff0c;他就是数据结构阶段的带头双向循环链表。之所以采用这样的结构…

Java面试第六山!《MySQL基础知识点》

一、引言 MySQL 作为一款广泛使用的开源关系型数据库管理系统&#xff0c;在软件开发领域占据着重要地位。无论是小型项目还是大型企业级应用&#xff0c;都能看到 MySQL 的身影。今天就来和大家分享 MySQL 的相关知识&#xff0c;帮助大家更好地应对日常开发和面试。 二、My…

【详细讲解在STM32的UART通信中使用DMA机制】

详细讲解在STM32的UART通信中使用DMA机制 目录 详细讲解在STM32的UART通信中使用DMA机制一、DMA机制概述二、DMA在UART中的作用三、DMA的配置步骤四、UART初始化与DMA结合五、DMA传输的中断处理六、DMA与中断的结合使用七、注意事项与常见问题八、代码示例九、总结 一、DMA机制…

NetLogon 权限提升漏洞

参考文章&#xff1a;CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客 域控机器账户&#xff1a;WIN-0V0GAORDC17 域控 ip&#xff1a;192.168.72.163 域内攻击者机器 ip&#xff1a;192.168.72.158&#xff0c;host&#xff1a;WIN10-01 攻击者 kali…

Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用

功能预览 一、工具简介 PDF 分割工具支持以下核心功能: 拖放或上传 PDF 文件:用户可以通过拖放或点击上传 PDF 文件。两种分割模式: 指定范围:用户可以指定起始页和结束页,提取特定范围的内容。固定间距:用户可以设置间隔页数(例如每 5 页分割一次),工具会自动完成分…

Rust编程语言入门教程(八)所有权 Stack vs Heap

Rust 系列 &#x1f380;Rust编程语言入门教程&#xff08;一&#xff09;安装Rust&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;二&#xff09;hello_world&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;三&#xff09; Hello Cargo&#x1f…