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

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_dotenvBASE_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"]

相关文章:

  • 破局汽车智能化浪潮:Tire 1供应商的网络优化与升级策略
  • 在Linux中进行OpenSSH升级(编译安装在openssh目录)
  • C语言系列4——指针与数组(1)
  • 【数据库】 MongoDB 用户分配新的角色和权限
  • 从零开始Ubuntu24.04上Docker构建自动化部署(三)Docker安装Nginx
  • Cannon-es.js之HingeConstraint铰链约束案例
  • leetcode163.缺失的区间,模拟
  • 【算法】堆排之LCR 159.库存管理 Ⅲ(easy)
  • Python Web 与量子计算
  • css的页面布局属性
  • 65.【C语言】联合体
  • Databend 实现高效实时查询:深入解读 Dictionary 功能
  • 对于基础汇编的趣味认识
  • 综合练习 学习案例
  • 【AIGC】ChatGPT提示词助力自媒体内容创作升级
  • Android单元测试 - 几个重要问题
  • Angular4 模板式表单用法以及验证
  • angular组件开发
  • Asm.js的简单介绍
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ES10 特性的完整指南
  • ES6 ...操作符
  • gitlab-ci配置详解(一)
  • in typeof instanceof ===这些运算符有什么作用
  • Meteor的表单提交:Form
  • React16时代,该用什么姿势写 React ?
  • Web标准制定过程
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 经典排序算法及其 Java 实现
  • 力扣(LeetCode)965
  • 一些关于Rust在2019年的思考
  • 自制字幕遮挡器
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • # linux 中使用 visudo 命令,怎么保存退出?
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #知识分享#笔记#学习方法
  • (09)Hive——CTE 公共表达式
  • (1)STL算法之遍历容器
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (web自动化测试+python)1
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (差分)胡桃爱原石
  • (第27天)Oracle 数据泵转换分区表
  • (规划)24届春招和25届暑假实习路线准备规划
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (算法)N皇后问题
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (杂交版)植物大战僵尸
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .env.development、.env.production、.env.staging
  • .NET CORE Aws S3 使用
  • .NET Micro Framework初体验