一、静态文件与媒体文件

区别与联系

在 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 实战:静态文件与媒体文件从开发配置到生产部署的更多相关文章

  1. 使用mediainfo工具统计每个视频文件(媒体文件)播放时长

    需求 1.运营那边需要统计大量视频文件的播放时长,并汇总记录到excel表中,问我有什么方法搞定 这边搜索了很多统计媒体文件时长的,主要有以下几种 1.使用java获取 2.使用python获取 3. ...

  2. [Django实战] 第3篇 - 用户认证(初始配置)

    当大家打开一个网站时,第一步做什么?大部分一定是先登录吧,所以我们就从用户认证开始. 打开用户认证 Django本身已经提供了用户认证模块,使用它可以大大简化用户认证模块的开发,默认情况下,用户认证模 ...

  3. 36、Django实战第36天:首页功能开发

    1.编辑users.views.py ... class IndexView(View): """ 首页 """ def get(self, ...

  4. 27、Django实战第27天:全局搜索功能开发

    当我们选择其中一个类别(公开课,课程讲师,授课老师),输入搜索内容,点击搜索后会跳转到相应的列表页中进行展示 我们输入的内容作为参数keyword传入后台 搜索"公开课" 当课程中 ...

  5. Django (七) token&静态文件&媒体文件

    token&静态文件&媒体文件 1. token 1. 会话技术 2. 服务端会话技术 3. 它实际上就是手动实现的session 4. 实现token 4.1 在models.py中 ...

  6. Django app安装,配置mysql,时区,模板,静态文件,媒体,admin

    1.创建app python manage.py startapp 名字 Migrations 数据库同步目录,记录数据库同步的记录 init 包文件 Admin.py django自带的后台管理文件 ...

  7. Django 配置文件settings注解(含静态文件和上传文件配置)

    基于Django1.11配置文件settings.py import os import sys # Build paths inside the project like this: os.path ...

  8. [django]windows下用Django,静态文件请求失败,出现UnicodeDecodeError

    问题:windows下用Django,静态文件请求失败,出现UnicodeDecodeError:'utf-8' codec can't decode byte 0xb0 in position 1: ...

  9. django处理静态文件

    静态文件指的是js css 还有图片这些,配置方法如下 1. 在设置文件(settings.py)中,installed_apps中添加 django.contrib.staticfiles 然后设置 ...

  10. Django中静态文件引用优化

    静态文件引用优化 在html文件中是用django的静态文件路径时,一般会这么写: <script type="text/javascript" src="/sta ...

随机推荐

  1. Spring Security认证与授权

    什么是Spring Security Spring Security是基于Spring框架,提供了一套Web应用安全性框架.专门为Java应用提供用户认证(Authentication)和用户授权(A ...

  2. 使用 Go 构建一个最小的 API 应用

    最近有项目要使用 Go 开发,作为一个. NET Core 选手,准备先撸一个包含 CRUD 的最小 MVP 项目练手. 要创建一个 TODO 应用,会创建下面这些接口: API Descriptio ...

  3. PHP中的精确计算bcadd,bcsub,bcmul,bcdiv 及 扩展安装

    <?php/** * 精确加法 * @param [type] $a [description] * @param [type] $b [description] */function math ...

  4. 一个开源、经典的 WPF 控件、组件和实用工具集合,值得参考学习!

    前言 今天大姚给大家推荐一个开源.经典的 WPF 控件.组件和实用工具集合,对于想要自己编写 WPF UI 界面的同学可以参考借鉴学习:Extended.Wpf.Toolkit. 项目介绍 Exten ...

  5. Canon LBP2900安装Linux驱动的方法

    Canon LBP2900使用Linux CAPT驱动,其最新版本是2017年3月的v2.71版,可从佳能中国官网下载.由于驱动包不提供install.sh安装脚本,某些依赖库需要检查后手动安装,具体 ...

  6. 工具 | StarCodeSecurity

    0x00 简介 StarCodeSecurity是一款图形化的代码审计工具. 下载地址: StarCodeSecurity下载:StarCodeSecurity下载 0x01 功能说明 支持对规则进行 ...

  7. 代码随想录第一天 | Leecode 704 二分查找、27 移除元素、977 有序数组的平方

    前言 今天是我开始刷Leecode的第一天,同时这也是开通博客园第一篇博客.我希望能在每篇博客中记录下我做出每一道题的过程,为此我想先说明一下我的博客内容的结构. 题目描述:首先说明题目的要求以及测试 ...

  8. Codeforces Round 978 (Div. 2) A-D1 题解

    A. Bus to Pénjamo 题意 有一辆车上面有 \(r\) 排座位,每排有 \(2\) 个座位,现在共 \(n\) 个家庭出行坐公交车,每个家庭 \(a_i\) 个人(保证 \(2r\ge ...

  9. codebuddy模型基于Python的实时音视频直播系统开发:多线程采集、WebSocket传输与JWT安全认证实践

    我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 我现在需要帮用户解决一个Pyt ...

  10. linux窗口透明(全局透明,进程id查找wid,进程名称查找wid)

    linux窗口透明 使用到了qt xcb-ewmh x11-xcb 效果图 如何实现 控制全部窗口透明 1.遍历WID树,的到全部窗口得wid 2.区别窗口属性,桌面和dock窗口不设置透明,其他窗口 ...