Django 实战:静态文件与媒体文件从开发配置到生产部署

文章目录

    • 一、静态文件与媒体文件
      • 区别与联系
      • 配置
      • 开发环境配置
    • 二、媒体文件实战
      • 实战场景
      • 定义模型
      • 定义序列化器
      • 定义视图
      • 实战效果
    • 三、生产部署
      • 说明
      • 收集静态文件
      • Nginx配置示例
      • OpenResty配置示例


一、静态文件与媒体文件

区别与联系

在 Django 项目中,静态文件(Static Files)和媒体文件(Media Files)是两种不同类型的文件,需要不同的处理方式。

特性静态文件 (Static Files)媒体文件 (Media Files)
定义开发人员创建的文件(CSS, JS, 图片等)用户上传的文件(头像、文档等)
来源项目代码库的一部分用户生成的内容
变更频率低(部署时更新)高(用户随时上传)
存储位置STATIC_ROOTMEDIA_ROOT
访问 URLSTATIC_URLMEDIA_URL
生产环境服务Nginx 直接提供Nginx 直接提供
开发环境服务Django 开发服务器Django 开发服务器

配置

settings.py中,添加静态文件和媒体文件相关配置

### 静态文件配置
STATIC_ROOT = BASE_DIR / "static"
STATIC_URL = "/static/"### 媒体文件配置(用户上传文件)
MEDIA_ROOT = BASE_DIR / "media"  # 文件存储的绝对物理路径
MEDIA_URL = "/media/"  # 访问媒体文件的URL前缀
FILE_UPLOAD_MAX_MEMORY_SIZE = 10485760  # 10MB内存缓冲
DATA_UPLOAD_MAX_MEMORY_SIZE = 104857600  # 100MB请求体限制### 生产环境中,静态文件与媒体文件的访问地址
NGINX_BASE_URL = "http://192.168.0.73"  # 填写Nginx或OpenResty 的IP或域名

开发环境配置

在开发环境中,访问静态文件或媒体文件,需要在urls.py添加如下配置。点击查看完整代码

### 下面配置只有在 DEBUG=True 时才生效
if settings.DEBUG:# 在开发环境提供静态和媒体文件。生产环境请关闭,并使用Nginx或OpenRestyurlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

二、媒体文件实战

实战场景

在一个信息管理系统中,用户自定义头像是常见的功能需求。实战场景:用户自定义头像功能实现

定义模型

avatar_upload_rename()函数作用:头像文件重命名,然后按年份分目录存储

models.FileField()模型字段:

  • upload_to:指定上传位置
  • max_length:在数据库中创建为 varchar 类型,默认为 100 个字符
  • storage(可选):指定后端存储系统,默认为FileSystemStorage本地文件系统
class SystemUsers(BaseModel, AbstractBaseUser):# ... avatar = models.FileField(upload_to=avatar_upload_rename,max_length=512,blank=True,null=True,db_comment="头像地址",help_text="头像地址",)# ...def avatar_upload_rename(instance, filename):"""头像文件重命名,并指定存储路径"""ext = filename.split(".")[-1]  # 获取文件扩展名year = datetime.now().strftime("%Y")timestamp = datetime.now().strftime("%Y%m%d%H%M%S%f")[:-3]return f"avatars/{year}/{timestamp}.{ext}"  # 按年份分目录存储

定义序列化器

class UserProfileAvatarSerializer(serializers.ModelSerializer):"""上传用户个人头像序列化器"""avatarFile = serializers.FileField(source="avatar",help_text="头像地址",max_length=512,)class Meta:model = SystemUsersfields = ["avatarFile"]

定义视图

_build_avatar_response()函数:返回完整的头像URL地址

  • settings.DEBUG为True(即开发环境时),返回由Django提供文件访问的URL地址
  • 否则,返回Nginx提供文件访问的URL地址

instance.avatar.url:这里的avatar是一个FieldFile的实例,包含以下属性

  • url 一个只读属性,返回访问文件的URL
  • name 文件名
  • path 一个只读属性,通过调用底层的 path() 方法,访问文件的本地文件系统路径
  • size 文件大小

在这里插入图片描述

实战效果

用户上传头像后,返回由Django提供文件访问的URL地址(DEBUG = True)

在这里插入图片描述

头像文件,按年份分目录存储

在这里插入图片描述

如果在生产环境(DEBUG = False),则返回Nginx提供文件访问的URL地址。例如:`http://192.168.0.73/media/avatars/2025/20250611110101994.jpg"

点击查看完整代码

三、生产部署

说明

在 Django 项目中,使用 Nginx 或 OpenResty 高效地托管静态文件和媒体文件,是生产环境的最佳实践。

收集静态文件

收集静态文件相关功能依赖django.contrib.staticfiles 这个APP,它将各个应用的静态文件统一收集起来。确保它已添加在settings.py文件中的INSTALLED_APPS列表里。

INSTALLED_APPS = [# ..."django.contrib.staticfiles",# ...
]

运行下面命令,会将所有静态文件会汇总到配置文件settings.py指定的 STATIC_ROOT 目录

# 收集静态文件
python manage.py collectstatic
# 或加上--noinput 参数,这样不用二次确认
python manage.py collectstatic --noinput

Nginx配置示例

server {listen 80;server_name yourdomain.com;# 静态文件路由location /static/ {alias /var/www/myapp/static/;  # 替换为实际的 Django 静态文件路径expires 30d;  # 缓存时间access_log off;  # 可选:关闭日志减少IO}# 媒体文件路由(用户上传内容)location /media/ {alias /var/www/myapp/media/; # 替换为实际的 Django 媒体文件路径}# 前端配置location / {root /www/sites/mars-mgn-vue/index;  # 前端构建目录index index.html;try_files $uri $uri/ /index.html;   # 支持前端路由}
}

OpenResty配置示例

server {listen 80 ; server_name 192.168.0.73; # 静态文件配置 (CSS, JS, images)location /static/ {alias /static/;  # 替换为实际的 Django 静态文件路径expires 1d;access_log off;}# 媒体文件配置 (用户上传内容)location /media/ {alias /media/;  # 替换为实际的 Django 媒体文件路径expires 1d;access_log off;}index index.php index.html index.htm default.php default.htm default.html; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; access_log /www/sites/mars-mgn-vue/log/access.log main; error_log /www/sites/mars-mgn-vue/log/error.log; location ^~ /.well-known/acme-challenge {allow all; root /usr/share/nginx/html; }# 前端配置location / {root /www/sites/mars-mgn-vue/index;  # 前端构建目录index index.html;try_files $uri $uri/ /index.html;   # 支持前端路由}
}

点击查看完整代码


您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

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

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

相关文章

Python自动化分析知网文献:爬取、存储与可视化

1. 引言 在当今的学术研究和大数据分析领域,高效获取和分析学术文献数据具有重要意义。中国知网(CNKI)作为国内最权威的学术资源平台之一,包含了海量的期刊论文、会议论文和学位论文。然而,手动收集和分析这些数据不仅…

Python应用指南:使用PyKrige包实现ArcGIS的克里金插值法

先了解什么是克里金插值?克里金插值(Kriging interpolation)是一种基于统计学和空间相关性的高级空间插值方法,广泛应用于地理信息系统(GIS)、地质勘探、环境科学、气象学等领域。它由南非矿业工程师丹尼尔…

Redis原理之哨兵机制(Sentinel)

上篇文章: Redis原理之主从复制https://blog.csdn.net/sniper_fandc/article/details/149141103?fromshareblogdetail&sharetypeblogdetail&sharerId149141103&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 哨兵机制恢…

uniapp打包成 apk

1. 先把项目打包成 index.html 上传到宝塔服务器,关联到域名 2.然后再用hbuilder新建一个 基础模板的 uniapp 3.再修改代码,采用iframe方式打包 pages/index/index <template><web-view v-if="showWebView" :src="webViewSrc" @message=&qu…

RPG57.创建玩家拾取物品类一:创建可拾取物品类的基类

1。新建一个基类&#xff0c;用于玩家可拾取物品的父类然后// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "Components/SphereComponent.h" #include "GameFramewo…

k8s之持久化存储流程

K8s 中的 Pod 在挂载存储卷时需经历三个的阶段&#xff1a;Provision/Delete&#xff08;创盘/删盘&#xff09;、Attach/Detach&#xff08;挂接/摘除&#xff09;和 Mount/Unmount&#xff08;挂载/卸载&#xff09; Provisioning Volumes 时序流程详解 一、流程图 sequenc…

python学智能算法(二十四)|SVM-最优化几何距离的理解

引言 前序学习过程中&#xff0c;已经对几何距离的概念有了认知&#xff0c;学习链接为&#xff1a;几何距离 这里先来回忆几何距离δ的定义&#xff1a; δmin⁡i1...myi(w∥w∥⋅xib∥w∥)\delta \min_{i1...m}y_{i}(\frac{w}{\left \| w \right \|}\cdot x_{i}\frac{b}{\le…

创建游戏或互动体验:从概念到实现的完整指南

Hi&#xff0c;我是布兰妮甜 &#xff01;在数字时代&#xff0c;游戏和互动体验已成为娱乐、教育和商业领域的重要组成部分。本文将带你了解如何使用JavaScript创建引人入胜的游戏和互动体验&#xff0c;从基础概念到实际实现。 文章目录一、游戏开发基础1.1 游戏循环1.2 游戏…

SpringMVC + Tomcat10

1. Tomcat 10的servlet包路径变了&#xff0c;javax -> jakarta 2. DispatcherServlet从Spring6 才开始使用jakarta.servlet.http.Servlet 3. Spring6 需要JDK 17 1. pom <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org…

Django `transaction.atomic()` 完整使用指南

目录 #概述#基本用法#事务一致性保障机制#破坏一致性的常见场景#高级用法#最佳实践#诊断与调试#附录 概述 transaction.atomic() 是 Django 提供的数据库事务管理工具&#xff0c;用于确保一系列数据库操作要么全部成功提交&#xff0c;要么全部回滚&#xff0c;维护数据的一致…

UDP协议的端口161怎么检测连通性

UDP 端口 161 (SNMP) 连通性检测的专业指南 UDP 161 端口是 SNMP (Simple Network Management Protocol) 服务的标准端口。由于其无连接特性&#xff0c;检测需要特殊方法。以下是全面的检测方案&#xff1a; 一、专业检测方法 1. 使用 SNMP 专用工具&#xff08;推荐&#xff…

进阶数据结构:红黑树

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

如何上传github(解决git的时候输入正确的账号密码,但提示认证失败)

如何上传github文件&#xff0c;删除文件 1.重点 GitHub 从 2021 年 8 月 13 日起移除了对密码认证的支持。你需要使用个人访问令牌(Personal Access Token, PAT)或 SSH 密钥来进行认证。 2.生成SSH key 进入设置点击New SSH Key名字随便取&#xff0c;可以自己方便记3.上传文件…

多级缓存架构与热点探测系统核心技术解析

多级缓存架构与热点探测系统核心技术解析 &#x1f4cc; 一、多级缓存架构 1. 为什么需要多级缓存&#xff1f; ✅ 本地缓存优势&#xff1a; &#x1f680; 减少网络请求&#xff0c;提升访问性能&#x1f310; 分布式系统中天然具有分布式缓存特性⬇️ 有效降低远程缓存&…

iOS 性能监控工具全解析 选择合适的调试方案提升 App 性能

在iOS应用开发中&#xff0c;性能往往是决定用户体验的关键因素之一。用户体验的优劣&#xff0c;不仅取决于功能的实现&#xff0c;还在于流畅度、响应速度、资源消耗等方面的表现。因此&#xff0c;性能监控工具在iOS开发中的重要性不可小觑。 无论是提升应用的启动时间、减少…

C++ :vector的介绍和使用

vector学习时一定要学会查看reference 目录 前言 一、vector基本概念 1.1vector是什么&#xff1f; 1.2内存管理 二、vector的使用 2.1vector的构造 2.2vector iterator 的使用 2.3vector 空间增长问题 2.4vector的元素访问 2.5vector 增删查改 总结 前言 在C编程中&#x…

iOS OC 图片压缩

纯代码,不废话,欢迎copy使用,记得点赞 +(NSData *)imageData:(UIImage *)image maxSize:(int)maxSize{ // 设置最大文件大小(200KB) NSLog(@"执行压缩方案 期望压缩目标%dk",maxSize); return [self compressImage:image toMaxSize:maxSize]; } // 主压缩方…

如何更改 SQLserver 数据库存储的位置 想从C盘换到D盘

在 SQL Server 中更改数据库存储位置&#xff08;从 C 盘迁移到 D 盘&#xff09;需要通过以下步骤完成&#xff1a;1. 确定数据库文件的当前位置首先查询数据库文件的当前路径&#xff1a;sqlSELECT name, physical_name AS current_location FROM sys.master_files WHERE dat…

【unitrix】 6.8 加一运算(add_one.rs)

一、源码 这是一个使用 Rust 类型系统实现二进制数加一操作的代码。 use crate::number::{O, I, B, Null, Bit, NormalizeIf};/// 类型级加一操作 trait /// /// 为二进制数类型实现加一操作&#xff0c;返回新的类型 pub trait AddOne {/// 加一操作的结果类型type Output;//…

国内Ubuntu访问不了github、 huggingface等

各位小伙伴们&#xff0c;大家好呀。 大家是不是经常遇到访问不了github、huggingface的情况呀。 在Ubuntu中可以这样做。 访问这个网站网站测速-Ping检测-Trace查询-Dig查询-路由跟踪查询-tools.ipip.net&#xff0c; 对于github.com&#xff0c;在这个网站输入github.com…