Django服务开发镜像构建

最后完整的项目目录结构

1、安装依赖

pip install django django-tables2 django-filter

2、创建项目和主应用

django-admin startproject config

cd config

python manage.py startapp dynamic_models

3、配置settings.py

将项目模块dynamic_models加入进来,django_tables2和django_filters是安装的原生的依赖,使用里面的自带的界面,

1)注意这里面的ALLOWED_HOSTS 和 CSRF_TRUSTED_ORIGINS需要配置成对应的可信的网站和地址

2)STATIC_ROOT必须与 Dockerfile 中一致

其余的配置如数据库按需配置即可.

"""
Django settings for config project.Generated by 'django-admin startproject' using Django 5.2.3.For more information on this file, see
https://docs.djangoproject.com/en/5.2/topics/settings/For the full list of settings and their values, see
https://docs.djangoproject.com/en/5.2/ref/settings/
"""
import os
from pathlib import Path# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = "django-insecure-1$72i_+zz_bh8l$n5og-6-))(4vw3%!*m7!hi#^7l11g!3@tdn"# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = TrueALLOWED_HOSTS = ['zs-common-config-dev.com','zs-common-config-pre.com','zs-common-config.com','10.1.1.1','*',
]CSRF_TRUSTED_ORIGINS = ['zs-common-config-dev.com','zs-common-config-pre.com','zs-common-config.com','10.1.1.1','*',
]# 必须配置(如果使用HTTPS)
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
CSRF_COOKIE_SECURE = True  # HTTPS必须为True
SESSION_COOKIE_SECURE = True# Application definitionINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','dynamic_models','django_tables2','django_filters',
]MIDDLEWARE = ["django.middleware.security.SecurityMiddleware","django.contrib.sessions.middleware.SessionMiddleware","django.middleware.common.CommonMiddleware","django.middleware.csrf.CsrfViewMiddleware","django.contrib.auth.middleware.AuthenticationMiddleware","django.contrib.messages.middleware.MessageMiddleware","django.middleware.clickjacking.XFrameOptionsMiddleware",
]ROOT_URLCONF = "config.urls"TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages','django.template.context_processors.request',  # 用于django-tables2],},},
]WSGI_APPLICATION = "config.wsgi.application"# Database
# https://docs.djangoproject.com/en/5.2/ref/settings/#databasesDATABASES = {"default": {# "ENGINE": "django.db.backends.sqlite3",# "NAME": BASE_DIR / "db.sqlite3",'ENGINE': 'django.db.backends.postgresql','NAME': 'zskj_common_config_dev',  # 数据库名称'USER': 'postgres',  # 数据库用户名'PASSWORD': '123456',  # 数据库密码'HOST': 'localhost',  # 数据库主机,本地数据库使用 localhost'PORT': '123456',  # 数据库端口,PostgreSQL 默认是 5432}
}# Password validation
# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validatorsAUTH_PASSWORD_VALIDATORS = [{"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",},{"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",},{"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",},{"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",},
]# Internationalization
# https://docs.djangoproject.com/en/5.2/topics/i18n/# LANGUAGE_CODE = "en-us"
LANGUAGE_CODE = 'zh-hans'  # 简体中文
TIME_ZONE = "UTC"
USE_I18N = True
USE_TZ = True# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.2/howto/static-files/# 静态文件 URL 前缀(浏览器访问路径)
STATIC_URL = '/static/'STATIC_ROOT = '/app/staticfiles/'  # 必须与 Dockerfile 中一致
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]  # 开发静态文件目录# Default primary key field type
# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-fieldDEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
STATICFILES_FINDERS = ['django.contrib.staticfiles.finders.FileSystemFinder','django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

4、实现模块dynamic_models的功能,添加路由

以上是该模块提供出来的路由。

需要将模块的url添加到主服务config的urls里面

以上第二个path,代表不输入具体的路由地址,则自动跳转到admin路由下

5、生成数据库表

python manage.py migrate

6、创建超级用户,用于登录

python manage.py createsuperuser

7、创建虚拟环境(本地启动需要,服务端忽略)

python3 -m venv myenv

source myenv/bin/activate # 适用于 Linux/MacOS

.\myenv\Scripts\activate # 适用于 Windows

8、models有修改,更新

python manage.py makemigrations dynamic_models

python manage.py migrate

9、requirements.txt依赖

pip install -r requirements.txt

asgiref==3.8.1
Django==5.2.3
django-filter==25.1
django-tables2==2.7.5
psycopg2-binary==2.9.10
sqlparse==0.5.3
gunicorn==23.0.0

10、本地启动

如图配置,pycharm

11、构建docker镜像

# 基础镜像
FROM harbor-operation.maas.com.cn/zskj/backend/python-poetry:3.10ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV DJANGO_SETTINGS_MODULE=config.settings# 创建工作目录并设置为工作目录
WORKDIR /app# 复制项目文件
COPY . /app/# 安装Python依赖
RUN pip install --upgrade pip
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install -r requirements.txt# 收集静态文件到 STATIC_ROOT
RUN python manage.py collectstatic --noinputEXPOSE 8000CMD ["gunicorn", "--bind", "0.0.0.0:8000", "config.wsgi:application"]# docker build -t harbor-operation.maas.com.cn/zskj/backend/zskj_common_config:v1.0.6 .
# docker run -p 8002:8000 --name zskj-app6 harbor-operation.maas.com.cn/zskj/backend/zskj_common_config:v1.0.6

12、docker-compose

name: "common-config-dev"
services:api:container_name: common_config_devrestart: alwaysimage: common_config:v1.0.9command: >sh -c "python manage.py collectstatic --noinput &&gunicorn --bind 0.0.0.0:8000 config.wsgi:application"volumes:- ./static/:/app/staticfiles/ports:- "8059:8000"networks:- docker_common_config_network_devenvironment:- START_CONFIG=dev- DJANGO_SETTINGS_MODULE=config.settings- DEBUG=Truenginx:container_name: common_config_nginx_devimage: common_config_nginx:v1.0.1ports:- "51149:80"networks:- docker_common_config_network_devvolumes:- ./static/:/app/staticfiles/- ./nginx/nginx.conf:/etc/nginx/conf.d/default.confdepends_on:- apinetworks:docker_common_config_network_dev:ipam:config:- subnet: 172.70.49.16/28driver: bridge

注意需要把服务端的容器内部的资源挂载出来,不然访问时找不到对应的资源

./static/:/app/staticfiles/

13、nginx的配置

dockerfile

FROM nginx:latest
# 设置时区为中国标准时间
ENV TZ=Asia/Shanghai
# 配置NGINX
COPY nginx.conf /etc/nginx/nginx.conf
# 暴露端口
EXPOSE 80
# 启动NGINX
CMD ["nginx", "-g", "daemon off;"]
# 构建镜像
# docker build -t common_config_nginx:v1.0.1 .

 nginx.conf

events {worker_connections 1024;
}http {#设定请求缓冲client_header_buffer_size    512k;large_client_header_buffers  4 512k;# 解决样式不加载问题include /etc/nginx/mime.types;default_type application/octet-stream;upstream zskj_common_config_interface {# 这里的端口是容器里面的端口server api:8000;}server {listen 80;location /static/ {alias /app/staticfiles/;expires 30d;access_log off;# 解决样式不加载问题add_header Content-Type text/css;types {}default_type text/css;}location / {# 设置ipproxy_set_header Host $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# 解决跨域add_header 'Access-Control-Allow-Origin' '$http_origin' always;add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;# 注意前端如果传了其他的请求头,会跨域的哦,例如Refresh-Token不在下面的字符串中,会提示跨域add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;# 处理OPTIONS预检请求if ($request_method = 'OPTIONS') {return 204;}proxy_pass http://zskj_common_config_interface;}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20250706-3-Docker 快速入门(上)-常用镜像管理命令_笔记

一、配置加速器1. Docker Hub简介与地址公共镜像仓库: 由Docker公司维护的公共镜像仓库,包含大量容器镜像默认下载源: Docker工具默认从这个公共镜像库下载镜像访问地址: https://hub.docker.com镜像搜索功能: 可通过浏览器访问图形化管理系…

【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能

注意:考虑到优化的内容比较多,我将该内容分开,并全部整合放在【unity游戏开发——优化篇】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言实战1、确保所有静止的3D物体都标记为Occluder Static静态遮挡体和Occludee …

通用业务编号生成工具类(MyBatis-Plus + Spring Boot)详解 + 3种调用方式

在企业应用开发中,我们经常需要生成类似 BZ -240704-0001 这种“业务编号”,它通常具有以下特点:前缀:代表业务类型,如 BZ 表示包装日期:年月日格式,通常为 yyMMdd序列号:当天内递增…

前端相关性能优化笔记

1.打开速度怎么变快 - 首屏加载优化2.再次打开速度怎么变快 - 缓存优化了3.操作怎么才顺滑 - 渲染优化4.动画怎么保证流畅 - 长任务拆分2.1 首屏加载指标细化:1.FP(First Paint 首次绘制) 2.FCP(First contentful Paint 首次内容绘制),FP 到 FCP 中间其实主要是 SPA…

7.7晚自习作业

实操作业02:Spark核心开发 作业说明 请严格按照步骤操作,并将最终结果文件(命名为:sparkcore_result.txt)于20点前上传。结果文件需包含每一步的关键命令执行结果文本输出。 一、数据读取与转换操作 上传账户数据$…

手机FunASR识别SIM卡通话占用内存和运行性能分析

手机FunASR识别SIM卡通话占用内存和运行性能分析 --本地AI电话机器人 上一篇:手机无网离线使用FunASR识别SIM卡语音通话内容 下一篇:手机通话语音离线ASR识别商用和优化方向 一、前言 书接上一文《阿里FunASR本地断网离线识别模型简析》,…

虚幻引擎Unreal Engine5恐怖游戏设计制作教程,从入门到精通从零开始完整项目开发实战详细讲解中英字幕

和大家分享一个以前收集的UE5虚幻引擎恐怖游戏开发教程,这是国外一个大神制作的视频教程,教程从零开始到制作出一款完整的游戏。内容讲解全面,如蓝图基础知识讲解、角色控制、高级交互系统、高级库存系统、物品检查、恐怖环境氛围设计、过场动…

多人协同开发时Git使用命令

拉取仓库代码 # 拉取远程仓库至本地tar_dir路径 git clone gitgithub.com:your-repo.git target_dir # 默认是拉取远程master分支,下面拉取并切换到自己需要开发的分支上 # 假设自己需要开发的分支是/feature/my_branch分支 git checkout -b feature/my_branch orig…

线性表——双向链表

线性表——双向链表1. 双向链表的实现1.1 简单图例1.2 结点的定义1.3 新结点的创建1.4 链表的初始化1.5 结点的插入1.5.1 头部插入(头插)1.5.2 尾部插入(尾插)1.5.3 任意位置(前)插入1.6 结点的删除1.6.1 头…

Java后端技术博客汇总文档

文章目录 前言Java后端汇总链接Java基础知识点数据结构算法(Java实现)算法知识点合集算法刷题算法竞赛AcWing课程蓝桥杯AB组辅导课合集(更新中…) 源码分析redission 数据库SQL ServerMySQLRedis -Canal JUC并发编程JVMNetty日志框…

QT 菜单栏设计使用方法

目录 常用设置函数 多个QAction的单选设置 ​​​​​​​菜单相关类 ​​​​​​​ 系统菜单的生成和响应 使用代码添加系统菜单 使用UI设计器设计系统菜单 使用Qt设计及界面时,常用的两种方式添加菜单,第一使用UI界面添加,第二种 在…

AIGC领域AI艺术,打造个性化艺术作品

AIGC领域AI艺术,打造个性化艺术作品 关键词:AIGC、AI艺术、生成对抗网络、个性化创作、深度学习、艺术风格迁移、创意计算 摘要:本文深入探讨了AIGC(人工智能生成内容)在艺术创作领域的应用,重点分析了如何利用AI技术打造个性化艺术作品。文章从技术原理出发,详细解析了生…

基于Flask+Jinja2的快捷教务系统(后端链接到新版正方教务系统)

快捷教务系统(Easy Educational Administration Management System, EasyEAMS) 项目简介 EasyEAMS 是一个基于 Flask Jinja2 的现代化教务系统 Web 应用。学生可通过网页端登录,在线查询个人信息、成绩、课表、学业生涯、通知、选课等。系…

EDM自动化与出海独立开发实用教程

随着互联网全球化发展,越来越多的独立开发者(Indie Developer)选择将自己的产品推向海外市场。如何高效地获客、激活用户、提升转化率,成为出海过程中必须解决的问题。EDM(电子邮件营销)自动化,…

「日拱一码」017 深度学习常用库——TensorFlow

目录 基础操作 张量操作: tf.constant 用于创建常量张量 tf.Variable 用于创建可训练的变量张量 tf.reshape 可改变张量的形状 tf.concat 可将多个张量沿指定维度拼接 tf.split 则可将张量沿指定维度分割 数学运算: tf.add 张量的加运算 tf.su…

ARM DStream仿真器脚本常用命令

以下是ARM DStream仿真器脚本中常用的命令及其功能分类,结合调试流程和典型应用场景整理: ⚙️ 一、连接与初始化命令 connect 建立与目标设备的连接,需指定接口类型(如JTAG/SWD)和处理器核心。 示例:conne…

vscode 调试unity

lanch.json { “version”: “0.2.0”, “configurations”: [ { “name”: “Attach to Unity”, “type”: “vstuc”, “request”: “attach” } ] }

金融IT入门知识点

银行金融IT核心知识点全解析:架构、技术与实践 一、金融IT的战略地位与行业特性 金融IT作为银行业务的核心支撑体系,其发展水平直接决定了银行服务的效率、安全性与创新能力。截至 2025年,中国银行业线上化业务占比已达97%,手机银…

C++——手撕智能指针、单例模式、线程池、String

智能指针今天我们来学习一下C中的智能指针,如果有人不知道C中的智能指针的概念的话:C智能指针是一种基于RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制的高级内存管理工具,用于自动化…

Mybatis----留言板

基础项目:留言板 截止到目前为止,我们已经学习了 Spring(只学习了DI)、Spring MVC、SpringBoot、Mybatis 这些知识了,已经满足了做简单项目的基本要求了,所以接下来我们就从0到1实现表白墙项目。 需求分析…