Django 学习记录(AcWing)

Docker,Git环境搭建及项目开发

环境搭建

  • 上传镜像

  • 开放端口

  • 创建Git仓库

    目前不理解的点:关于开放端口映射的问题,之后学习;

    2022/8/28补充

    Exampal: 使用 hostPort:containerPort 格式本地的 80 端口映射到容器的 80 端口,可以执行

    $ docker run -d -p 80:80 nginx:alpine

    -p : 是容器内部端口绑定到指定的主机端口

    项目创建

    建议开tmux开发和运行项目

    1. 创建一个项目django-admin startproject acapp,会创建一个文件夹acapp,树形结构如图:

      acapp

      • acapp
        • __init__.py
        • asgi.py
        • settings.py
        • urls.p
        • wsgi.py
      • manage.py

​ 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 里创建好一个有 iddiv 然后利用 js 文件,捕获到该 div,并进行 渲染 ,因此,该模块的目的就很明确了,先前,在 multiendsweb.html 文件里设置了一个 id 为 ac_game_12345678div,然后在 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 makemigrationspython3 manage.py migrate 两行命令。

getinfo 是从服务器端获取信息,利用ajax,date是前端要什么传什么,还需要一个调用成功的回调函数success,其中resp返回的值就是dist,即getinfo_acapp或者getinfo_web;

整体流程

登录流程.jpg

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),否则就会将服务器资源吃满。
  • 当匹配成功后,先将三名玩家加入同一个组里,之后会向客户端发送用户信息
posted @ 2022-04-28 13:09  似是笼中雀  阅读(254)  评论(0)    收藏  举报