当前位置:   article > 正文

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

python+vue

目录

一、创建一个简单的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博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50004
推荐阅读
相关标签
  

闽ICP备14008679号