1. Django 项目创建

2022-11-12 14:05:55 浏览数 (1)

1.1 服务器及Docker环境


1.1.1 云服务器


上线项目需要公网 ip 以及调试需要,因此需提前准备好一个云服务器,购买以及相关环境配置参考:云服务器及 Docker 教程。

其次,在本地或者任何方便的 sell 终端配置好服务器的免密登录,以便随时连接到服务器进行工作。


1.1.2 镜像和容器配置


配置好服务器后,在终端将课程提供的镜像 django_lesson_1_0.tar 上传至服务器:

代码语言:javascript复制
scp /var/lib/acwing/docker/images/django_lesson_1_0.tar server_name:  #server_name 为配置好免密登录的服务器名称

接下来将镜像加载到本地:

代码语言:javascript复制
docker load -i django_lesson_1_0.tar

创建并运行容器,并初始化端口映射:

代码语言:javascript复制
docker run -p 20000:22 -p 8000:8000 --name django_server -itd django_lesson:1.0
  • 若某主机端口被其他容器占用,可以修改端口,如 20022:22
  • 若忘记初始化端口,需要停止并删除该容器,重新创建。
  • 一个主机端口只能被一个容器使用,需要新建端口只能将当前容器 连接容器并创建一个 root 用户,之后配置该容器的免密登录即可。

1.2 配置项目Git环境


打开 tmux 初始化新的 Django 项目:

代码语言:javascript复制
django-admin startproject acapp  #acapp 为项目所在文件夹

然后将 acapp 项目文件夹初始化 git 仓库,便于版本控制管理和维护,且上传云端后可以防止项目丢失。

代码语言:javascript复制
git init  #进入 acapp 中初始化git仓库

将该容器的公钥上传 git,在偏好设置种添加 ssh 密钥,之后 在 git 云端创建新的项目,按照提示在终端里连接仓库。


1.3 尝试运行项目


acapp 文件夹下执行下方指令运行项目:

代码语言:javascript复制
python3 manage.py runserver 0.0.0.0:8000

然后浏览器打开 xx.xx.xx.xx:8000 进入项目界面。

其中 xx.xx.xx.xx 为服务器的公网 ip8000 为接入的端口。

首次打开会提示需要将 xx.xx.xx.xxip 加入到 ALLOWED-HOSTS 中,一般该设置所在文件位置为 /acapp/acapp/settings.py,使用 vim 打开文件 settings.py,找到 ALLOWED-HOSTS 选项添加 ip

顺便找到 settings.py 里的 TIME_ZONE 选项,修改时区为 'Asia/Shanghai',以便照应本地时间。

另一种方法直接全文查找 ag ALLOWED-HOSTS 返回文件位置。

注意

  • 运行后,控制台会显示项目主页的访问请求信息,按 Ctrl c 结束进程。
  • 更新的一些相关前端文件在运行时会事实更新,控制台也会返回报错信息。

1.4 创建Django app


创建一个 Django 子应用:

代码语言:javascript复制
python3 manage.py startapp game  #game 为该子应用的名字

之后的项目开发在这个子应用 game 文件夹下进行。

关闭运行中的控制台,同步数据库:

代码语言:javascript复制
python3 manage.py migrate

创建管理员账号:

代码语言:javascript复制
python3 manage.py createsuperuser

接下来重启控制台:

代码语言:javascript复制
pyhton3 manage.py runserver 0.0.0.0:8000

浏览器打开 xx.xx.xx.xx:8000/admin 进入管理员登录界面,输入创建好的账号即可登录。


1.5 项目架构与逻辑


1.5.1 项目架构


对于每一个 Django 应用来说,基本存在如下结构:

  • models:数据类库,存储预定义的 class
  • views:存储函数及其执行逻辑。
  • urls:存储路由,链接的指向。
  • templates:存储 html 文件。

1.5.2 项目逻辑


game/views.py

views 存储函数及其执行的逻辑:

代码语言:javascript复制
from django.http import HttpResponse

def index(resquest):
    return HttpResponse("lys is a dog")

在如上例子中,当 index() 函数接收到用户的请求的时,就会被调用,执行 HttpResponse("lys is a dog")

game/urls.py

urls 存储了相应的路由,即调用函数链接的指向,此处的路由为 game 子应用的路由:

代码语言:javascript复制
from django.urls import path
from game.views import index # 从game/views.py 里面调用index函数

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

执行语句 path('', index, name = 'game_index') 意思为,在用户访问网站的 /game 目录时(path的路径为 '',即为空路径,默认指向当前目录的根目录)会调用 index 函数。

index 函数的定义及其执行逻辑存储在 game/views.py 中,故需要 from game.views import index,其中 name="index" 表示它在该 urls.py 里的名字。

acapp/urls.py

设置子应用的路由仍需要将其加入到整个项目的路由当中:

代码语言:javascript复制
from django.contrib import admin
from django.urls import path, include

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

此处的 path 为空路径,默认访问整个网站的根目录。由于此时调用的函数是 include('game.urls'),所以相当于访问 /game/urls

对于 game/urls.py 里,我们已经设置了该路由的链接指向,接下来会执行我们在 urls.py 里调用的函数。

综上,利用上面的两个路由,在访问 xx.xx.xx.xx:8000/ 时,实际访问到了 xx.xx.xx.xx:8000/game 界面,并且此时 game/urls.py 执行 game/views.py 中的 index 函数,该函数返回一个字符串 "lys is a dog" 输出在该页面中。

0 人点赞