- 创建游戏管理项目
环境搭建
- 操作系统 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包package
,apps
目录下将存放所有的应用。
$ mkdir apps
$ cd apps
$ touch __init__.py
如果使用PyCharm IDE则按如下操作
- 使用PyCharm在项目根目录下创建
Python Package
命名为apps
- 选中
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
创建应用并指定存放目录有两种方式
- 在项目根目录下使用
python3 manage.py appstart manage
命令创建manage
应用后,拖拽到apps
目录下。
$ python3 manage.py startapp manage
- 首先在
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
网友评论