彻底搞懂Django静态文件管理

本文详细介绍了Django中静态文件的管理,包括为何要管理静态文件、开发环境和生产环境下的管理策略。推荐在开发环境中使用`django.contrib.staticfiles`自动管理,而在生产环境中,静态文件应放在独立服务器上以提高效率。同时,文章讲解了如何配置多应用共享静态文件、手动管理方式,以及处理用户上传的静态文件的方法。

为什么要管理静态文件

Django官方教程说:

We recommend using a separate Web server – i.e., one that’s not also running Django – for serving media.

即建议用个额外的web服务器处理静态文件。实际部署过程中,常用Nginx作为反向代理服务器以及静态文件服务器。

对于静态文件的处理很麻烦,因为在开发模式和实际部署时还会有区别。很多教程上来就是怎么做,而不说为什么要那样做。

那么,到底为什么呢?

在Stack Overflow上找到的答案是:为了效率

  1. 把静态文件放到另一个服务器,甚至另一个域/子域,能大幅优化对它们的处理(比如用Nginx)
  2. 能减少网络阻塞。如果静态文件和动态应用在同一个域内,浏览器访问静态文件时,就会把域的cookies也放到请求里,其实是没必要的;如果静态文件在另一个域内,该域就可以配置为无需cookies的域(cookieless domain)。

接下来问题又来了,为什么小小的cookies会这么影响效率呢?因为网络访问过程中,上传和下载是不对等的,至少是1:10,且一般只对下载做压缩,对上传不做。所以谷歌说了:

The best way to cut down on client request time is to reduce the number of bytes uploaded as request header data. So, minimize request size and serve static content from a cookieless domain. – developers.google.com

详见:Why you need a cookie-less domain

Django开发环境静态文件管理

开发模式下,有两种方法:使用 django.contrib.staticfiles自动管理,或手工配置。

使用 django.contrib.staticfiles 自动管理

Django提供了django.contrib.staticfiles app来管理静态文件。

在开发环境下,如果使用了django.contrib.staticfiles,且DebugTrue时,runserver命令会自动处理静态文件。但这种方式效率极低,且不安全。

配置某个app使用的静态文件
  1. settings.py中,将其加入 INSTALLED_APPS
    在这里插入图片描述
  2. settings.py中,加入:
STATIC_URL = '/static/'
  1. 在模板中用static标签处理相对路径:
{% load static %}
<img src="{% static 'my_app/example.jpg' %}" alt="My image">
  1. 将静态文件存储到app目录下的static文件夹:
my_app/static/my_app/example.jpg
配置多app共用的静态文件

如果有些静态文件并非某app独用,比如有个logo,想让多个app共享使用,可在settings.py中定义:

STATICFILES_DIRS = [
    BASE_DIR / "static",
    '/var/www/static/',
]

Django就会在这些文件夹里寻找静态文件。

但除非是公共静态文件,最好别放到这些目录里。因为Django的STATICFILES_FINDERS还会自动扫描所有INSTALLED_APPS中叫static的子文件夹寻找静态文件,所以最好也用与app同名的命名空间区分,否则就无法区分同名静态文件,直接拿第一个匹配的使用。

手动管理静态文件

如果不用django.contrib.staticfiles,可以使用django.views.static.serve()视图来管理静态文件。

  1. settings.py中,加入:
STATIC_URL = '/static/'
  1. urls.py中,加入helper函数:
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

该helper函数仅在debug模式下,且前缀是本地路径(如/static/,而非http://static.example.com/)时生效。

并且它只处理STATIC_ROOT文件夹,不会像django.contrib.staticfiles.那样去搜索app中的static文件夹。

STATIC_ROOT表示collectstatic命令会将静态文件采集到的目的地绝对路径(django.contrib.staticfiles app负责采集)。

处理用户上传的静态文件

使用 django.views.static.serve()视图,通过指定MEDIA_ROOT( 如/media/)来处理用户上传的文件:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

该helper函数仅在debug模式下,且前缀是本地路径(如/media/,而非http://media.example.com/)时生效。

Django生产环境静态文件管理

在同一个服务器上部署

  1. 在服务器上运行collectstatic指令
  2. 设置服务器的静态文件配置为STATIC_URL下的STATIC_ROOT

在专门静态文件服务器上部署

  1. 静态文件发生变动时,在本地执行collectstatic
  2. STATIC_ROOT目录的静态文件部署到静态文件服务器,通常用rsync文件同步工具

参考:rsync用法教程

### 如何在Django项目中正确移除应用及其关联文件 当决定从Django项目中移除某个应用时,确保执行一系列操作以彻底清理该项目中的所有相关痕迹。以下是具体的操作方法: #### 修改`INSTALLED_APPS` 打开项目的settings.py文件,找到并编辑`INSTALLED_APPS`列表,从中移除对应的应用名称[^3]。 ```python # settings.py INSTALLED_APPS = [ ... # Remove the app name here, e.g., 'your_app_name', ... ] ``` #### 删除URL映射 检查项目的根目录下的`urls.py`文件,确认不存在指向该应用视图函数的任何路径配置。依据给定的信息,在`personal_portfolio/urls.py`中有如下代码段需被处理[^1]: ```python urlpatterns = [ path('admin/', admin.site.urls), # 下面这行应该被删除 # path('', include('hello_world.urls')), ] ``` #### 数据库迁移回滚 如果之前为这个应用运行过数据库迁移命令,则现在应当撤销这些更改。可以通过以下命令实现这一点;请注意替换`<appname>`为实际的应用名以及指定要回退到的具体版本号或初始状态。 ```bash python manage.py migrate <appname> zero ``` 此命令会将所有的迁移记录重置至最原始的状态,并不会真正地删除表结构。为了完全清除不再需要的数据模型对应的表格,可以考虑手动通过SQL语句完成这一过程或者借助第三方工具如django-cleanup等辅助插件来进行更精细控制。 #### 清理静态资源与媒体文件 对于那些由特定应用管理的静态资产(static assets)或是上传后的多媒体资料(media files),也需要一并审查是否存在冗余项待清理的情况。通常这类资源存放在项目的公共收集区(`STATIC_ROOT`, `MEDIA_ROOT`)内或者是云存储服务里边。 #### 物理删除源码树 最后一步就是物理上把整个应用模块所在的文件夹删掉。假设目标位于`myproject/apps/hello_world`位置下的话,那么就直接将其整个目录连同内部的所有子元素一同移除即可。 以上步骤完成后,记得再次验证网站能否正常运作无误后再继续其他开发工作。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值