《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.rhkb.cn/news/23696.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 应用(官网文档解读)

Spring Boot 启动方式 SpringApplication.run(MyApplication.class, args); Spring Boot 故障分析器 在Spring Boot 项目启动发生错误的时候&#xff0c;我们通常可以看到上面的内容&#xff0c;即 APPLICATION FAILED TO START&#xff0c;以及后面的错误描述。这个功能是通过…

win32汇编环境,对话框中使用菜单示例三

;运行效果 ;win32汇编环境,对话框中使用菜单示例三 ;鼠标点击右键时&#xff0c;弹出菜单的功能 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>>>>>>>>>&g…

stm32-电源控制

STM32 的 PWR&#xff08;Power Control&#xff09;外设 是用于管理微控制器电源模式和外设电源控制的模块。通过 PWR 外设&#xff0c;可以实现低功耗模式、电压调节、备份域控制等功能&#xff0c;从而优化系统的功耗和性能。 stm32内部电源框图 电源区域 VDD 供电区&#x…

云计算及其他计算

云计算知识思维导图&#xff1a;https://kdocs.cn/l/cpl2Kizx7IyC 云计算的核心判断标准通常基于美国国家标准与技术研究院&#xff08;NIST&#xff09;的定义&#xff0c;并结合实际应用场景。以下是判断一个服务是否为云计算的关键标准&#xff0c;以及对应的服务类型&#…

mysql之B+ 树索引 (InnoDB 存储引擎)机制

b树索引机制 B 树索引 (InnoDB 存储引擎)机制**引言&#xff1a;****1. 数据页结构与查找**2. 索引的引入**3. InnoDB 的 B 树索引****4. InnoDB B 树索引的注意事项****5. MyISAM 的索引方案 (选读&#xff0c;与 InnoDB 做对比)****6. MySQL 中创建和删除索引的语句** **B 树…

量子计算驱动的金融衍生品定价革命:突破传统蒙特卡洛模拟的性能边界

引言&#xff1a;金融计算的算力困局 某国际投行采用128量子位处理器对亚洲期权组合定价时&#xff0c;其量子振幅估计算法在2.7秒内完成传统GPU集群需要68小时的计算任务。在蒙特卡洛路径模拟实验中&#xff0c;量子随机游走算法将10,000维衍生品的价格收敛速度提升4个数量级…

Web刷题之PolarDN(中等)

1.到底给不给flag呢 代码审计 一道典型的php变量覆盖漏洞 相关知识 什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有&#xff1a;$$使用不当&#xff0c;extract()函数使用不当&#xff0c;parse_str()函数使用不当&…

ShenNiusModularity项目源码学习(12:ShenNius.Common项目分析)

ShenNius.Common项目中主要定义功能性的辅助函数类及通用类&#xff0c;供MVC模式、前后端分离模式下的后台服务使用&#xff0c;以提高编程效率。   ApiResult文件内的ApiResult和ApiResult类定义了通用的数据返回格式&#xff0c;包括状态码、返回消息、返回数据等&#x…

OkHttp使用和源码分析学习(二)

流程及源码分析 OkHttpClient使用过程主要涉及到OkHttpClient、Request、Response、Call、Interceptor&#xff0c;具体参考OkHttp使用。OkHttp在设计时采用门面模式&#xff0c;将整个系统复杂性隐藏&#xff0c;子系统通过OkHttpClient客户端对外提供。 流程 创建 OkHttp…

架构师论文《论湖仓一体架构及其应用》

软考论文-系统架构设计师 摘要 作为某省级商业银行数据中台建设项目技术负责人&#xff0c;我在2020年主导完成了从传统数据仓库向湖仓一体架构的转型。针对日益增长的支付流水、用户行为埋点及信贷审核影像文件等多模态数据处理需求&#xff0c;原有系统存在存储成本激增、实…

政安晨的AI大模型训练实践 九 - 熟悉LLaMA Factory的详细参数含义-基本概念理解一下

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 小伙伴铁子们&#xff0c;上手先熟悉起来训练工具的每一个参数&#xff0c;很重要。 参照我…

【Rust中级教程】2.8. API设计原则之灵活性(flexible) Pt.4:显式析构函数的问题及3种解决方案

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 说句题外话&#xff0c;这篇文章一共5721个字&#xff0c;是我截至目前写的最长的一篇文章&a…

git 克隆及拉取github项目到本地微信开发者工具,微信开发者工具通过git commit、git push上传代码到github仓库

git 克隆及拉取github项目到本地微信开发者工具&#xff0c;微信开发者工具通过git commit、git push上传代码到github仓库 git 克隆及拉取github项目到本地 先在自己的用户文件夹新建一个项目文件夹&#xff0c;取名为项目名 例如这样 C:\Users\HP\yzj-再打开一个终端页面&…

gitlab初次登录为什么登不上去

今天又写了一次gitlab安装后&#xff0c;第一次登录的问题。 gitlab工作笔记_gitlab默认用户名密码-CSDN博客 因为又掉这个坑里了。 # 为什么第一次登录这么难&#xff1f; 第一是因为gitlab启动的时间很长&#xff0c;有时候以为装错了。 第二是初始密码&#xff0c;如果…

华为认证考试证书下载步骤(纸质+电子版)

华为考试证书可以通过官方渠道下载相应的电子证书&#xff0c;部分高级认证如HCIE还支持申请纸质证书。 一、华为电子版证书申请步骤如下&#xff1a; ①访问华为培训与认证网站 打开浏览器&#xff0c;登录华为培训与认证官方网站 ②登录个人账号 在网站首页&#xff0c;点…

【UCB CS 61B SP24】Lecture 11 - Inheritance 4: Iterators, Object Methods学习笔记

本文内容为集合&#xff08;Set&#xff09;的介绍与使用&#xff0c;并通过数组手动实现集合&#xff0c;接着介绍了迭代器&#xff0c;使用迭代器我们能够更方便地遍历集合中的元素。 1. Set 1.1 Set介绍与Java实现类的使用 集合&#xff08;Set&#xff09;是一种常见的数…

sessionStorage问题的思考和解决

通过前端访问成功&#xff0c;直接访问后端接口失败。思考的过程、问题的解决Session和sessionStorage 通过前端访问成功&#xff0c;直接访问后端接口失败。 做黑马点评的使用Redis代替Session实现短信登录的功能时&#xff0c;遇到了一个问题&#xff1a; 就是我设计好代码后…

YOLO11改进-模块-引入混合结构模块Mix Structure Block 提高多尺度、小目标

在图像去雾领域&#xff0c;传统的基于卷积神经网络&#xff08;CNN&#xff09;和 Transformer 的方法存在局限性。CNN 方法大多存在感受野不足的问题&#xff0c;限制了单个像素在神经网络中的参考范围&#xff0c;部分考虑大感受野的 CNN 方法又忽略了图像的多尺度特性&…

MySQL主从架构

MySQL主从架构 MySQL REPLICATION 在实际生产环境中&#xff0c;如果对数据库的读和写都在一个数据库服务器中操作。无论是在安全性、高可用性&#xff0c;还是高并发等各个方面都是完全不能满足实际需求的&#xff0c;因此&#xff0c;一般来说都是通过主从复制&#xff08;…

6层高速PCB设计入门第1~10讲

第一讲 课程介绍 无痛入门&#xff01;6层高速PCB设计&#xff01;_哔哩哔哩_bilibili 第二讲 逻辑派原理图分析 开发板资料文档&#xff1a;https://wiki.lckfb.com/zh-hans/fpga-ljpi/ 最需要注意的信号就是FPGA与DDR3、HDMI交互的信号&#xff0c;其次是GD32读写TF Card的…