【Django】 Static Files
Managing static files (e.g. images, JavaScript, CSS)
网站通常需要提供其他文件,例如图像、JavaScript 或 CSS。 在 Django 中,我们将这些文件称为“静态文件”。 Django 提供 django.contrib.staticfiles
来帮助您管理它们。
此页面描述了如何提供这些静态文件。
Configuring static files
Make sure that django.contrib.staticfiles is included in your INSTALLED_APPS
.
In your settings file, define STATIC_URL
, for example:
STATIC_URL = '/static/'
In your templates, use the static template tag to build the URL for the given relative path using the configured STATICFILES_STORAGE
.
{% load static %}
<img src="{% static 'my_app/example.jpg' %}" alt="My image">
Store your static files in a folder called static in your app. For example 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来命名静态资产。
Serving static files during development
如果您django.contrib.staticfiles
按上述说明使用, runserver
则在DEBUG设置为True时会自动执行此操作。如果您在 INSTALLED_APPS
中没有 django.contrib.staticfiles
,您仍然可以使用 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
那样执行静态文件发现。
Serving files uploaded by a user during development
在开发过程中提供用户上传的文件
在开发过程中,您可以使用 django.views.static.serve()
视图从 MEDIA_ROOT
提供用户上传的媒体文件。
这不适合生产使用! 有关一些常见的部署策略,请参阅部署静态文件。
例如,如果您的 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)
此辅助函数仅在
debug
模式下工作,并且仅当给定的前缀是本地的(例如/media/
)而不是 URL(例如http://media.example.com/
)。
Testing
当运行使用实际 HTTP 请求而不是内置测试客户端的测试时(即使用内置 LiveServerTestCase 时),静态资产需要与其余内容一起提供,以便测试环境忠实地再现真实的内容 可能,但 LiveServerTestCase
只有非常基本的静态文件服务功能:它不知道 staticfiles
应用程序的查找程序功能,并假设静态内容已经在 STATIC_ROOT 下收集。
因此,staticfiles 提供了自己的 django.contrib.staticfiles.testing.StaticLiveServerTestCase,它是内置的子类,能够在执行这些测试的过程中以一种非常类似于我们得到的方式透明地提供所有资产 在开发时使用 DEBUG = True
,即不必先使用 collectstatic 收集它们。
Deployment
部署
django.contrib.staticfiles 提供了一个方便的管理命令,用于在单个目录中收集静态文件,以便您可以轻松地为它们提供服务。
- 1.将
STATIC_ROOT
设置设置为您想要提供这些文件的目录,例如:
STATIC_ROOT = "/var/www/example.com/static/"
- 2.运行 collectstatic 管理命令:
$ python manage.py collectstatic
这会将静态文件夹中的所有文件复制到 STATIC_ROOT 目录中。
- 3.使用您选择的 Web 服务器来提供文件。 部署静态文件涵盖了一些常见的静态文件部署策略。
learn more
本文档涵盖了基础知识和一些常见的使用模式。 有关 django.contrib.staticfiles
中包含的所有设置、命令、模板标签和其他部分的完整详细信息,请参阅 staticfiles 参考。