Django管理静态文件

牧云@^-^@ 提交于 2019-12-06 14:32:14

网站通常需要其它文件,例如:图片、JavaScript 或者CSS。在Django 中,我们将这类文件统称为“静态文件”。Django 提供django.contrib.staticfiles 来帮助管理它们。

本页面描述如何提供这些静态文件。

配置静态文件

  1. 确认django.contrib.staticfiles 包含在你的INSTALLED_APPS 中。

  2. 在你的settings 文件中定义STATIC_URL,例如:

    STATIC_URL = '/static/'
  3. 在模板中,你可以硬编码/static/my_app/myexample.jpg 这样的URL,或者使用static 模板标签以及配置的STATICFILES_STORAGE为给出的相对路径创建URL(这使得换成CDN 来保存静态文件更加容易)。

    {% load staticfiles %}
    <img src="{% static "my_app/myexample.jpg" %}" alt="My image"/>
  4. 在你的应用中,将静态文件存储在名为static 目录下。例如:my_app/static/my_app/myimage.jpg。

启用静态文件服务

除了这些配置步骤之外,实际中你还需要启用静态文件服务。

在开发过程中,如果你使用django.contrib.staticfiles,当DEBUG 设置成True 时,runserver 会自动启用静态文件服务(参见django.contrib.staticfiles.views.serve())。

这个方法非常低效而且可能不安全,所以它不适合线上环境

关于线上环境保存静态文件的策略,参见部署静态文件

你的项目可能还有一些静态文件不属于任何一个特定的应用。除了在应用中使用static/ 目录,你还可以在settings 文件中定义一个目录列表(STATICFILES_DIRS),Django 会在其中查找静态文件。例如:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
    '/var/www/static/',
)

staticfiles 如何查找静态文件的细节,请参见STATICFILES_FINDERS 设置的文档。

静态文件的命名空间

现在,我们虽然能够将静态文件直接放在my_app/static/之下(而不用创建另外一个my_app 子目录),但是这是一个坏主意。Django 将使用它找到的名称匹配第一个静态文件, 如果你在另外一个不同 的应用中有相同名称的静态文件,Django 将无法区分它们。我们需要让Django 能够找到正确的静态文件,最简单的方法是给它们加上命名空间。方法是将这些静态文件放在与应用同名的另外一个目录中。

开发过程中启用静态文件服务

如上所述,如果你启用django.contrib.staticfiles,当DEBUG 设置为True 时,runserver 将自动启用静态文件服务。如果django.contrib.staticfiles 不在INSTALLED_APPS 中,你仍然可以使用django.contrib.staticfiles.views.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)

这个辅助函数只在debug 模式下工作,而且给定的前缀必须是本地的(例如,/static/)而不能是一个URL(例如,http://static.example.com/)。

另外这个辅助函数只查找STATIC_ROOT 目录下的文件;它不会像django.contrib.staticfiles 那样查找静态文件。

保存开发过程中由用户上传的文件

在开发过程中,你可以使用django.contrib.staticfiles.views.serve() 视图,处理用户上传的来自于MEDIA_ROOT的media文件。

注意:该方式不适合在线上环境中使用! 关于一些常见的部署策略,请参阅部署静态文件一节.

例如,如果将MEDIA_URL设置为/media/, 可将下列代码片段添加到urls.py中实现:

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/)..

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!