.. _django_static: ================ Django静态文件 ================ WEB网站的静态文件,例如图片,JavaScript或者CSS,对于Django来说,这些静态文件最好通过独立的WEB服务器,例如 :ref:`nginx` 来提供。这样能够充分发挥nginx的高性能,也降低Django自身的压力。 配置静态文件 =============== - 首先修改项目 ``settings.py`` 配置,在 ``INSTALLED_APPS`` 中确保包含了 ``django.contrib.staticfiles`` (这个默认已启用) - 在 ``settings.py`` 配置中定义 ``STATIC_URL`` :: STATIC_URL = '/static/' - 在模版中使用 ``static`` 模版tag来构建URL,并添加 ``STATICFILES_DIRS`` :: STATIC_URL = '/static/' STATICFILES_DIRS = (str(BASE_DIR.joinpath('static')),) .. note:: 这里配置是针对 Django 3.1+,使用了 ``pathlab`` ,如果是 Django 3.0或以前版本,则使用 ``STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]`` - 创建静态目录 ``static`` ,然后创建子目录 ``css`` , ``js`` , ``img`` :: mkdir static/css mkdir static/js mkdir static/img - 在项目的模版文件中添加2处静态文件配置 - 模版的开头添加 ``{% load static %}`` - 在合适的链接处添加 ``{% static %}`` 模版tag 举例,在项目中使用了 ``base.html`` 则类似:: {% load static %} Learn Django ... 此外,图片文件和JavaScripts文件位于 ``img`` 和 ``js`` 子目录,所以对应是:: .. note:: 在本地开发过程中,请将所有静态文件都存放到 ``static`` 的上述3个子目录。这样本地开发可以继续进行。 对于生产环境,只要执行下文的 ``collectstatic`` 命令,就会复制所有静态文件到 ``STATIC_ROOT`` 指定的目录,也就是 ``staticfiles`` 目录下。包括我们在本地开发时存储在 ``static`` 目录下的静态文件,这样在生产环境就可以正常使用了。 collectstatic =============== 需要注意,虽然本地Django服务器是提供静态文件服务的,但是对于生产环境, :ref:`nginx_gunicorn_django` 或者 :ref:`nginx_uwsgi_django` 都不会提供静态文件服务,而是通过 :ref:`nginx` 来提供。所以,Django内建了一个 ``collectstatic`` 命令来编译所有的静态文件到单一目录: - 使用 ``STATIC_ROOT`` 配置设置搜集这些文件的绝对路径,通常称为 ``staticfiles`` - 最终配置是 ``STATICFILES_STORAGE`` 也就是使用文件存储引擎来保存这些使用 ``collectstatic`` 命令搜集的静态文件。默认,这个设置是 ``django.contrib.staticfiles.storage.StaticFilesStorage`` 所以最终的 ``settings.py`` 配置如下:: # settings.py STATIC_URL = '/static/' STATICFILES_DIRS = (str(BASE_DIR.joinpath('static')),) # new STATIC_ROOT = str(BASE_DIR.joinpath('staticfiles')) # new STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage' # new - 然后执行以下命令搜集静态文件:: python manage.py collectstatic 此时会提示静态文件被复制到 ``STATIC_ROOT`` 指定目录下。 Nginx配置 ========== - 需要注意,生产环境使用的静态文件都位于 ``staticfiles`` 目录,所以对于nginx配置,需要将 ``/static`` 目录映射成 ``staticfiles`` 所在目录 .. literalinclude:: nginx_gunicorn_django/onesre-core.conf :language: bash :linenos: :caption: 需要注意这里的配置:: ... location /static/ { alias /home/admin/onesre/core/staticfiles/; } ``location /static/`` 使用了 ``alias`` 指令,并且对应目录都是使用了 ``/`` 结束,这样才能完全一一对应。 当然,如果你配置:: ... location /static/ { root /home/admin/onesre/core; } 也是可以的,但是这只能访问 ``/home/admin/onesre/core/static/`` 目录了,不能映射转换。就需要建立一个软链接,将 ``static`` 软链接到 ``staticfiles`` 。但这对通过 ``git clone`` 部署非常不方便。 参考 ====== - `Managing static files (e.g. images, JavaScript, CSS) `_ - `Django Documentation: The staticfiles app `_ - `Django Static Files and Templates `_