如何管理静态文件(如图像、JavaScript、css)

网站通常需要提供额外的文件,如图像、JavaScript或CSS。在Django中,我们将这些文件称为“静态文件”。Django提供 django.contrib.staticfiles 帮助你管理它们。

本页介绍如何为这些静态文件提供服务。

配置静态文件

  1. 确保 django.contrib.staticfiles 包含在您的 INSTALLED_APPS .

  2. 在设置文件中,定义 STATIC_URL 例如:

    STATIC_URL = "static/"
    
  3. 在模板中,使用 static 模板标记,以使用配置的 staticfiles STORAGES 别名。

    {% load static %}
    <img src="{% static 'my_app/example.jpg' %}" alt="My image">
    
  4. 将静态文件存储在名为 static 在你的应用程序中。例如 my_app/static/my_app/example.jpg .

提供文件

除了这些配置步骤之外,您还需要实际服务于静态文件。

在开发过程中,如果您使用 django.contrib.staticfiles ,这将由自动完成 runserver 什么时候? DEBUG 设置为 True (见 django.contrib.staticfiles.views.serve()

这种方法是 效率极低 而且可能 不安全的 就是这样 不适合生产 .

如何部署静态文件 为生产环境中的静态文件提供适当的策略。

您的项目可能还具有与特定应用程序无关的静态资产。除了使用 static/ 目录在应用程序中,您可以定义目录列表 (STATICFILES_DIRS )在设置文件中,Django还将查找静态文件。例如::

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

有关 STATICFILES_FINDERS 如何设置详细信息 staticfiles 查找您的文件。

静态文件名间距

现在我们 可以 直接将静态文件放入 my_app/static/ (而不是创造另一个 my_app 子目录),但这实际上是一个坏主意。Django将使用它找到的第一个静态文件,如果在 不同的 应用程序,Django将无法区分它们。我们需要能够将Django指向正确的一个,确保这一点的最佳方法是 命名空间 他们。也就是说,通过将这些静态文件放入 另一个 为应用程序本身命名的目录。

您可以在中命名静态资产 STATICFILES_DIRS 通过指定 prefixes .

在开发期间为静态文件提供服务

如果你使用 django.contrib.staticfiles 如上所述, runserverDEBUG 设置为 True . 如果你没有 django.contrib.staticfiles 在里面 INSTALLED_APPS ,您仍然可以使用 django.views.static.serve() 查看。

这不适合生产使用!有关一些常见的部署策略,请参见 如何部署静态文件 .

例如,如果您的 STATIC_URL 被定义为 static/ ,您可以通过将以下代码片断添加到 urls.py **

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)

备注

此帮助器函数仅在调试模式下工作,并且仅当给定的前缀是本地的(例如 static/ ),而不是URL(例如 http://static.example.com/ )。

此外,此助手函数仅用于 STATIC_ROOT 文件夹;它不执行静态文件发现,例如 django.contrib.staticfiles .

最后,静态文件通过WSGI应用层的包装器提供。因此,静态文件请求不会通过正常 middleware chain

为用户在开发过程中上载的文件提供服务

在开发过程中,您可以从 MEDIA_ROOT 使用 django.views.static.serve() 查看。

这不适合生产使用!有关一些常见的部署策略,请参见 如何部署静态文件 .

例如,如果您的 MEDIA_URL 被定义为 media/ ,您可以通过将以下代码片断添加到 ROOT_URLCONF **

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)

备注

此帮助器函数仅在调试模式下工作,并且仅当给定的前缀是本地的(例如 media/ ),而不是URL(例如 http://media.example.com/ )。

测试

运行使用实际HTTP请求而不是内置测试客户机的测试时(即使用内置测试客户机时 LiveServerTestCase )静态资产需要与其他内容一起使用,因此测试环境尽可能忠实地复制真实的内容,但是 LiveServerTestCase 只有非常基本的静态文件服务功能:它不知道 staticfiles 应用程序并假定静态内容已在 STATIC_ROOT .

因为这个, staticfiles 船舶自己 django.contrib.staticfiles.testing.StaticLiveServerTestCase 是内置测试的一个子类,它能够在执行这些测试期间透明地服务于所有资产,其方式与我们在开发时使用的方式非常相似。 DEBUG = True 也就是说,不必使用 collectstatic 第一。

部署

django.contrib.staticfiles 提供了一个方便的管理命令,用于在单个目录中收集静态文件,以便您可以轻松地为它们提供服务。

  1. 设置 STATIC_ROOT 设置为要从中提供这些文件的目录,例如:

    STATIC_ROOT = "/var/www/example.com/static/"
    
  2. 运行 collectstatic 管理命令:

    $ python manage.py collectstatic
    

    这会将静态文件夹中的所有文件复制到 STATIC_ROOT 目录。

  3. 使用您选择的Web服务器来提供文件。 如何部署静态文件 介绍静态文件的一些常见部署策略。

了解更多

本文档介绍了一些基础知识和一些常见的使用模式。有关中包含的所有设置、命令、模板标记和其他项的完整详细信息 django.contrib.staticfilesthe staticfiles reference .