Django 开发时的静态文件配置参数以及 collectsta

2017-07-18  本文已影响0人  Tim_Lee

1 概述

通常生产情况下,Django 的项目文件与网站的静态文件是分开存放的,甚至可以存放在不同的服务器,比如 Django 的项目文件放在阿里云服务器,而同时把静态文件存放在七牛云。

在每一个 Django 项目中的 settings.py 文件中,最下面的注释里面就有关于静态文件处理的官方文档网址。文档对 Django 如何处理静态文件有详细的介绍。

Django 1.9.5 版本的 settings.py

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/

Django 1.11 版本的 settings.py

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

2 主要流程

对于 static 文件与 media 文件,本质是一样的,而且之前的 Django 版本是把这两种类型合并一起处理的。media 主要是针对用户上传的文件。static 是项目开发时,开发者提供的。

3 相应的设置

3.1 project/settings.py

完整代码如下

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static_cdn")

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "media_cdn")

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]
STATICFILES_DIRS

设置一个目录,用于存放开发时使用到的 static 文件。

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]
URL变量
STATIC_URL = '/static/'
MEDIA_URL = '/media/'

URL:STATIC_URLMEDIA_URL 会引导请求去找对应的 URL。具体的 url 路由会在后面进行设置。

ROOT变量

注意 BASE_DIR 指的是 manage.py所在的目录。

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

所以如果在 BASE_DIR 这个目录中设置文件夹,比如设置 templates 可以使用os.path.join(BASE_DIR, 'templates')

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates'),],
        # ...
    },
]

但是如果要设置到 manage.py 所在目录外,另外一个平行同级目录。

首先得到BASE_DIR 这个目录的上一级目录。

os.path.dirname(BASE_DIR)

在使用 os.path.join() 拼接得到与 BASE_DIR 平行的目录

STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static_cdn")
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "media_cdn")

得到的目录结构是

.
|-- media_cdn
|   |-- car.jpg
|   |-- landview.jpg
|   `-- beach.jpg
|-- README.md
|-- requirements.txt
|-- project
|   |-- db.sqlite3
|   |-- __init__.py
|   |-- manage.py
|   |-- posts
|   |-- static
|   |-- templates
|   `-- project
`-- static_cdn
    |-- admin
    |-- css
    `-- vendor

3.2 project/urls.py

在 urls.py 的文件中加入以下内容,这样就为 static 和 media 的ROOT目录设置好了路由。

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

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

之所以做了一个判断if settings.DEBUG: ,是因为上线以后就不再使用这些 ROOT 目录。

DEBUG 的状态是在 settings.py 中控制

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

3.3 使用 collectstatic

上面的参数设置好之后,就可以执行以下命令:

$ python manage.py collectstatic
上一篇 下一篇

猜你喜欢

热点阅读