- 创建游戏管理项目
环境搭建
- 操作系统 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
项目规划
进入项目根目录
$ 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
注册应用
创建应用将会默认生成应用必须的文件,其中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规则同时设置命名空间。
在项目的路由文件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
app_name = "manage"
urlpatterns = [
]
为什么要在项目urls.py
中使用namespace
,在应用的urls.py
中使用app_name
呢?
多个应用之间可能会产生同名的URL,为了避免反转解析URL时出现混淆,使用命名空间做区分。在项目主URL中使用时可采用实例命名空间,即在include
函数中添加namespace
即可。在应用中使用时需要在其URL中定义app_name
变量。
规划MVT
由于manage
将会涉及大量操作模块,将所有的视图编写在应用根目录下views.py
根目录下是不太现实的,同时也不符合功能模块的单一功能原则。计划将每个功能模块作为一个独立的Python文件即module
来实现,每个功能模块中在使用函数或类实现具体的功能点。
为此首先删除掉应用下的默认生成的视图文件,然后创建views
文件夹。
$ rm -rf apps/manage/views.py
$ mkdir -p apps/manage/view
同理将应用默认的模型文件删除后建立models
文件夹以存放模型。
$ rm -rf apps/manage/models.py
$ mkdir -p apps/manage/models
对于模板,默认Django存放在应用下的templates
文件下,手工创建。
$ mkdir -p apps/manage/templates