Django项目

1.项目系统设计:

  • menu:菜单设计
  • playground:游戏界面
  • settings:设置界面

2.项目文件结构:

  • templates:管理html文件

  • urls:管理路由,即链接与函数的对应关系

  • views:管理https函数

  • models:管理数据库函数

  • static:管理静态文件

    • css:对象的格式,比如位置、长宽、颜色、背景、字体大小等
    • js:对象的逻辑,比如对象的创建与销毁、事件函数、移动、变色等
    • image:图片
    • audio:声音
  • consumers:管理websocket函数

  • scripts:该文件夹和game同级,用于编写shell脚本,把game/static/js/src中的js代码都压缩到一个js文件中,也可以使用各种压缩软件

3.项目初始化

将所添加的appurlsviewsmodels删除,创建urlsviewsmodelsstatic文件夹, 便于管理

在settings里添加

1
2
3
4
5
6
import os

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = "/static/"
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = "/media/"

a.png

Redis配置

安装django_redis

1
pip install django_redis
  1. 配置settings.py
1
2
3
4
5
6
7
8
9
10
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
},
},
}
USER_AGENTS_CACHE = 'default'
  1. 启动redis-server
1
sudo redis-server /etc/redis/redis.conf

Redis命令

1
2
3
4
5
6
from django.core.cache import cache
cache.keys('*') #查找数据库中的关键字,支持正则表达式(返回的是关键字)
cache.set('ym',1,5) #设置关键字,第三个参数表示多久过期,?None是永不过期(单位是秒)
cache.has_key('') #查询关键字是否存在(返回的是True或者False)
cache.get('') #获取关键字对应的值
cache.delete('') #删除一个关键字

授权登录过程

image-20220715155627118

联机对战

配置 channels_redis

1.安装channels_redis

1
pip install channels_redis

2.配置 acapp/asgi.py

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
import os

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
from game.routing import websocket_urlpatterns

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'acapp.settings')

application = ProtocolTypeRouter({
"https": get_asgi_application(),
"websocket": AuthMiddlewareStack(URLRouter(websocket_urlpatterns))
})

3. acapp/settings.py

INSTALLED_APPS中添加channels,添加后如下所示:

1
2
3
4
5
6
7
8
9
10
INSTALLED_APPS = [ 
'channels',
'game.apps.GameConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

然后在文件末尾添加:

1
2
3
4
5
6
7
8
9
ASGI_APPLICATION = 'acapp.asgi.application'
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [("127.0.0.1", 6379)],
},
},
}

4.配置 game/routing.py

这一部分的作用相当于httpsurls。内容如下:

1
2
3
4
from django.urls import path

websocket_urlpatterns = [
]

5.编写 game/consumers

这一部分的作用相当于httpsviews

参考示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from channels.generic.websocket import AsyncWebsocketConsumer
import json

class MultiPlayer(AsyncWebsocketConsumer):
async def connect(self):
await self.accept()
print('accept')

self.room_name = "room"
await self.channel_layer.group_add(self.room_name, self.channel_name)

async def disconnect(self, close_code):
print('disconnect')
await self.channel_layer.group_discard(self.room_name, self.channel_name)


async def receive(self, text_data):
data = json.loads(text_data)
print(data)

6.启动django_channels

~/acapp目录下执行:

1
daphne -b 0.0.0.0 -p 5015 acapp.asgi:application