当前位置: 首页 > article >正文

django使用笔记6--docker部署

django使用笔记--docker部署

    • 多环境配置
    • 创建环境变量配置文件
    • 静态资源配置
    • dockerfile配置

由于服务器中python版本和依赖与本地开发环境不同,且centOS7中python及依赖安装更新较为麻烦,所以采用docker容器部署

多环境配置

多环境配置类似Spring中的多环境配置。线上版本因为和数据库都是容器部署,所以放在一个自定义网络下,通过容器名称访问。
开发版本则是直接通过IP地址访问。即:

# 定义共享配置文件 settings_base.py
# 定义本地配置文件 settings_dev.py
# 定义线上配置文件 settings_prod.py
# dev和prod中引入base
from .settings_base import *
# 注意settings配置和manage.py配置文件所在目录层级不同,根目录的获取方法不同

创建环境变量配置文件

  1. 抽取敏感配置数据,在项目根目录下创建.env.dev和.env.prod,分别存放本地和线上的配置数据。
  2. 通过dotenv模块读取配置文件,并生成环境变量。
from pathlib import Path
from dotenv import load_dotenv

BASE_DIR = Path(__file__).resolve().parent
# print(BASE_DIR)
# print(os.path.join(BASE_DIR, '.env'))
# 加载.env文件
result = load_dotenv(os.path.join(BASE_DIR, '.env'))
  1. 不同层级目录下,确保能正确读取到配置文件
# 这里没注意 BASE_DIR 区别,直接复制导致配置一直读取不到
BASE_DIR = Path(__file__).resolve().parent
BASE_DIR = Path(__file__).resolve().parent.parent

静态资源配置

# 静态资源的请求路径
STATIC_URL = '/static/'
# 开发过程中,额外的静态文件存放目录
# STATICFILES_DIRS = [
#     os.path.join(BASE_DIR, 'static'),
# ]

# 静态资源的根目录
# 执行 python manage.py collectstatic时,
# 将静态文件收集到 staticfiles 目录下,包括STATICFILES_DIRS 定义的目录
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

例如:django后台管理接口,

  1. 访问 localhost:8000/admin/
  2. 静态资源请求路径:localhost:8000/static/admin/css/base.css,
  3. 对应的静态文件在项目根目录下的 staticfiles/admin/css/base.css

这里配置nignx的时候费了点时间,接口通了,但静态资源请求全部404。

  1. 将所有/python的请求转发到本地8000端口,该端口映射对应的django项目容器端口8000
  2. xxx.com/python/admin/ 可以方法,但静态资源请求404,具体请求为 xxx.com/static/…
  3. 先在容器宿主机上确保可以访问静态文件,我的localhost和127.0.0.1都无法访问,但通过服务器IP可以访问,
    即:191.127.32.21:8000/static/admin/css/base.css
  4. 确定容器外部可以访问静态文件后,再配置nginx,将请求转发到django容器。
server {
   listen       443 ssl http2;
   # 接口配置
   location /python/{
        proxy_pass http://localhost:8000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
   }
   # 静态文件配置
   location /static/ {
        proxy_pass 191.127.32.21:8000/static/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

dockerfile配置

这里打包镜像后,可进入容器内部查看目录结构,
如果配置未加载,可查看.env是否存在,打印BASE_DIR当前路径是否正确

# 使用官方 Python 镜像
FROM python:3.10-slim

# 设置环境变量,
ENV DJANGO_SETTINGS_MODULE=python_web.settings_prod

# 复制项目文件到工作目录
COPY . /python_web_root/
# 设置工作目录,即 进入工作目录下执行后续命令
WORKDIR /python_web_root
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 收集静态文件
RUN python manage.py collectstatic --noinput
# 暴露应用端口
EXPOSE 8000

# 启动 Django 应用
CMD ["gunicorn", "python_web.wsgi:application", "--bind", "0.0.0.0:8000"]

http://www.kler.cn/news/321859.html

相关文章:

  • 【Python语言初识(五)】
  • 【计算机网络】传输层协议TCP
  • python功能测试
  • 跟随Facebook的足迹:社交媒体背后的探索之旅
  • vue打包exe之electron-quick-start的npm install 报错
  • 丢失照片/消息/文件,当发现没有备份 Android 手机数据时急救方法
  • Java面试篇基础部分-Semaphore及其用法详解
  • 数据结构-线性表的单链式存储结构图解及C语言实现
  • 都说网络安全缺口那么大,但为何招聘数量却不多?总算明白了!
  • Linux系统部署Mysql8.x修改密码并且设置远程连接
  • UniApp基于xe-upload实现文件上传组件
  • electron的常用弹窗简单案例
  • 15年408-数据结构
  • 老人跌倒扶不扶?涪城三职工给出响亮答案
  • 【docker】在IDEA工具内,远程操作服务器上的docker
  • Rust Web开发常用库
  • Leetcode 706. 设计哈希映射
  • 大屏可视化px转rem方案实现
  • webservice cxf框架 jaxrs jaxws spring整合 接口测试方法 wsdl报文详解 springboot整合 拦截器 复杂参数类型
  • 作者分享|eDNA研究梯级水坝对浮游植物和浮游动物群落变化的影响
  • WPF入门教学十九 属性动画与时间线
  • 计算机网络nat 映射案列
  • 基于nodejs+vue的校园二手物品交易系统
  • Vue3+Vite中引用Swiper11自动轮播、左右切换不生效,已解决
  • Android常用C++特性之std::equal
  • 【python append函数的一些细节】
  • 音频转MP3格式困难?如何轻松实现wav转mp3?
  • Vue3中el-table组件实现分页,多选以及回显
  • 基于 STM32 的高精度 PID 温控系统设计与实现:采用 Pt1000 温度传感器与 PWM 控制技术
  • HT5169内置BOOST升压的11W I2S输入D类音频功放