Django4.2(DRF)+Vue3 读写分离项目部署上线

文章目录

  • 1 前端
  • 2 后端
    • 2.1 修改 settings.py 文件
      • 关于静态文件
      • 2.2 关于用户上传的文件图片
  • 3 Nginx
  • 4 镜像制作
    • 4.1 nginx
    • 4.3 Django镜像
      • 4.3.1 构建
    • 5 docker-compose 文件内容

1 前端

进入前端项目的根目录,运行如下命令进行构建

npm run build

构建完成后,项目根目录下会出现打包后的目录 dist
在这里插入图片描述
这个 dist 目录需要给到 nginx ,具体配置见第 3 章节的 Nginx

2 后端

2.1 修改 settings.py 文件

关于静态文件

说明:读写分离项目 Django中是没有静态文件的,这里的静态文件是 Djngo 中集成的后台管理的 admin 和 api 文档应用使用的静态文件。

DEBUG = False   # 修改为 False

ALLOWED_HOSTS = ["*"]  # 允许任何主机访问

# 告诉项目,访问所有静态文件的 URL 前缀
# 也就是都需要从 /statics/ 开头,这个需要和 nginx 中 location 后面的值一致
STATIC_URL = '/statics/'

# 静态文件收录的位置,生产部署时使用,配置完成后
# 执行如下命令完成静态文件的收录, django 会把所有应用使用到的静态文件拷贝到这个目录里一份
# python manage.py collectstatic
# 注意不包含用户通过页面上传的文件,具体见面的配置说明
STATIC_ROOT = Path.joinpath(BASE_DIR, 'statics')

2.2 关于用户上传的文件图片

这个是临时使用,做好自己编写视图实现。
修改 setings.py 文件

# 用户通过页面上传的文件,使用这个 URL 访问,这个需要在nginx上配置为 location 的值
MEDIA_URL = '/media/'

# 存储文件的路径
MEDIA_ROOT = Path.joinpath(BASE_DIR, 'media')

3 Nginx

说明: 配置文件中 sharkplat 是 程序的后端主机名。

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    # 这个就是前端了
    location / {
        root   /usr/share/nginx/html;
        try_files $uri $uri/ /index.html last;
        index  index.html index.htm;
    }

   # 这里就是后端用到的静态文件,注意是后端应用(admin和 DRF 自带的 api 文档)的静态文件。
    location /statics/{
        root /usr/share/nginx;
    }

   # 这里就是用户通过页面上传的图片
    location /media {
        root /usr/share/nginx;
    }

    # 这个是后台管理
    location /admin {
        proxy_pass http://sharkplat/admin;
    }

   # 这里是后端数据接口
    location /v1 {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Scheme $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://sharkplat/v1;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

4 镜像制作

4.1 nginx

镜像使用的是 nginx:1.20.2-alpine

4.3 Django镜像

4.3.1 构建

Dockerfile

FROM alpine:latest
COPY requirements.txt /root/requirements.txt
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    apk add --update --no-cache \
        gcc mysql-dev musl-dev curl \
        jq py3-configobj py3-pip \
        py3-setuptools python3 python3-dev && \
    mkdir /root/.pip && \
    echo '[global]' > /root/.pip/pip.conf && \
    echo 'index-url=https://mirrors.aliyun.com/pypi/simple' >> /root/.pip/pip.conf &&\
    pip install --upgrade pip &&\
    pip install -r /root/requirements.txt

requirements.txt
在 DRF 项目根目录环境下执行如下命令获取.
pip3 freeze > requirements.txt

asgiref==3.7.2
asttokens==2.2.1
attrs==23.1.0
backcall==0.2.0
certifi==2023.7.22
charset-normalizer==3.2.0
coreapi==2.3.3
coreschema==0.0.4
decorator==5.1.1
Django==4.2
django-filter==23.2
django-guardian==2.4.0
django-phonenumber-field==7.1.0
django-simpleui==2023.8.28
djangorestframework==3.14.0
djangorestframework-simplejwt==5.3.1
drf-spectacular==0.26.5
executing==1.2.0
idna==3.4
importlib-metadata==6.8.0
inflection==0.5.1
ipython==8.14.0
itypes==1.2.0
jedi==0.19.0
Jinja2==3.1.2
jsonschema==4.20.0
jsonschema-specifications==2023.11.2
Markdown==3.4.4
MarkupSafe==2.1.3
matplotlib-inline==0.1.6
mysqlclient==2.2.0
parso==0.8.3
pexpect==4.8.0
phonenumberslite==8.13.17
pickleshare==0.7.5
Pillow==10.0.0
prompt-toolkit==3.0.39
ptyprocess==0.7.0
pure-eval==0.2.2
Pygments==2.15.1
PyJWT==1.7.1
pytz==2023.3
PyYAML==6.0.1
referencing==0.31.1
requests==2.31.0
rpds-py==0.13.2
six==1.16.0
sqlparse==0.4.4
stack-data==0.6.2
traitlets==5.9.0
typing_extensions==4.7.1
uritemplate==4.1.1
urllib3==2.0.4
wcwidth==0.2.6
zipp==3.16.2
click==8.1.7
gunicorn==21.2.0
h11==0.14.0
uvicorn==0.25.0

5 docker-compose 文件内容

version: '3.9'
services:
  web:
    image: nginx:1.20.2-shark
    volumes:
      - "./dist:/usr/share/nginx/html"
      - "./conf.d:/etc/nginx/conf.d"
      - "./statics:/usr/share/nginx/statics"
      - "./sharkplat/media:/usr/share/nginx/media"
    restart: always
    ports:
      - "9900:80"
  sharkplat:
    image: sharkplat:1.0
    command: sh /sharkplat/start.sh
    restart: always
    ports:
    - "8010:80"
    volumes:
      - "./sharkplat:/sharkplat"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/360938.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apple Vision Pro 评测:这款顶尖头显仅是对未来的初步探索

原文:Apple Vision Pro Review: The Best Headset Yet Is Just a Glimpse of the Future 作者:Joanna Stern 戴上 Apple Vision Pro 混合现实头显整整近 24 小时后,有几件事让我颇感意外: 我居然没感到恶心。我竟然高效完成了大…

云纱网签约百望云,联手打造数字化产业闭环

近日,百望云签约广东云纱数字科技有限公司,共建数字化发票管理系统,赋能产业链上下游供应商的协同交易与运营,助力企业实现数字化四流合一交易,打造数字化产业闭环。 云纱网是广东云纱数字科技有限公司依托于深厚的产业…

利用牛顿方法求解非线性方程(MatLab)

一、算法原理 1. 牛顿方法的算法原理 牛顿方法(Newton’s Method),也称为牛顿-拉弗森方法,是一种用于数值求解非线性方程的迭代方法。其基本思想是通过不断迭代来逼近方程的根,具体原理如下: 输入&#…

STM32——DMA

STM32——DMA 1.DMA介绍 什么是DMA? DMA(Direct Memory Access,直接存储器访问) 提供在外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通,而不需要依赖于CPU,在这个时间中&…

移动端设计规范 - 文字使用规范

这是一篇关于移动端产品界面设计时,文字大小的使用规范,前端人员如果能了解一点的话,在实际开发中和设计沟通时,节省沟通成本,也能提高设计落地开发时的还原度。 关于 在做移动端产品设计时,有时候使用文字…

fpmarkets实例讲解止损,控制风险如此简单

止损和止盈是交易者在交易时都需要了解的两个基本设置,在上篇文章fpmarkets澳福和各位投资者分享 了止盈如何工作,今天我们继续实例讲解止损,在交易中控制不必要的风险。 止损单是基本交易订单之一。如果市场走向与预期相反,它会限…

[机器学习]LFM梯度下降算法

一.LFM梯度下降算法 2.代码实现 # 0. 引入依赖 import numpy as np import pandas as pd# 1. 数据准备 # 评分矩阵R R np.array([[4,0,2,0,1],[0,2,3,0,0],[1,0,2,4,0],[5,0,0,3,1],[0,0,1,5,1],[0,3,2,4,1],]) # 二维数组小技巧:取行数R.shape[0]和len(R)&#x…

【SPIE独立出版|长春理工大学主办】2024年第四届数字信号与计算机通信国际学术会议(DSCC 2024)

DSCC 2024已通过SPIE出版社审核,ISSN号已确定:ISSN: 0277-786X,往届均已见刊EI检索! 2024年第四届数字信号与计算机通信国际学术会议(DSCC 2024) 2024 4th International Conference on Digital Signal and…

Windows Server 2025 Azure Arc 介绍

Azure Arc 是一个扩展 Azure 平台的桥梁,可帮助你构建可灵活地跨数据中心、边缘和多云环境运行的应用程序和服务。使用一致的开发、操作和安全模型来开发云原生应用程序。 Azure Arc 可在新的和现有的硬件、虚拟化和 Kubernetes 平台、物联网设备和集成系统上运行。…

Flutter 开发3:创建第一个Flutter应用

Step 1: 安装Flutter 1.1 下载Flutter SDK 首先,你需要访问Flutter官方网站下载最新的Flutter SDK。选择适合你操作系统的安装包。 $ cd ~/development $ unzip ~/Downloads/flutter_macos_2.2.3-stable.zip1.2 更新环境变量 接下来,你需要将Flutter…

【项目管理】整合管理

一、管理基础 1、项目整合管理由项目经理负责,项目经理负责整合所有其他知识领域的成果,并掌握项目总体情况。项目整合管理的责任不能被授权或转移,项目经理必须对整个项目承担最终责任。整合是项目经理的一项关键技能。执行项目整合时项目经…

西门子WINCC触摸屏的Audit功能:追溯生产数据与用户操作行为

1为什么要用Audit功能? 在许多工业领域,生产数据的可追溯性及其文档记录变得愈加重要,如医药行业、食品饮料以及相关的机械工程行业。与书面文档相比,以电子形式存储生产数据具有许多优点,如采集和记录数据更方便&…

【HarmonyOS】鸿蒙开发之页面路由——第2.4章

页面路由: 应用程序中实现不同页面之间的跳转和数据传递。 Router有两种页面跳转模式 1.router.pushUrl() 目标耶不会被替换当前页,而是压入页面栈,可以使用router.back()返回当前页 2.router.replaceUrl() 目标替换当前页,当前页会被销毁并…

一文读懂cookie、session和token

HTTP简介 HTTP协议(超文本传输协议HyperText Transfer Protocol)是一种无状态协议,协议本身不会对发送过的请求和对应的通信状态进行持久化处理。这样的好处是可以保持HTTP协议的简单性,高效率处理大量事务。 但是随之就会出现一…

代码随想录算法训练营第36天(贪心算法05 ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

贪心算法 part05 435. 无重叠区间解题思路 763.划分字母区间解题思路补充 56. 合并区间解题思路不熟悉的基础语法知识 详细布置 今天的三道题目,都算是 重叠区间 问题,大家可以好好感受一下。 都属于那种看起来好复杂,但一看贪心解法&#x…

【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]

阅读导航 引言一、设计模式概念(了解)二、单例模式1. 饿汉模式(1)概念(2)模拟实现(3)优缺点(4)适用场景 2. 懒汉模式(1)概念&#xff…

vue使用富文本

1、安装 cnpm install vue-quill-editor2、在main.js中引入 // 富文本 import VueQuillEditor from vue-quill-editor // require styles 引入样式 import quill/dist/quill.core.css import quill/dist/quill.snow.css import quill/dist/quill.bubble.css Vue.use(VueQuill…

cesium-球体透明

在开发的过程&#xff0c;要求cesium加载的地球透明 只是地表透明还不能满足要求&#xff0c;只加载部分区域的方式来解决的 代码如下&#xff1a; <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"…

【C++进阶08】哈希的应用(位图and布隆过滤器)

一、位图 1.1 位图的概念 面试题 给40亿个不重复的无符号整数&#xff0c;没排过序 给一个无符号整数&#xff0c;如何快速判断一个数是否在 这40亿个数中。【腾讯】 能想到的解决思路&#xff1a; 遍历&#xff0c;时间复杂度O(N)排序(O(NlogN)) 利用二分查找: logN放到哈…

centos搭建ftp踩坑记录

ftp服务器搭建参考b站视频 第1坑&#xff0c;开放端口后仍然无法连接&#xff1a; 这里不仅需要在防火墙打开20和21端口&#xff0c;还需要打开被动访问所使用的端口&#xff0c;也就是在配置文件vsftpd.conf中指定的被动访问接收端口。 pasv_enableYES pasv_min_port40000 p…