美文网首页
Django Structure

Django Structure

作者: JunChow520 | 来源:发表于2020-09-21 23:20 被阅读0次
  • 创建游戏管理项目

环境搭建

  • 操作系统 Windows10
  • 开发工具 Pycharm
$ python3 --version
Python 3.8.4
$ pip3 --version
pip 20.2.3 from d:\python\program\python38\lib\site-packages\pip (python 3.8)
$ django-admin --version
3.1.1

PIP安装Django

$ pip3 install django

创建项目

  • 使用django-admin项目管理工具创建Django项目
$ django-admin startproject gmws

环境配置

$ vim gamesite/setting.py

配置项目时区中国

USE_TZ = False
TIME_ZONE = "Asia/Shanghai"

配置语言为中文

LANGUAGE_CODE = "zh-hans"

配置MySQL数据库

  • 使用PIP安装pymysql模块,用于连接MySQL数据库。
$ pip3 install pymysql
  • 项目配置文件中配置默认(default)数据库连接选项以连接MySQL数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'NAME': 'game',
        'USER': 'root',
        'PASSWORD': 'root',
        'OPTIONS': {
            'init_command': 'SET sql_mode="STRICT_TRANS_TABLES"',
            'charset': 'utf8mb4'
        }
    }
}
  • 安装项目默认迁移文件生成项目必需的数据表
$ python3 manage.py migrate

如果手工调整了配置项目的顺序执行管理命令时出现错误

django.core.exceptions.ImproperlyConfigured: Requested setting LANGUAGE_CODE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or
call settings.configure() before accessing settings.

项目规划

进入项目根目录

$ cd gmws

游戏管理项目日后会包含管理后台、官网、代理后台、对外接口等多个子项目,如何使用Django创建出多个子系统的项目工程呢?每个子系统作为一个应用app。对于多个应用为了便于管理维护,统一放置到项目根目录下的apps目录下,与此同时设置apps目录为Python的包package


Python是通过module(模块、功能块)来组织代码的,每个module就是一个Python文件,多个module则是由package包来进行组织的。如果当前目录下存在__init__.py文件则说明当前目录就是一个package包,这里会分为两种情况,没有内容的__init__.py和有内容的。

__init__.py文件的作用是完成package包的初始化,当一个package包被导入时__init.py初始化文件只会执行一次。初始化时首先会检查__init__.py文件中的变量,以确定当前package是否是一个subpackage子包,其次会检查当前package是否为一个module模块,最后才抛出ImportError导入错误的异常信息。


在项目根目录下创建apps目录,同时在apps目录下创建__init__.py文件以标识apps目录是一个Python包packageapps目录下将存放所有的应用。

$ mkdir apps
$ cd apps
$ touch __init__.py

如果使用PyCharm IDE则按如下操作

  1. 使用PyCharm在项目根目录下创建Python Package命名为apps
  2. 选中apps文件夹右键选择"Make Directory as Sources"

创建完apps包之后,项目默认时无法从此目录搜索模块的,因此需要将apps目录添加到Python模块导入的搜索路径os.sys.path环境路径下,这个路径相当于Windows系统中的环境变量path

$ vim settings.py
import os
import sys
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

# 将apps路径添加到Python导入模块的搜索路径下
sys.path.insert(0, os.path.join(BASE_DIR, "apps"))

创建应用

Django默认提供admin的Web应用,用于对数据表进行注册登录和表的增删改查操作。这里需要重新创建自己的后台管理应用,结合系统默认的admin应用提供的便捷工具辅助测试和开发。

进入项目根目录下使用startapp命令创建应用

$ cd gmws

创建应用并指定存放目录有两种方式

  1. 在项目根目录下使用python3 manage.py appstart manage命令创建manage应用后,拖拽到apps目录下。
$ python3 manage.py startapp manage
  1. 首先在apps目录下创建manage文件夹,然后在根目录下执行命令django-admin startapp manage apps/manage创建manage应用。
$ django-admin startapp manage apps/manage

使用django-admin时需要注意可能会出现错误

Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not configured. You must either define
the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.).

注册应用

创建应用将会默认生成应用必须的文件,其中apps.py是应用专有配置文件,它具有一个name属性以标识当前项目的名称。

$ vim apps/manage/apps.py
from django.apps import AppConfig
# 应用配置
class ManageConfig(AppConfig):
    # 应用名称
    name = 'manage'

将当前应用注册到项目中时,会使用apps.manage.apps.ManageConfig路径查找到当前应用,将其添加到settings.py项目配置的INSTALLED_APPS选项中。

$ vim gamesite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apps.manage.apps.ManageConfig',
]

规划URL

项目创建完成后,首先需要注册到项目中,一个项目会包含多个应用。接下来需要将manage应用对应的路由做规划。计划后台使用http://127.0.0.1:8000/manage/module的方式访问。因此需要为manage应用设置主URL规则同时设置命名空间。

路由分组

Django中对路由进行分组,分为项目目录下的主路由urls.py和应用目录下的urls.py子路由,在项目路由文件中使用include函数可以将应用路由文件加载到项目路由中,进行连接。

在项目的路由文件urls.py中添加manage应用的主路由规则

$ vim gmws/urls.py
from django.contrib import admin
from django.urls import path, include, re_path

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r"^manage/", include("apps.manage.urls", namespace="manage"))
]

路由分发

re_path(r"^manage/", include("apps.manage.urls", namespace="manage"))使用正则匹配以manage开头的URL,将其引入到apps.manage.urls文件中,同时为其设置命名空间为manage

接下来进入到manage应用根目录下的urls.py路由文件中,首先要做的是为之前配置的namespace = "manage"声明app_name以产生关联。方便后续在模板和视图中使用反转解析时获取到对应视图。

$ vim apps/manage/urls.py
from django.urls import path, re_path
from apps.manage.apps import ManageConfig

app_name = ManageConfig.name

urlpatterns = [
    
]

为什么要在项目urls.py中使用namespace,在应用的urls.py中使用app_name呢?

多个应用之间可能会产生同名的URL,为了避免反转解析URL时出现混淆,使用命名空间做区分。在项目主URL中使用时可采用实例命名空间,即在include函数中添加namespace即可。在应用中使用时需要在其URL中定义app_name变量。

规划视图

由于manage将会涉及大量操作模块,将所有的视图编写在应用根目录下views.py根目录下是不太现实的,同时也不符合功能模块的单一功能原则。计划将每个功能模块作为一个独立的Python文件即module来实现,每个功能模块中在使用函数或类实现具体的功能点。同时必须将创建出来的views文件夹作为Python包package

为此首先删除掉应用下的默认生成的视图文件views.py,然后创建views文件夹,同时在views文件夹下创建__init__.py文件。

$ rm -rf apps/manage/views.py
$ mkdir -p apps/manage/views
$ touch apps/manage/views/__init__.py

规划模型

将应用默认的模型文件models.py删除后建立models文件夹并设置为Python的包,用于存放所有的模型模块文件。

$ rm -rf apps/manage/models.py

$ mkdir -p apps/manage/models

$ touch apps/manage/models/__init__.py

需要注意的拆分后的模型,在执行迁移命令时会失败,需要在__init__.py将模型导出,同时必须在每个模块的Meta元数据中指定所属的应用。

例如:创建用户资料模型时必须指定Meta类的app_label属性为当前应用的名称manage

$ vim apps/manage/models/profile.py
from django.db import models
from django.contrib.auth.models import User
from apps.manage.apps import ManageConfig

# 用户资料
class Profile(models.Model):
    auid = models.OneToOneField(User, on_delete=models.CASCADE)
    nickname = models.CharField("昵称", max_length=32)
    avatar = models.ImageField("头像", max_length = 255)
    idnumber = models.CharField("身份证号", max_length=32, unique=True)
    phone = models.IntegerField("手机号码", max_length=32, unique=True)
    email = models.EmailField("电子邮箱", max_length=255)
    createtime = models.DateTimeField("创建时间", auto_now_add=True)
    updatetime = models.DateTimeField("更新时间", auto_now=True)
    remark = models.TextField("备注")
    def __str__(self):
        return self.nickname
    class Meta:
        app_label = ManageConfig.name
        ordering=["-createtime"]
        verbose_name="用户资料"
        verbose_name_plural="用户资料"

models目录下的问价添加__init__.py文件中

$ vim apps/manage/models/__init__.py
from apps.manage.models.profile import *

规划模板

对于模板,默认Django存放在应用下的templates文件下,手工创建。

$ mkdir -p apps/manage/templates

相关文章

网友评论

      本文标题:Django Structure

      本文链接:https://www.haomeiwen.com/subject/ojnbyktx.html