笔记内容转载自 AcWing 的 Django 框架课讲义,课程链接:AcWing Django 框架课。
1. 配置Docker环境
首先拉取一个 Ubuntu 镜像:
docker pull ubuntu:20.04
创建容器后进入容器配置基本环境并创建用户:
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端口:
通过 SSH 远程连接容器:
ssh asanosaki@localhost -p 20000
如果出现 kex_exchange_identification: read: Connection reset by peer
报错,就去进入容器的根用户下编辑 hosts.allow
文件:
vim /etc/hosts.allow
在文件中添加一行:sshd: ALL
,然后重启 SSH 服务:service ssh restart
。
进入容器根用户安装剩余的环境:
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 版本:
django-admin --version
2. Django项目创建
通过以下命令创建一个 Django 项目:
django-admin startproject djangoapp
将项目上传至 Git(注意需要先在容器中生成公钥,并在 Git 中添加公钥):
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
尝试启动一下项目:
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
中:
cd djangoapp/ # 此时在 ~/djangoapp/djangoapp 中
vim settings.py
找到 ALLOWED_HOSTS = [],改为 ALLOWED_HOSTS = ["<公网IP>"] # 注意要用引号
Tips:如果找不到 ALLOWED_HOSTS
可以使用 ag
命令查找:
ag ALLOWED_HOSTS
现在即可成功访问网址:
此时会看到项目文件夹下出现了一个 __pycache__
目录,这个是预编译好的一些文件,用于加速 Python 运行,我们在往 Git 上传代码时最好不要上传这些中间文件,我们可以在仓库的根目录下添加一个 .gitignore
文件,文件内容如下:
**/__pycache__
*.swp # 过滤掉swap文件
最后上传至 Git:
git add .
git commit -m "modify ALLOWED_HOSTS"
git push
3. Django App创建
在上一节中启动的页面为 Django 的默认页面,我们在开发时需要创建一个新的 App 写自己的页面,首先通过以下指令创建一个名为 game
的 App,创建好后当前目录下会生成一个名为 game
的目录:
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 ......
,原因是有一部分的数据库修改还没有同步到数据库里,运行以下指令同步数据库的修改:
python3 manage.py migrate
打开 http://<公网IP>:8000/admin/
页面可以看到 Django 自带的管理员页面,我们可以创建管理员用户(假设用户名和密码都为 admin
):
python3 manage.py createsuperuser
然后即可登录管理员账户进入管理员界面:
我们再回过头来进入之前创建的 App 中,能看到有几个比较重要的文件:models.py
、views.py
,我们先手动创建剩余的比较重要的文件:
touch urls.py
mkdir templates
接下来整个项目需要操作的就这四个文件,其中 models.py
存储各种数据结构,views.py
存储视图(函数),例如每点一次按钮都要调用一次服务器端的函数,urls.py
是一个路由,用户访问某个功能(页面)时传的是一个地址(URL),服务器端拿到这个地址后需要做一个路由,查看调用的是哪个函数,templates
存储 HTML 文件。
首先在 views.py
中写一个简单的函数:
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World!')
然后参考 ~/djangoapp/djangoapp/urls.py
(总 URL 文件)编写 game
中的 urls.py
文件:
from django.urls import path
from game.views import index
urlpatterns = [
path('', index, name='index')
]
然后我们需要更新一下总 URL 文件(~/djangoapp/djangoapp/urls.py
):
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 即可。
4. 更改Django项目名称
我们以 settings.py
文件为例,假设项目的目录结构为:OLD_NAME/OLD_NAME/settings.py
,项目根目录的名称可以随意改变,即我们可以先改为 NEW_NAME/OLD_NAME/...
,然后我们再将第二级 OLD_NAME
目录改为 NEW_NAME
,修改完第二级目录的名字后我们还需要改以下几个文件:
settings.py
ROOT_URLCONF = 'NEW_NAME.urls'
WSGI_APPLICATION = 'NEW_NAME.wsgi.application'
manage.py
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NEW_NAME.settings')
asgi.py
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NEW_NAME.settings')
wsgi.py
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NEW_NAME.settings')