找回密码
 立即注册
首页 业界区 业界 Django 实战:静态文件与媒体文件从开发配置到生产部署 ...

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

呶募妙 昨天 12:52
一、静态文件与媒体文件

区别与联系

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

在settings.py中,添加静态文件和媒体文件相关配置
  1. ### 静态文件配置
  2. STATIC_ROOT = BASE_DIR / "static"
  3. STATIC_URL = "/static/"
  4. ### 媒体文件配置(用户上传文件)
  5. MEDIA_ROOT = BASE_DIR / "media"  # 文件存储的绝对物理路径
  6. MEDIA_URL = "/media/"  # 访问媒体文件的URL前缀
  7. FILE_UPLOAD_MAX_MEMORY_SIZE = 10485760  # 10MB内存缓冲
  8. DATA_UPLOAD_MAX_MEMORY_SIZE = 104857600  # 100MB请求体限制
  9. ### 生产环境中,静态文件与媒体文件的访问地址
  10. NGINX_BASE_URL = "http://192.168.0.73"  # 填写Nginx或OpenResty 的IP或域名
复制代码
开发环境配置

在开发环境中,访问静态文件或媒体文件,需要在urls.py添加如下配置。点击查看完整代码
  1. ### 下面配置只有在 DEBUG=True 时才生效
  2. if settings.DEBUG:
  3.     # 在开发环境提供静态和媒体文件。生产环境请关闭,并使用Nginx或OpenResty
  4.     urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
  5.     urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
复制代码
二、媒体文件实战

实战场景

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

avatar_upload_rename()函数作用:头像文件重命名,然后按年份分目录存储
models.FileField()模型字段:

  • upload_to:指定上传位置
  • max_length:在数据库中创建为 varchar 类型,默认为 100 个字符
  • storage(可选):指定后端存储系统,默认为FileSystemStorage本地文件系统
  1. class SystemUsers(BaseModel, AbstractBaseUser):
  2.     # ...
  3.     avatar = models.FileField(
  4.         upload_to=avatar_upload_rename,
  5.         max_length=512,
  6.         blank=True,
  7.         null=True,
  8.         db_comment="头像地址",
  9.         help_text="头像地址",
  10.     )
  11.     # ...
  12.    
  13. def avatar_upload_rename(instance, filename):
  14.     """头像文件重命名,并指定存储路径"""
  15.     ext = filename.split(".")[-1]  # 获取文件扩展名
  16.     year = datetime.now().strftime("%Y")
  17.     timestamp = datetime.now().strftime("%Y%m%d%H%M%S%f")[:-3]
  18.     return f"avatars/{year}/{timestamp}.{ext}"  # 按年份分目录存储
  19.    
复制代码
定义序列化器
  1. class UserProfileAvatarSerializer(serializers.ModelSerializer):
  2.     """上传用户个人头像序列化器"""
  3.     avatarFile = serializers.FileField(
  4.         source="avatar",
  5.         help_text="头像地址",
  6.         max_length=512,
  7.     )
  8.     class Meta:
  9.         model = SystemUsers
  10.         fields = ["avatarFile"]
复制代码
定义视图

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

  • 当settings.DEBUG为True(即开发环境时),返回由Django提供文件访问的URL地址
  • 否则,返回Nginx提供文件访问的URL地址
instance.avatar.url:这里的avatar是一个FieldFile的实例,包含以下属性

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

实现效果

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

头像文件,按年份分目录存储
3.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列表里。
  1. INSTALLED_APPS = [
  2.         # ...
  3.     "django.contrib.staticfiles",
  4.     # ...
  5. ]
复制代码
运行下面命令,会将所有静态文件会汇总到配置文件settings.py指定的 STATIC_ROOT 目录
  1. # 收集静态文件
  2. python manage.py collectstatic
  3. # 或加上--noinput 参数,这样不用二次确认
  4. python manage.py collectstatic --noinput
复制代码
Nginx配置示例
  1. server {
  2.     listen 80;
  3.     server_name yourdomain.com;
  4.     # 静态文件路由
  5.     location /static/ {
  6.         alias /var/www/myapp/static/;  # 替换为实际的 Django 静态文件路径
  7.         expires 30d;  # 缓存时间
  8.         access_log off;  # 可选:关闭日志减少IO
  9.     }
  10.     # 媒体文件路由(用户上传内容)
  11.     location /media/ {
  12.         alias /var/www/myapp/media/; # 替换为实际的 Django 媒体文件路径
  13.     }
  14.     # 前端配置
  15.     location / {
  16.         root /www/sites/mars-mgn-vue/index;  # 前端构建目录
  17.         index index.html;
  18.         try_files $uri $uri/ /index.html;   # 支持前端路由
  19.     }
  20. }
复制代码
OpenResty配置示例
  1. server {
  2.     listen 80 ;
  3.     server_name 192.168.0.73;
  4.     # 静态文件配置 (CSS, JS, images)
  5.     location /static/ {
  6.         alias /static/;  # 替换为实际的 Django 静态文件路径
  7.         expires 1d;
  8.         access_log off;
  9.     }
  10.     # 媒体文件配置 (用户上传内容)
  11.     location /media/ {
  12.         alias /media/;  # 替换为实际的 Django 媒体文件路径
  13.         expires 1d;
  14.         access_log off;
  15.     }
  16.     index index.php index.html index.htm default.php default.htm default.html;
  17.     proxy_set_header Host $host;
  18.     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  19.     proxy_set_header X-Forwarded-Host $server_name;
  20.     proxy_set_header X-Real-IP $remote_addr;
  21.     proxy_http_version 1.1;
  22.     proxy_set_header Upgrade $http_upgrade;
  23.     proxy_set_header Connection $http_connection;
  24.     access_log /www/sites/mars-mgn-vue/log/access.log main;
  25.     error_log /www/sites/mars-mgn-vue/log/error.log;
  26.     location ^~ /.well-known/acme-challenge {
  27.         allow all;
  28.         root /usr/share/nginx/html;
  29.     }
  30.     # 前端配置
  31.     location / {
  32.         root /www/sites/mars-mgn-vue/index;  # 前端构建目录
  33.         index index.html;
  34.         try_files $uri $uri/ /index.html;   # 支持前端路由
  35.     }
  36. }
复制代码
点击查看完整代码
您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册