当前位置:   article > 正文

Python技术栈前后端分离项目(Vue)容器化部署解决方案_vue python

vue python

目录

一、创建一个简单的Vue前端项目(可忽略)

二、使用Flask部署上述Vue打包后的dist(前后端未分离)

三、使用Django部署上述Vue打包后的dist(前后端未分离)

四、容器化部署章节二和章节三输出的项目(前后端未分离)

4.1 乌班图下的Docker安装

4.2 乌班图下 使用Docker部署章节二的Flask项目

4.3 乌班图下 使用Docker部署章节三的Django项目

4.4 镜像迁移(项目迁移)

五、前后端分离下的容器化项目部署

5.1 nginx的安装

5.2 nginx的配置与载入vue打包后的dist

5.3 后端实现

5.4 容器化部署


一、创建一个简单的Vue前端项目(可忽略)

本章节内容为小白向,简述如何创建一个最小化是Vue前端项目并实现项目打包。

准备工具:node.js

在指定目录下新建一个Vue项目,根据执行提示,项目名命名为demo。

npm init vue@latest

这个命令会安装和执行 create-vue,它是 Vue 提供的官方脚手架工具。

根据系统提示运行相应的命令

  1. cd demo
  2. npm install
  3. npm run dev

就可以运行Vue的最小Demo了,运行效果:

现在停止运行服务。

我们有一个小小的需求(模拟正式项目中的前后端通信):就是新建一个http接口访问的轮询,要求每5秒钟请求一次后端/api/name接口,并将返回的结果展示到前端页面中。

安装axios

npm install axios

并且在Vue组件中导入它,以下提供了关键代码(添加在了HelloWorld.vue中):

  1. <template>
  2. <div class="greetings">
  3. <h1 class="green">{{ msg }}</h1>
  4. <h3>
  5. 快臣服在你帅大爷的西装裤下吧<br/>
  6. <a href="https://www.baidu.com/" target="_blank" rel="noopener">呦吼</a> +
  7. <a href="https://www.baidu.com/" target="_blank" rel="noopener">呦吼吼</a>. <br/>
  8. 接口显示结果:{{ responseData }}
  9. </h3>
  10. </div>
  11. </template>
  12. <script>
  13. import axios from 'axios';
  14. export default {
  15. data() {
  16. return {
  17. responseData: null,
  18. intervalId: null, // 用于保存定时器的ID
  19. };
  20. },
  21. methods: {
  22. fetchData() {
  23. axios.get('/api/name')
  24. .then(response => {
  25. // 处理成功响应
  26. this.responseData += response.data;
  27. })
  28. .catch(error => {
  29. // 处理错误
  30. console.error('获取数据时出错:', error);
  31. this.responseData = "接口请求失败";
  32. });
  33. },
  34. },
  35. mounted() {
  36. // 在组件挂载后设置定时器,每隔5秒钟执行一次HTTP请求
  37. this.intervalId = setInterval(() => {
  38. this.fetchData();
  39. }, 5000);
  40. // 初始化时立即执行一次请求
  41. this.fetchData();
  42. },
  43. beforeDestroy() {
  44. // 在组件销毁前清除定时器,避免内存泄漏和不必要的请求
  45. clearInterval(this.intervalId);
  46. },
  47. };
  48. </script>

执行本地编译脚本:

npm run build

本地的前端项目目录下就会生成一个dist文件夹,文件夹内包含前端静态页面及相关的静态资源

二、使用Flask部署上述Vue打包后的dist(前后端未分离)

这也是小型项目传统的部署方式

首先看目录结构:

其次是app.py的源码:

  1. from flask import Flask, render_template
  2. app = Flask(__name__, static_folder='./dist', template_folder='./dist', static_url_path="")
  3. # 提供Vue.js项目的index.html
  4. @app.route('/')
  5. def index():
  6. return render_template('index.html', name='index')
  7. # 前端轮询接口
  8. @app.route('/api/name')
  9. def get_name():
  10. return "帅大爷"
  11. if __name__ == '__main__':
  12. app.run()

 就已经实现章节一所需要的功能了,实现效果如下图,每个5秒钟变更一次DOM内容

正式项目请使用gunicorn等工具部署服务。

该功能建议在小型Demo 开发环境下部署使用,生产环境不建议用该方式。

三、使用Django部署上述Vue打包后的dist(前后端未分离)

使用以下脚本在特定目录下新建一个django项目(需要配置环境变量)

django-admin startproject demo

执行

python manage.py runserver

就可以启动django的最小demo了,但是我们如何实现章节一的需求呢?

后端目录结构:

目录解释说明:

assets是vue打包后dist中的assets拷贝而来

static下的dist也是vue打包后的dist

 在views.py中,配置轮询请求接口,代码如下:

  1. from django.http import HttpResponse
  2. # 配置自定义接口
  3. def get_name(request):
  4. return HttpResponse("帅大爷")

urls.py中,配置路由,代码如下:

  1. from django.urls import path
  2. # 自定义路径引用
  3. from app_demo import views
  4. from django.views.generic.base import TemplateView
  5. urlpatterns = [
  6. path('api/name/', views.get_name),
  7. path('', TemplateView.as_view(template_name='index.html'))
  8. ]

重头戏来了,需要在setting.py中配置静态资源访问地址:

提供部分需要修改配置的代码如下:

  1. # 修改前端渲染页面所在的路径,也就是index.html所以在的路径
  2. TEMPLATES = [
  3. {
  4. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  5. # 修改dirs配置,使vue打包好的文件可以被访问
  6. 'DIRS': [os.path.join(BASE_DIR, 'static/dist')],
  7. 'APP_DIRS': True,
  8. 'OPTIONS': {
  9. 'context_processors': [
  10. 'django.template.context_processors.debug',
  11. 'django.template.context_processors.request',
  12. 'django.contrib.auth.context_processors.auth',
  13. 'django.contrib.messages.context_processors.messages',
  14. ],
  15. },
  16. },
  17. ]
  18. # ...
  19. # 间隔若干行代码
  20. # ...
  21. # 配置静态资源访问地址,使前端assets能够访问到该路径下(js、css)
  22. STATIC_URL = '/assets/'
  23. STATICFILES_DIRS = [
  24. os.path.join(BASE_DIR, 'static/dist/assets'),
  25. ]

启动Django服务便可以看到和章节二末尾一样的展示效果。

正式项目请使用gunicorn等工具部署服务。

该功能建议在小型Demo 开发环境下部署使用,生产环境不建议用该方式。

四、容器化部署章节二和章节三输出的项目(前后端未分离)

4.1 乌班图下的Docker安装

更新系统软件包列表

sudo apt update

安装必要的依赖项

sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

添加Docker官方GPG密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

添加Docker APT软件包库

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list

更新软件包列表

sudo apt update

安装Docker引擎

sudo apt install -y docker-ce docker-ce-cli containerd.io

安装Docker compose

sudo apt install docker-compose

启动Docker服务

sudo service docker start

验证Docker安装

  1. docker --version
  2. docker-compose -v

4.2 乌班图下 使用Docker部署章节二的Flask项目

在Linux操作系统中,找到项目目录,在项目目录下新建Dockerfile文件,如下所示:

  1. # 设置基础镜像,这里使用 Python 3.10
  2. FROM python:3.10
  3. # 设置工作目录
  4. WORKDIR /app
  5. # 复制项目代码到容器中的 /app 目录
  6. COPY . /app
  7. # 安装项目依赖
  8. RUN pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple
  9. # 设置环境变量
  10. ENV FLASK_APP=app.py
  11. ENV FLASK_RUN_HOST=0.0.0.0
  12. # 启动 Flask 应用
  13. CMD ["flask", "run"]

 同样地,在目录下新建docker-compose.yml文件,如下所示:

  1. version: '3'
  2. services:
  3. web:
  4. # 指定 Dockerfile 的位置
  5. build:
  6. context: .
  7. dockerfile: Dockerfile
  8. # 映射宿主机的端口到容器的 5000 端口
  9. ports:
  10. - "5000:5000"
  11. # 设置环境变量
  12. environment:
  13. FLASK_APP: app.py
  14. FLASK_RUN_HOST: 0.0.0.0

构建镜像并启动容器:

docker-compose up --build

 停止

docker-compose down

4.3 乌班图下 使用Docker部署章节三的Django项目

具体操作如4.2章节一般,没有什么太大的变化,下面分别是Dockerfile和docker-compose.yml关键文件的内容。

Dockerfile:

  1. # 设置基础镜像,这里使用 Python 3.10
  2. FROM python:3.10
  3. # 设置工作目录
  4. WORKDIR /app
  5. # 复制项目代码到容器中的 /app 目录
  6. COPY . /app
  7. # 安装项目依赖
  8. RUN pip install Django -i https://pypi.tuna.tsinghua.edu.cn/simple
  9. # 设置环境变量
  10. ENV DJANGO_SETTINGS_MODULE=demo.settings
  11. ENV PYTHONUNBUFFERED=1
  12. # 运行 Django 应用
  13. CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

docker-compose.yml

  1. version: '3'
  2. services:
  3. web:
  4. # 指定 Dockerfile 的位置
  5. build:
  6. context: .
  7. dockerfile: Dockerfile
  8. # 映射宿主机的端口到容器的 8000 端口
  9. ports:
  10. - "8000:8000"
  11. # 设置环境变量,可选
  12. environment:
  13. - DJANGO_SETTINGS_MODULE=demo.settings

 其余操作与4.2章节保持一致,不再赘述。

4.4 镜像迁移(项目迁移)

将docker镜像导出为tar包:

docker save -o project_image.tar project_image:tag

其中,project_image 是你的镜像名称,tag 是你的镜像标签。

在另一台机器上导入tar包:

docker load -i project_image.tar

启动它: (参数-d 表示后台运行)

docker-compose up -d

五、前后端分离下的容器化项目部署

假定我们现在有一个不含前端的Flask服务(前后端完全分离),Flask只提供http请求,不提供页面渲染。这里的项目代码和章节二中还是略有不同的,但是实现的功能需求一致,依旧为给前端测试页面每隔5秒动态请求,在DOM上新增数据填充。

5.1 nginx的安装

乌班图下,更新软件包:

sudo apt update

输入以下命令来安装Nginx

sudo apt install nginx

 启动Nginx

service nginx start

查看nginx运行状态

service nginx status

 当看到 

* nginx is running

显示的时候说明nginx安装成功。也可以使用源码编译安装nginx,具体操请搜索引擎搜索。

5.2 nginx的配置与载入vue打包后的dist

安装好nginx后,需要修改nginx的配置文件,使nginx能够找到dist包的位置

需要对 /etc/nginx/nginx.conf做出如下修改

在该文件的http配置项内,加上一个server配置:

  1. server {
  2. listen 5555; # 监听端口
  3. server_name 127.0.0.1; # 替换为您的域名或服务器IP地址
  4. location / {
  5. root /mnt/d/linux/vue_web/dist; # 指向vue的dist目录的路径
  6. index index.html;
  7. try_files $uri $uri/ /index.html;
  8. }
  9. location /api/{
  10. proxy_pass http://127.0.0.1:5000;
  11. proxy_set_header Host $host;
  12. proxy_set_header X-Real-IP $remote_addr;
  13. }
  14. }

上述功能就是将前端请求的带有/api的接口转发到5000端口上的Flask服务上去。

如题:前端请求了http://127.0.0.1:5555/api/name会转发到http://127.0.0.1:5000/api/name上去。

停止服务并变更config文件,执行下列命令:

  1. service nginx stop
  2. nginx -c /etc/nginx/nginx.conf

 此时,重启下nginx

sudo nginx -s reload

 就可以看到前端展示的页面(访问 http://127.0.0.1:5000/):

静态页面资源已经加载出来了,但是没有请求到数据。下一章节我们将启动后端服务,呈现完整功能。 

5.3 后端实现

app.py代码(去除了template渲染前端):

  1. from flask import Flask
  2. app = Flask(__name__)
  3. # 前端轮询接口
  4. @app.route('/api/name')
  5. def get_name():
  6. return "帅大爷"
  7. if __name__ == '__main__':
  8. app.run()

特别提示:就上述nginx配置来看,该后端需要部署在本地机器上(映射端口127.0.0.1)跨机器需要修改ip配置。

如果使用window系统下的WSL 子系统时,该后端也必须在Linux环境下启动。

此时:后端的数据就会通过接口源源不断的请求到页面了:

5.4 容器化部署

容器化部署是为了迁移部署方便,可以参考4.2章的内容进行尝试。

交付的时候需要前后端对其请求接口契约,对其接口请求协议和参数,前端nginx和dist打包成一个docker容器,后端Flask/Django打包成一个docker容器。

不是很困难,有时间再更新吧,未完待续 ...

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号