Django 实战:静态文件与媒体文件从开发配置到生产部署
一、静态文件与媒体文件
区别与联系
在 Django 项目中,静态文件(Static Files)和媒体文件(Media Files)是两种不同类型的文件,需要不同的处理方式。
| 特性 | 静态文件 (Static Files) | 媒体文件 (Media Files) |
|---|---|---|
| 定义 | 开发人员创建的文件(CSS, JS, 图片等) | 用户上传的文件(头像、文档等) |
| 来源 | 项目代码库的一部分 | 用户生成的内容 |
| 变更频率 | 低(部署时更新) | 高(用户随时上传) |
| 存储位置 | STATIC_ROOT |
MEDIA_ROOT |
| 访问 URL | STATIC_URL |
MEDIA_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或OpenResty
urlpatterns += 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 = SystemUsers
fields = ["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从入门到实战》专栏!关注不迷路~
Django 实战:静态文件与媒体文件从开发配置到生产部署的更多相关文章
- 使用mediainfo工具统计每个视频文件(媒体文件)播放时长
需求 1.运营那边需要统计大量视频文件的播放时长,并汇总记录到excel表中,问我有什么方法搞定 这边搜索了很多统计媒体文件时长的,主要有以下几种 1.使用java获取 2.使用python获取 3. ...
- [Django实战] 第3篇 - 用户认证(初始配置)
当大家打开一个网站时,第一步做什么?大部分一定是先登录吧,所以我们就从用户认证开始. 打开用户认证 Django本身已经提供了用户认证模块,使用它可以大大简化用户认证模块的开发,默认情况下,用户认证模 ...
- 36、Django实战第36天:首页功能开发
1.编辑users.views.py ... class IndexView(View): """ 首页 """ def get(self, ...
- 27、Django实战第27天:全局搜索功能开发
当我们选择其中一个类别(公开课,课程讲师,授课老师),输入搜索内容,点击搜索后会跳转到相应的列表页中进行展示 我们输入的内容作为参数keyword传入后台 搜索"公开课" 当课程中 ...
- Django (七) token&静态文件&媒体文件
token&静态文件&媒体文件 1. token 1. 会话技术 2. 服务端会话技术 3. 它实际上就是手动实现的session 4. 实现token 4.1 在models.py中 ...
- Django app安装,配置mysql,时区,模板,静态文件,媒体,admin
1.创建app python manage.py startapp 名字 Migrations 数据库同步目录,记录数据库同步的记录 init 包文件 Admin.py django自带的后台管理文件 ...
- Django 配置文件settings注解(含静态文件和上传文件配置)
基于Django1.11配置文件settings.py import os import sys # Build paths inside the project like this: os.path ...
- [django]windows下用Django,静态文件请求失败,出现UnicodeDecodeError
问题:windows下用Django,静态文件请求失败,出现UnicodeDecodeError:'utf-8' codec can't decode byte 0xb0 in position 1: ...
- django处理静态文件
静态文件指的是js css 还有图片这些,配置方法如下 1. 在设置文件(settings.py)中,installed_apps中添加 django.contrib.staticfiles 然后设置 ...
- Django中静态文件引用优化
静态文件引用优化 在html文件中是用django的静态文件路径时,一般会这么写: <script type="text/javascript" src="/sta ...
随机推荐
- Spring Security认证与授权
什么是Spring Security Spring Security是基于Spring框架,提供了一套Web应用安全性框架.专门为Java应用提供用户认证(Authentication)和用户授权(A ...
- 使用 Go 构建一个最小的 API 应用
最近有项目要使用 Go 开发,作为一个. NET Core 选手,准备先撸一个包含 CRUD 的最小 MVP 项目练手. 要创建一个 TODO 应用,会创建下面这些接口: API Descriptio ...
- PHP中的精确计算bcadd,bcsub,bcmul,bcdiv 及 扩展安装
<?php/** * 精确加法 * @param [type] $a [description] * @param [type] $b [description] */function math ...
- 一个开源、经典的 WPF 控件、组件和实用工具集合,值得参考学习!
前言 今天大姚给大家推荐一个开源.经典的 WPF 控件.组件和实用工具集合,对于想要自己编写 WPF UI 界面的同学可以参考借鉴学习:Extended.Wpf.Toolkit. 项目介绍 Exten ...
- Canon LBP2900安装Linux驱动的方法
Canon LBP2900使用Linux CAPT驱动,其最新版本是2017年3月的v2.71版,可从佳能中国官网下载.由于驱动包不提供install.sh安装脚本,某些依赖库需要检查后手动安装,具体 ...
- 工具 | StarCodeSecurity
0x00 简介 StarCodeSecurity是一款图形化的代码审计工具. 下载地址: StarCodeSecurity下载:StarCodeSecurity下载 0x01 功能说明 支持对规则进行 ...
- 代码随想录第一天 | Leecode 704 二分查找、27 移除元素、977 有序数组的平方
前言 今天是我开始刷Leecode的第一天,同时这也是开通博客园第一篇博客.我希望能在每篇博客中记录下我做出每一道题的过程,为此我想先说明一下我的博客内容的结构. 题目描述:首先说明题目的要求以及测试 ...
- Codeforces Round 978 (Div. 2) A-D1 题解
A. Bus to Pénjamo 题意 有一辆车上面有 \(r\) 排座位,每排有 \(2\) 个座位,现在共 \(n\) 个家庭出行坐公交车,每个家庭 \(a_i\) 个人(保证 \(2r\ge ...
- codebuddy模型基于Python的实时音视频直播系统开发:多线程采集、WebSocket传输与JWT安全认证实践
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 我现在需要帮用户解决一个Pyt ...
- linux窗口透明(全局透明,进程id查找wid,进程名称查找wid)
linux窗口透明 使用到了qt xcb-ewmh x11-xcb 效果图 如何实现 控制全部窗口透明 1.遍历WID树,的到全部窗口得wid 2.区别窗口属性,桌面和dock窗口不设置透明,其他窗口 ...