Django 学习记录(AcWing)
Docker,Git环境搭建及项目开发
环境搭建
-
上传镜像
-
开放端口
-
创建Git仓库
目前不理解的点:关于开放端口映射的问题,之后学习;
2022/8/28补充:
Exampal: 使用
hostPort:containerPort格式本地的 80 端口映射到容器的 80 端口,可以执行$ docker run -d -p 80:80 nginx:alpine
-p: 是容器内部端口绑定到指定的主机端口项目创建
建议开tmux开发和运行项目
-
创建一个项目django-admin startproject acapp,会创建一个文件夹acapp,树形结构如图:
acapp
- acapp
__init__.pyasgi.pysettings.pyurls.pwsgi.py
manage.py
- acapp
-
2.打开settings.py,找到ALLOWED_HOSTS=[],修改成ALLOWED_HOSTS=["自己的服务器的公网IP"]
3. 开启项目,运行网站`python3 manage.py runserver 0.0.0.0:8000`,登上自己的网站自己的服务器公网IP:8000,看到Django的页面的小火箭即成功运行,下文的网站即自己服务器的公网IP:80
3. 创建管理员账号,在后台`python3 manage.py createsuperuser`,创建超级用户,之后根据提醒一步一步走即可,在管理页面登录即可
最关键的来了(y总说的):models,views,urls,templates
models,数据库类,定义各种数据类型
views,实现各种函数
urls,路由库
templates,存储html
补充的知识点
1.过滤不需要维护的文件
vim .gitignore # 放在项目的根目录下
**/pycache
/mtk/ #过滤整个文件夹
*.zip #过滤所有.zip文件
/mtk/do.c #过滤某个具体文件
Django 3.1--创建菜单界面
项目系统设计
menu: 菜单界面playground: 游戏界面settings: 设置界面
大体框架为这样,你每个文件夹下也要细分为此;templates目录:管理html 文件urls: 管理路由
修改设置时间;
将新产生的game Django/app 加入到'game.apps.GameConfig'
然后声明静态文件,一般来说,
在 static 存放开发者静态文件
在 media 存放用户静态文件
js 打包脚本NB!
在 templates 文件下创建 menu,playground,settings,multiends文件夹,分别储存三个页面的html文件和终端的html文件
下面是web.html 文件源码:
{% load static %} // js语法糖
<!-- Django 中引入全局setting里的变量 static 的语法-->
<head>
<link rel="stylesheet" href="https://cdn.acwing.com/static/jquery-ui-dist/jquery-ui.min.css">
<script src="https://cdn.acwing.com/static/jquery/js/jquery-3.3.1.min.js"></script>
<!-- 上述两句引入 jQuery 库 -->
<!-- 使用引入的变量 static 的语法如下 -->
<link rel="stylesheet" href="{% static 'css/game.css' %}">
<script src="{% static 'js/dist/game.js' %}"></script>
<!-- 分别引入 css 文件和总的 js 文件 -->
</head>
<body style="margin: 0">
<div id="ac_game_12345678"></div> //创建一个专属id,等学习web知识后来补;
<script>
$(document).ready(function(){
let ac_game = new AcGame("ac_game_12345678") // 创建一个ac_game 对象,让它建立一个 AcGame 对象,在用户端加载渲染
})
</script>
</body>
之后写一下路由,函数;
到此为止的整体流程
输入ip地址后缀为 “” 空,在总路由下面
~acapp/acapp/urls.py/中调用game.urls.index然后跳转到game文件夹下的urls文件,再根据路由进行跳转;例如第一个空后缀,跳转到multiends/web.html,进行相对应的操作,我们采用的是前后端分离开发,所有的 html 渲染都要求在前端完成,开发流程就是,现在 html 里创建好一个有 id 的 div 然后利用 js 文件,捕获到该 div,并进行 渲染 ,因此,该模块的目的就很明确了,先前,在 multiends 的 web.html 文件里设置了一个 id 为 ac_game_12345678 的 div,然后在js / src完成该对象的创建AcGame将 id 传给ac_game,在AcGame里面建立 menu 和 playground界面,代码部分大多是前端知识,等以后学习之后补充!
2022/6/30更新(Django实现登录界面)
存储用户数据
创建新表,每次Python文件夹里都应该有
__init__.py,其中from django.db import models表示继承自models,OneToOneField表示一一对应,on_delete=models.CASCADE表示当数据被删掉时, Player 一起被删掉
执行migrations
每次新定义数据表后,需要将其同步到数据库里。
如上执行 python3 manage.py makemigrations 和 python3 manage.py migrate 两行命令。
getinfo 是从服务器端获取信息,利用ajax,date是前端要什么传什么,还需要一个调用成功的回调函数success,其中resp返回的值就是dist,即getinfo_acapp或者getinfo_web;
整体流程

2022/8/7更新 Django实现匹配机制
实现创建玩家整体流程
当我们点击菜单中的多人模式的时候,我们实例化了
MultiPlayerSocket类,并且把调用类函数send_create_player发送本地玩家信息
在实例化MultiPlayerSocket类的时候就自动和后端建立websocket连接
后端收到信息,先把收到的这个玩家安排到一个房间里,然后向新玩家发送房间中已有玩家的信息
MultiPlayerSocket类收到信息,调用receive_create_player函数把收到的玩家信息实例化
但是注意,以上的2 3 4点都是在实例化MultiPlayerSocket类时发生的,调用类函数send_create_player发送本地玩家信息还没有被执行,也就是说在我们发送本地玩家信息前,我们已经收到了其他玩家的信息。
然后我们发送本地玩家信息给后端,后端receive函数接收,并且调用create_player函数,该函数向房间内其他玩家群发本地玩家的信息
其他玩家调用receive_create_player函数添加了新玩家
实现匹配系统(利用thrift)
版本1.0匹配原则:
是建立连接的时候,给该玩家找到一个合适房间但是暂时不把该玩家加到此房间内,只是说明该玩家属于哪一个房间,等到玩家给我们发送
"create player"事件的时候我们此时才能有此玩家的信息,所以我们此时才能够把该玩家加到房间内部,看到这里有的小伙伴已经发现了小bug,我们在给某个玩家找到合适房间的时候,是按照房间未被创建或者说房间内人数不满,如果匹配房间时找到一个人数差一个就满的房间,那么我们就会说明该玩家属于此房间,但是在此玩家加入进去之前,有另一个玩家也匹配到了这个房间,那不就出现一个房间人数超标的情况,所以要进行修改
版本2.0匹配原则
我们在玩家申请连接的时候只进行连接,不进行匹配房间,等到玩家给我们发送来该玩家信息的时候(也就是
"create player"事件),再匹配房间,同时再把该玩家信息加到房间内部,同时给房间内其他玩家发送,此玩家信息,这样的话找到合适房间与加到房间内部,一气呵成,不会出现房间人数超标情况。(原来那种情况就相当于你去占座,但是你找好位置之后并没有坐下来,而是去上厕所,回来之后你的位置被别人占了,所以就出现超标情况)
详细阐述一下整体流程:
- 点击多人模式后,前端调用函数
outer.mps.send_create_player();向后端传递信息; - 之后在客户端,即
consumers/multiplayer/index.py中调用add_player()函数向匹配服务端发送用户信息- 在
./main.py中,Client端发送来的add_player()会使用class MatchHandler中的add_player()函数,于是匹配服务端会输出"Addplayer ......",并且将新用户添加进消费队列当中;
- 在
- 为
消费者worker开了一个线程,首先尝试从消费队列当中取player出来,如果里面有用户,就讲新用户放进匹配池当中,否则进行匹配,需要注意的是,应该sleep(1),否则就会将服务器资源吃满。 - 当匹配成功后,
先将三名玩家加入同一个组里,之后会向客户端发送用户信息

浙公网安备 33010602011771号