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 是项目开发时,开发者提供的。
- 设定好 MEDIA_URL/STATIC_URL, STATIC_ROOT/MEDIA_ROOT 以及 STATICFILES_DIRS 。
- 使用
python manage.py collectstatic
- media:用户上传时,会传到指定的 media_cdn 文件目录中。如果models 的 ImageField 设定
upload_to
属性,可以上传到指定目录中。 - static:开发时,把静态文件都放在 STATICFILES_DIRS 中设定的 static 目录,运行
python manage.py collectstatic
会把 static 目录中的文件复制到 STATIC_ROOT 中设置的文件(static_cdn)。 - 用户访问时,通过路由会指向相应的静态文件。
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_URL
和 MEDIA_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
网友评论