5、静态目录
5.1、【方案一】简单,但不推荐,适合开发环境使用
简单来说,文件都丢进来,不需要配置路由,只要路径正确,会去找这些文件。
步骤:
- 根目录下新建
static
文件夹; - settings.py 进行配置,如下:
- static目录下新建
abc.html
,body标签内写abc
; - 访问
/abc.html
,会返回 static/abc.html 的内容;
settings.py的配置:
# 这个是配置访问静态文件的路径的,例如 static 下有 abc.html,那么访问路径是 /static/abc.html
STATIC_URL = '/'
# 这个是配置静态文件夹在哪里
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
注意:
- 默认情况下,静态文件的优先级比路由匹配高;
- 所以建议静态文件的路径应以 static 开头;
- 但是,这样效率极低,也不安全,因此不推荐在生产环境这么做(官方文档如此说的);
5.2【方案二】复杂,但专业,适合生产环境
简单来说,Django 负责路由,而例如 Nginx/CDN 服务器负责处理文件。
参考:https://docs.djangoproject.com/en/2.2/howto/static-files/deployment/
生产环境:
settings.py 文件里,DEBUG = False 为生产环境,DEBUG = True 时为开发环境。
思路:
- 将应用(APP)通过配置添加到 settings.py 里;
- 配置 collectstatic 命令执行后,将静态文件放在哪里;
- 执行 python manage.py collectstatic 命令,将各个应用(APP)(第一步配置)里的静态文件,放到指定文件夹中去(第二步配置);
- 让例如 nginx 服务器指向这个文件夹,想访问指定文件时,就通过 nginx 返回该文件(而不是通过 django 来实现);
具体步骤:
1、将应用添加到配置中。例如有一个 homepage 应用,就如下面这么写:
# 这里添加你配置的 app 名,例如 homepage
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 以上都是默认,下面是新加入的
'homepage'
]
2、配置 collectstatic 命令相关内容,具体见注释:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
# 在这里,当访问静态文件时,会自动添加 static
# 例如访问默认应用 admin 时,他会加载 admin/css/base.css,这里配置后,加载的资源链接变为 /static/admin/css/base.css
# 也可以写为:STATIC_URL = 'http://192.168.0.0/static/' 这样的形式(方便CDN)
STATIC_URL = '/static/'
# 配置默认静态文件夹路径
# 在开发环境下,访问静态资源,可以直接访问这里配置的路径下的文件,例如web访问url为 /static/a.html,实际上访问的是根目录下 /static/a.html 这个文件
# 在生产环境下,会将这些目录下的文件复制到 STATIC_ROOT 这里配置的目录中(注意,如果有同名文件,可能会被覆写,他会提示你)
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
# 当运行 python manage.py collectstatic 的时候
# STATIC_ROOT 目录,是用来将所有 STATICFILES_DIRS 中所有文件夹中的文件,以及各app中(在INSTALLED_APPS里配置)的static中的文件,都复制到这里配置的文件夹中
# 集中之后,方便通过例如 nginx 服务器,或者 CDN 之类的进行部署
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')
# 这个是默认设置,Django 默认会在 STATICFILES_DIRS 中的文件夹 和 各app下的static文件夹中找文件
# 注意有先后顺序,找到了就不再继续找了
STATICFILES_FINDERS = (
# 这个先写的话,如果有重复文件,会优先采用 STATICFILES_DIRS 文件夹中的文件
"django.contrib.staticfiles.finders.FileSystemFinder",
# 同上,会优先采用应用中的文件
"django.contrib.staticfiles.finders.AppDirectoriesFinder"
)
3、执行 python manage.py collectstatic 命令,他会将 homepage 应用中,static目录下的所有文件,和应用里的文件都复制到 STATIC_ROOT 配置的目录中。
建议先删除该文件夹,再执行命令,否则 overwrite 时,可能会出错。
4、将该静态文件夹丢到nginx或者CDN上去即可。