python-Django项目实战-2

286 阅读9分钟

1 项目架构设计

我们对音乐网站的需求与设计有了大概了解,下一步根据需求搭建项目的目录结构。

  • 首先在命令提示符窗口或者pyCharm中创建Django项目,项目命名为music
  • 然后在项目中分别创建项目应用index、ranking、play、comment、search和user(配置文件记得添加)
  • 并在每个项目应用中创建子路由文件urls.py
  • 最后在项目的根目录中创建media、publicStatic和templates文件夹

整个项目的目录结构如图所示:

企业微信截图_20230509205549.png

在settings.py配置文件添加app

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'index',
    'ranking',
    'user',
    'play',
    'search',
    'comment',
]

新建的项目应用和文件夹说明如下:

1 媒体资源文件夹(media)

用于存放歌曲文件、歌曲图片、歌词文件等资源文件,这类资源文件的变动频率较高,因此与静态资源分开不同的存储路径。在 media 文件夹中分别创建 songFile、songLyric和songImg文件夹,每个文件夹说明如下;

  • songFile存放歌曲的文件
  • songLyric存放歌词的文件
  • songImg存放歌曲封面的文件

2 静态资源文件夹(publicStatic)

存放网页的CSS样式文件、JavaScript脚本文件和网页图片文件等静态资源。

由于项目创建了多个应用,如果在每个应用里面单独创建静态文件夹,当更新或修改网页布局时,就不利于日后的维护和管理。

在 publicStatic 文件夹中分别创建css、font、image、js文件夹和favicon.ico文件,说明如下:

  • css文件夹存放网站的CSS样式文件
  • js文件夹存放网站的JavaScript脚本文件
  • font文件夹存放网站字体的文件
  • image文件夹存放网站设计的图片
  • favicon.ico文件是网站的图标

3 模板文件夹(templates)

存放模板文件,本项目一共使用9个模板文件,每个模板文件的说明如下:

  • base.html:定义项目的公用模板文件
  • index.html:实现音乐网站首页
  • ranking.html:实现榜单排行页面
  • play.html:实现歌曲播放页面
  • comment.html:实现歌曲点评页面
  • search.html:实现歌曲搜索页面
  • user.html:实现用户注册和登录页面
  • home.html:实现用户中心页面
  • 404.html:实现404和500异常页面

2 功能配置

项目的目录结构设计并不是一成不变的,不同的需求与设计都会导致项目的目录结构有所不同。

下一步对项目进行相关配置,配置信息主要在配置文件settings.py中完成。

首先确保新建的项目应用index、ranking、paly、comment、search和user写入配置属性INSTALLED_APPS里面,然后在配置属性MIDDLEWARE中添加中LocaleMiddleware,使Admin后台系统支持中文语言。

配置代码如下:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    # 添加中间键 LocaleMiddleware
    'django.middleware.locale.LocaleMiddleware',
]

项目的数据存储采用MySQL数据库,我们在MySQL中创建数据库music_db,并在配置属性DATABASES中设置MySQL的链接方式。

配置代码如下:

# 设置数据库连接信息
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'music_db',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

最后将静态资源文件夹publicStatic和媒体资源文件夹media引入Django的运行环境,同时将Django内置用户模型User改为项目应用user的自定义模型MyUser,配置代码如下:

# 配置自定义用户表MyUser
AUTH_USER_MODEL = 'user.MyUser'# 静态资源文件路径
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'publicStatic']
STATIC_ROOT = BASE_DIR / 'static'# 媒体资源的保存路径
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

到这里,音乐网站的开发环境基本上已搭建完毕。在整个项目搭建过程中,可以总结出Django开发环境的搭建流程,说明如下:

(1)创建Django项目,根据开发需求创建相应的项目应用、静态资源文件夹、媒体资源文件夹和模板文件夹。

(2)在项目的settings.py中设置功能配置,常用的配置属性有INSTALLED_APPS、MIDDLEWARE、TEMPLATES、DATABASES、STATICFILES_DIRS、MEDIA_URL和MEDIA_ROOT等。

3 数据架构表设计

从网站的开发需求与网站设计得知,歌曲信息是整个网站最为核心的数据。

因此,设计网站的数据结构时,应以歌曲信息为核心数据,逐步向外扩展相关的数据信息。我们将歌曲信息的数据表命名为song。

3.1 歌曲信息表

表字段字段类型含义
idInt类型,长度为11主键
nameVarchar类型,长度为50歌曲名称
singerVarchar类型,长度为50歌曲的演唱歌手
timeVarchar类型,长度为50歌曲的播放时长
albumVarchar类型,长度为50歌曲所属专辑
languagesVarchar类型,长度为50歌曲的语种
typeVarchar类型,长度为50歌曲的风格类型
releaseDate类型歌曲的发行时间
imgVarchar类型,长度为100歌曲封面图片路径
lyricsVarchar类型,长度为100歌曲的歌词文件路径
fileVarchar类型,长度为100歌曲的文件路径
label_idInt类型,长度为11外键,关联歌曲分类表

歌曲信息表记录了歌曲的基本信息,如歌名、歌手、时长、专辑等等,其中歌曲封面、歌词和歌曲文件是以文件路径的形式记录在数据库中的,一般来说如果网站中涉及文件的存储和使用,那么数据库最好记录文件的路径地址。若将文件内容以二进制的数据格式写入数据库,则会对数据库造成一定的压力,从而降低网站的响应速度。

3.2 歌曲分类表

歌曲信息表关联歌曲分类表,我们将歌曲分类表命名为label,歌曲分类表主要实现排行榜的歌曲筛选功能。

表字段字段类型含义
idInt类型,长度为11主键
nameVarchar类型,长度为10歌曲的分类标签

3.3 歌曲动态表

项目需求涉及歌曲的动态信息,因此延申出了歌曲动态表。

歌曲动态表用于记录歌曲的播放次数、搜索次数个下载次数,并且与歌曲信息表实现一对一的数据关系,也就是一首歌曲只有一条动态信息。将歌曲动态表命名为dynamic。

表字段字段类型含义
idInt类型,长度为11主键
playsInt类型,长度为11歌曲的播放次数
searchInt类型,长度为11歌曲的搜索次数
downloadInt类型,长度为11歌曲的下载次数
song_idInt类型,长度为11外键,关联歌曲信息表

3.4 歌曲点评表

该表主要用于歌曲点评页面。

从歌曲点评页面知道,一首歌可以有多条点评的信息,说明歌曲信息表和歌曲点评表存在一对多的数据关系。

将歌曲点评表命名为comment。

表字段字段类型含义
idInt类型,长度为11主键
textVarchar类型,长度为500歌曲的点评内容
userVarchar类型,长度为20用户名
dateDate类型点评日期
song_idInt类型,长度为11外键,关联歌曲信息表

3.5 用户表

还有网站的用户管理功能需要实现。

由用户表提供用户信息。用户表由Django内置模型User扩展而成。

表字段字段类型含义
idInt类型,长度为11主键
passwordVarchar类型,长度为128用户密码
last_loginDatetime类型,长度为6上次登录的时间
is_superuserTinyint类型,长度为1超级用户
usernameVarchar类型,长度为150用户名
first_nameVarchar类型,长度为30用户的名字
last_nameVarchar类型,长度为150用户的姓氏
emailVarchar类型,长度为254邮箱地址
is_staffTinyint类型,长度为1登录Admin权限
is_activeTinyint类型,长度为1用户的激活状态
date_joinedDatetime类型,长度为6用户创建的时间
qqVarchar类型,长度为20用户的QQ号码
weChatVarchar类型,长度为20用户的微信号码
mobileVarchar类型,长度为11用户的手机号码

4 定义模型类

我们根据数据表的数据关系定义项目的模型对象,由于项目所有的项目应用都使用这些模型生成网页内容,而且模型之间存在外键关联,因此将所有关于歌曲信息的模型都定义在项目应用index中。

打开项目应用index的models.py,分别定义模型Label、Song、Dynamic和Comment。

代码如下:

# 歌曲分类表
class Label(models.Model):
    id = models.AutoField('序号', primary_key=True)
    name = models.CharField('分类标签', max_length=10)
​
    def __str__(self):
        return self.name
​
    class Meta:
        # 设置Admin的显示内容
        verbose_name = '歌曲分类'
        verbose_name_plural = '歌曲分类'# 歌曲信息表
class Song(models.Model):
    id = models.AutoField('序号', primary_key=True)
    name = models.CharField('歌名', max_length=50)
    singer = models.CharField('歌手', max_length=50)
    time = models.CharField('时长', max_length=10)
    album = models.CharField('专辑', max_length=50)
    languages = models.CharField('语种', max_length=20)
    type = models.CharField('类型', max_length=20)
    release = models.DateField('发行时间')
    img = models.FileField('歌曲图片', upload_to='songImg/')
    lyrics = models.FileField('歌词', upload_to='songLyric/', default='暂无歌词', blank=True)
    file = models.FileField('歌曲文件', upload_to='songFile/')
    label = models.ForeignKey(Label, on_delete=models.CASCADE, verbose_name='歌名分类')
​
    def __str__(self):
        return self.name
​
    class Meta:
        # 设置Admin的显示内容
        verbose_name = '歌曲信息'
        verbose_name_plural = '歌曲信息'
        
# 歌曲动态表
class Dynamic(models.Model):
    id = models.AutoField('序号', primary_key=True)
    song = models.ForeignKey(Song, on_delete=models.CASCADE, verbose_name='歌名')
    plays = models.IntegerField('播放次数', default=0)
    search = models.IntegerField('搜索次数', default=0)
    download = models.IntegerField('下载次数', default=0)
​
    class Meta:
        # 设置Admin的显示内容
        verbose_name = '歌曲动态'
        verbose_name_plural = '歌曲动态'# 歌曲点评表
class Comment(models.Model):
    id = models.AutoField('序号', primary_key=True)
    text = models.CharField('内容', max_length=500)
    user = models.CharField('用户', max_length=20)
    date = models.DateField('日期', auto_now=True)
    song = models.ForeignKey(Song, on_delete=models.CASCADE, verbose_name='歌名')
​
    class Meta:
        # 设置Admin的显示内容
        verbose_name = '歌曲评论'
        verbose_name_plural = '歌曲评论'

用户表由Django内置模型User扩展而成,它与歌曲信息表并无数据关联,因此将用户表的模型定义在项目应用user的models.py中。

代码如下:

from django.contrib.auth.models import AbstractUser
​
class MyUser(AbstractUser):
    qq = models.CharField('QQ号码', max_length=20)
    weChat = models.CharField('微信账号', max_length=20)
    mobile = models.CharField('手机号码', max_length=11, unique=True)
    # 设置返回值
    def __str__(self):
        return self.username

最后对定义好的模型执行数据迁移。

我们使用数据库可视化工具查看所有关于歌曲信息的数据表,数据表之间的数据关系如下所示:

企业微信截图_20230510194536.png