Django学习笔记-概述与项目环境配置

  1. 1. Django概述
  2. 2. 开发环境介绍
  3. 3. 配置Docker环境
  4. 4. Django项目创建
  5. 5. Django App创建
  6. 6. 更改Django项目名称

本文记录 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 直接在云端开发,使用工具:vimtmux 等。不推荐在本地开发。
    • 本项目会涉及多台服务器间的网络通信,如果在本地开发,未来不方便调试和部署。
    • 在本地开发无法统一开发环境,部分 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
2
3
4
5
6
7
8
9
10
11
12
13
docker run -p 20000:22 -p 8000:8000 --name ubuntu_django -itd ubuntu:20.04
docker attach ubuntu_django
apt-get update
apt-get install sudo
apt-get install vim
apt-get install tmux
apt-get install ipython3
apt-get install tree
apt-get install silversearcher-ag
apt-get install openssh-server
adduser asanosaki
usermod -aG sudo asanosaki
exit

然后去云服务器官网放行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
2
3
4
5
6
7
apt-get update
apt-get install python3
apt-get install python3-pip
apt-get install git
pip install Django
pip install uwsgi
pip install supervisor

在命令行查看 Django 版本:

1
django-admin --version

4. Django项目创建

通过以下命令创建一个 Django 项目:

1
django-admin startproject djangoapp

将项目上传至 Git(注意需要先在容器中生成公钥,并在 Git 中添加公钥):

1
2
3
4
5
6
7
8
cd djangoapp/
git init
git config --global user.name "xxx"
git config --global user.email "xxx@qq.com"
git add .
git commit -m "initial project"
git remote add origin git@git.acwing.com:<用户ID>/<仓库名>.git
git push --set-upstream origin master

尝试启动一下项目:

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
2
3
cd djangoapp/  # 此时在 ~/djangoapp/djangoapp 中
vim settings.py
找到 ALLOWED_HOSTS = [],改为 ALLOWED_HOSTS = ["<公网IP>"] # 注意要用引号

Tips:如果找不到 ALLOWED_HOSTS 可以使用 ag 命令查找:

1
ag ALLOWED_HOSTS

现在即可成功访问网址。

此时会看到项目文件夹下出现了一个 __pycache__ 目录,这个是预编译好的一些文件,用于加速 Python 运行,我们在往 Git 上传代码时最好不要上传这些中间文件,我们可以在仓库的根目录下添加一个 .gitignore 文件,文件内容如下:

1
2
**/__pycache__
*.swp # 过滤掉swap文件

最后上传至 Git:

1
2
3
git add .
git commit -m "modify ALLOWED_HOSTS"
git push

5. Django App创建

在上一节中启动的页面为 Django 的默认页面,我们在开发时需要创建一个新的 App 写自己的页面,首先通过以下指令创建一个名为 game 的 App,创建好后当前目录下会生成一个名为 game 的目录:

1
2
3
4
5
python3 manage.py startapp game

git add .
git commit -m "init app game"
git push

此时启动 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.pyviews.py,我们先手动创建剩余的比较重要的文件:

1
2
touch urls.py
mkdir templates

接下来整个项目需要操作的就这四个文件,其中 models.py 存储各种数据结构,views.py 存储视图(函数),例如每点一次按钮都要调用一次服务器端的函数,urls.py 是一个路由,用户访问某个功能(页面)时传的是一个地址(URL),服务器端拿到这个地址后需要做一个路由,查看调用的是哪个函数,templates 存储 HTML 文件。

首先在 views.py 中写一个简单的函数:

1
2
3
4
from django.http import HttpResponse

def index(request):
return HttpResponse('Hello World!')

然后参考 ~/djangoapp/djangoapp/urls.py(总 URL 文件)编写 game 中的 urls.py 文件:

1
2
3
4
5
6
from django.urls import path
from game.views import index

urlpatterns = [
path('', index, name='index')
]

然后我们需要更新一下总 URL 文件(~/djangoapp/djangoapp/urls.py):

1
2
3
4
5
6
7
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('game/', include('game.urls')),
path('admin/', admin.site.urls),
]

此时我们在项目根目录下启动项目: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
2
ROOT_URLCONF = 'NEW_NAME.urls'
WSGI_APPLICATION = 'NEW_NAME.wsgi.application'
  • 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学习笔记-创建菜单界面