本文记录 Django 的学习过程。
Django 官方文档:Django Web Docs。
本节内容是 Django 框架的介绍以及本次开发的小游戏项目的环境配置与初始化。
1. Django概述
Django 是后起之秀,近些年越来越流行,Youtube(月活20亿+)、Instagram(月活10亿+)等公司采用了 Django 框架。可以作为 Web、App、小程序、AcWing 云端 App(AC APP)等各种项目的后端。
Django 优势:
- 开发效率高,生态完善,有官方社区长期支持。
- 运行效率高(常见误区:Python 运行效率低,所以 Python 写的应用运行效率低)。
- 项目运行效率瓶颈有很多,比如:数据库查询、网络带宽/延迟、硬盘读写速度等,这些与框架关系不大。
- 计算密集型的模块可以用 C/C++ 实现,然后编译成动态链接库再
import
进来。 - 计算密集型的微服务可以通过
thrift
等工具对接,微服务的Server
端代码可以用 C/C++ 语言实现。 - 有很多工具可以将 Python 代码翻译成 C/C++,比如 Cython、Pypy。AcWing 题库中的不少题目,会发现 Python3 比 Java 还快一些。
- 既适合大公司,也适合个人开发者,平均开发一个 Web/AC App 只需要半个月至一个月。
2. 开发环境介绍
- 完全无需配置本地环境。利用 AC Terminal 直接在云端开发,使用工具:
vim
、tmux
等。不推荐在本地开发。- 本项目会涉及多台服务器间的网络通信,如果在本地开发,未来不方便调试和部署。
- 在本地开发无法统一开发环境,部分 Python 包在 Windows 系统上安装困难。
- 需要租一台具有公网 IP 的云服务器,并安装 Docker。
- 服务器配置无要求。
- 后期可以利用
Docker
随意迁移。
- 在 AC Terminal 的
/var/lib/acwing/docker/images/
目录下给大家提供统一的课程Docker
镜像(也会讲解如何自己配置 Django 开发环境)。- 标准化开发环境,避免未来出现软件版本不兼容。
- 省去配环境的环节。
- 使用 AC Git 管理项目代码。
- 方便回滚代码。
3. 配置Docker环境
首先拉取一个 Ubuntu 镜像:
1 | docker pull ubuntu:20.04 |
创建容器后进入容器配置基本环境并创建用户:
1 | docker run -p 20000:22 -p 8000:8000 --name ubuntu_django -itd ubuntu:20.04 |
然后去云服务器官网放行20000端口和8000端口,以阿里云为例,协议类型选 TCP
,端口范围分别为 目的: 8000/8000
与 目的: 20000/20000
,授权对象都为 源: 0.0.0.0/0
。
通过 SSH 远程连接容器:
1 | ssh asanosaki@localhost -p 20000 |
如果出现 kex_exchange_identification: read: Connection reset by peer
报错,就去进入容器的根用户下编辑 hosts.allow
文件:
1 | vim /etc/hosts.allow |
在文件中添加一行:sshd: ALL
,然后重启 SSH 服务:service ssh restart
。
进入容器根用户安装剩余的环境:
1 | apt-get update |
在命令行查看 Django 版本:
1 | django-admin --version |
4. Django项目创建
通过以下命令创建一个 Django 项目:
1 | django-admin startproject djangoapp |
将项目上传至 Git(注意需要先在容器中生成公钥,并在 Git 中添加公钥):
1 | cd djangoapp/ |
尝试启动一下项目:
1 | python3 manage.py runserver 0.0.0.0:8000 |
这时候访问一下网址:http://<云服务器的公网IP>:8000/
,会看到提示:Invalid HTTP_HOST header: '<云服务器的公网IP>:8000'. You may need to add '<云服务器的公网IP>' to ALLOWED_HOSTS.
,这是因为 Django 是个很安全的框架,会自动屏蔽很多可疑的访问,我们需要将公网 IP 添加到 settings.py
文件的 ALLOWED_HOSTS
中:
1 | cd djangoapp/ # 此时在 ~/djangoapp/djangoapp 中 |
Tips:如果找不到 ALLOWED_HOSTS
可以使用 ag
命令查找:
1 | ag ALLOWED_HOSTS |
现在即可成功访问网址。
此时会看到项目文件夹下出现了一个 __pycache__
目录,这个是预编译好的一些文件,用于加速 Python 运行,我们在往 Git 上传代码时最好不要上传这些中间文件,我们可以在仓库的根目录下添加一个 .gitignore
文件,文件内容如下:
1 | **/__pycache__ |
最后上传至 Git:
1 | git add . |
5. Django App创建
在上一节中启动的页面为 Django 的默认页面,我们在开发时需要创建一个新的 App 写自己的页面,首先通过以下指令创建一个名为 game
的 App,创建好后当前目录下会生成一个名为 game
的目录:
1 | python3 manage.py startapp game |
此时启动 runserver
指令时会发现出现了报错:You have 18 unapplied migration(s). Your project may not work properly ......
,原因是有一部分的数据库修改还没有同步到数据库里,运行以下指令同步数据库的修改:
1 | python3 manage.py migrate |
打开 http://<公网IP>:8000/admin/
页面可以看到 Django 自带的管理员页面,我们可以创建管理员用户(假设用户名和密码都为 admin
):
1 | python3 manage.py createsuperuser |
然后即可登录管理员账户进入管理员界面。
我们再回过头来进入之前创建的 App 中,能看到有几个比较重要的文件:models.py
、views.py
,我们先手动创建剩余的比较重要的文件:
1 | touch urls.py |
接下来整个项目需要操作的就这四个文件,其中 models.py
存储各种数据结构,views.py
存储视图(函数),例如每点一次按钮都要调用一次服务器端的函数,urls.py
是一个路由,用户访问某个功能(页面)时传的是一个地址(URL),服务器端拿到这个地址后需要做一个路由,查看调用的是哪个函数,templates
存储 HTML 文件。
首先在 views.py
中写一个简单的函数:
1 | from django.http import HttpResponse |
然后参考 ~/djangoapp/djangoapp/urls.py
(总 URL 文件)编写 game
中的 urls.py
文件:
1 | from django.urls import path |
然后我们需要更新一下总 URL 文件(~/djangoapp/djangoapp/urls.py
):
1 | from django.contrib import admin |
此时我们在项目根目录下启动项目:python3 manage.py runserver 0.0.0.0:8000
,然后打开网址 http://<公网IP>:8000/game/
即可看到我们的网页,最后更新一下 Git 即可。
6. 更改Django项目名称
我们以 settings.py
文件为例,假设项目的目录结构为:OLD_NAME/OLD_NAME/settings.py
,项目根目录的名称可以随意改变,即我们可以先改为 NEW_NAME/OLD_NAME/...
,然后我们再将第二级 OLD_NAME
目录改为 NEW_NAME
,修改完第二级目录的名字后我们还需要改以下几个文件:
settings.py
1 | ROOT_URLCONF = 'NEW_NAME.urls' |
manage.py
1 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NEW_NAME.settings') |
asgi.py
1 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NEW_NAME.settings') |
wsgi.py
1 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NEW_NAME.settings') |
上一章:无。
下一章:Django学习笔记-创建菜单界面。