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

简介: Django项目中,静态文件(Static Files)和媒体文件(Media Files)是两类不同用途的文件。本文详细介绍了它们的区别、配置方法以及在开发与生产环境中的处理方式,并结合用户头像上传功能进行实战演示,最后讲解了如何通过Nginx或OpenResty部署静态与媒体文件服务。

一、静态文件与媒体文件

区别与联系

在 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 文件大小

image-20250717093727565.png

实战效果

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

image-20250717095545217.png

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

image-20250717100107618.png

如果在生产环境(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从入门到实战》专栏!关注不迷路~

相关文章
|
5月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
175 1
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
437 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
监控 应用服务中间件 网络安全
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
806 0
|
5月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
162 1
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
653 45
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
455 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
484 7
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
440 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
358 2