本文主要在Ubuntu环境上搭建,为便于研究理解,采用SSH连接在虚拟机里的ubuntu-24.04.2-desktop
系统搭建,当涉及一些文件操作部分便于通过桌面化进行理解,通过Nginx
代理绑定域名,对外发布。
此为从零开始搭建Django博客
系列的第二篇,计划用一周时间完成一个博客搭建并全程记录,便于学习和跟着操作。
从零开始搭建Django博客①–正式开始前的准备工作
从零开始搭建Django博客②–Django的服务器内容搭建
框架理解
我们已经建立了一个基本的名为myblog
的Django项目,他的框架如下:
# 项目文件夹结构
├── manage.py # Django 项目的管理文件
└── myblog # 项目实际存放目录
├── asgi.py # 运行在 ASGI 兼容的 Web 服务器上的入口
├── __init__.py # 证明该目录此为Python 包。
├── settings.py # Django 项目的配置文件
├── urls.py # Django 项目的 URL 声明,就像你网站的“目录”。
└── wsgi.py # 运行在 WSGI 兼容的Web服务器上的入口
网站构建
在Web应用中,通常有一些业务功能模块是在不同的项目中都可以复用的,故在开发中通常将工程项目拆分为不同的子功能模块,各功能模块间可以保持相对的独立,在其他工程项目中需要用到某个特定功能模块时,可以将该模块代码整体复制过去,达到复用。因此我们每个WEB应用都是有很多不同的子应用组成,在Django
中,通过APP来创建子应用。
为了实现一个博客,我们需要以下三种功能:
![[Pasted image 20250422111023.png]]
创建APP
在根目录下通过以下代码创建三个app子应用
# 创建文章功能
python manage.py startapp article
# 创建用户功能
python manage.py startapp user
# 创建评论功能
python manage.py startapp comment
此时项目文件夹结构如下,可以发现其中除了我们建立的三个文件夹,又生成了一个db.sqlit3
,这是因为在我们未设置数据库信息时,Django
在settings.py
里默认连接的是项目目录里的该数据库。
![[Pasted image 20250422111427.png]]
连接数据库
为了下一步的数据可视化,我们首先配置数据库信息,打开myblog
文件夹目录下的settings.py
配置数据库信息:
![[Pasted image 20250422114305.png]]
安装pymysql
包(用于连接数据库)和cryptography
包(用于处理密码)
在settings.py
同目录下的__init__.py
中导入mysql
包相关功能
import pymysql
pymysql.install_as_MySQLdb()
![[Pasted image 20250422114611.png]]
重新启动Djangond
服务器,无报错说明配置无误。
注册APP
同样在 myblog
文件夹目录下的settings.py
中,找到INSTALLED_APPS配置项,将新创建的3个app添加到项目的app列表,如下
创建模型
在此之前,我们先理解Django
的MVT
模式
- M全拼为Model,负责和数据库交互,进行数据处理。
- V全拼为View,接收请求,进行业务处理,返回应答。
- T全拼为Template,负责封装构造要返回的html。
文章模型
数据需求分析
首先分析文章功能需要哪些数据
数据名 | 标题 | 作者 | 创建时间 | 更新时间 | 正文 | 浏览量 |
---|---|---|---|---|---|---|
id | title | author | created | updated | body | views |
类型 | 字符串 | 时间 | 时间 | 大量文本 | 数字 | |
备注 | 外键约束 |
构建代码
# 文件:article/modle.py
from django.db import models
# 导入django内建的User模型(后面会提)
from django.contrib.auth.models import User
# timezone 用于处理时间相关事务。
from django.utils import timezone
# 用于反向解析,动态生成链接
from django.urls import reverse
# 博客文章数据模型
class ArticlePost(models.Model):
# 文章标题。models.CharField 为字符串字段,用于保存较短的字符串,比如标题
title = models.CharField(max_length=100)
# 文章作者。外键约束,参数 on_delete 用于指定数据删除的方式,链接到(User),只要作者(User)被删除,所有该作者的文章数据都会被删除。
author = models.ForeignKey(User, on_delete=models.CASCADE)
# 文章创建时间。参数 default=timezone.now 指定其在创建数据时将默认写入当前的时间
created = models.DateTimeField(default=timezone.now)
# 文章更新时间。参数 auto_now=True 指定每次数据更新时自动写入当前时间
updated = models.DateTimeField(auto_now=True)
# 文章正文。保存大量文本使用 TextField
body = models.TextField()
# 文章浏览量
total_views = models.PositiveIntegerField(default=0)
# 内部类 class Meta 用于给 model 定义元数据(Django内部类)
class Meta:
# ordering 指定模型返回的数据的排列顺序
# '-created' 表明数据应该以倒序排列
ordering = ('-created',)
# 魔术方法 __str__ 定义当调用对象的 str() 方法时的返回值内容。
def __str__(self):
# return self.title 将文章标题返回
return self.title
# 获取文章地址,按照数据库id解析为url:/article/id
def get_absolute_url(self):
return reverse('article:article_detail', args=[self.id])
评论模型
数据需求分析
首先分析文章功能需要哪些数据
数据名 | 评论文章 | 评论作者 | 评论时间 | 正文 |
---|---|---|---|---|
id | title | author | created | body |
类型 | 字符串 | 时间 | 大量文本 | |
备注 | 外键约束 |
构建代码
from django.db import models
from django.contrib.auth.models import User
from article.models import ArticlePost
# 博文的评论
class Comment(models.Model):
# related_name表示可以反向查询文章和用户的评论
article = models.ForeignKey(ArticlePost,on_delete=models.CASCADE,related_name='comments')
user = models.ForeignKey(User,on_delete=models.CASCADE,related_name='comments')
body = models.TextField()
created = models.DateTimeField(auto_now_add=True)
# 按照创建时间排序
class Meta:
ordering = ('created',)
def __str__(self):
return self.body[:20]
数据迁移
编写好了Model后,接下来就需要进行数据迁移。迁移是Django对模型所做的更改传递到数据库中的方式。
注意,每当对数据库进行了更改(添加、修改、删除等)操作,都需要进行数据迁移。
Django的迁移代码是由模型文件自动生成的,它本质上只是个历史记录,Django可以用它来进行数据库的滚动更新,通过这种方式使其能够和当前的模型匹配。
在命令行中输入命令让 Django知道我们自定义模型有一些变更,并根据我们自定义app的模型生成创建数据表的脚本:
python manage.py makemigrations
python manage.py migrate
数据查看
可以通过查看数据库检查数据迁移效果