最重要的:Django要在开启debug模式才会加载静态文件,关闭debug情况下需要使用解析服务(个人使用Apache)
这个问题卡了我两天
背景:
环境:
系统:Windows10
Python:3.6
Django:2.0.2
Apache:2.4
在使用Django关闭Debug模式后,想生成一个404页面,涉及到静态文件加载的问题。
一开始就搜索:Django配置静态文件,很多文档都没有说要开启Debug才会加载静态文件这个问题,看官方文档的时候居然都没注意到。(贴上官方文档)
实战:
在Django里需要编写的:
settings.py文件中相关代码及说明:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/
STATIC_URL = '/static/'
# STATIC_ROOT设置运行python manage.py collectstatic命令后存放所有搜集到的静态文件(包括各个app里静态文件)的目录,可以方便apache部署
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')
# STATICFILES_DIRS设置一些存放公共静态文件的目录,不能和STATIC_ROOT的目录一样,也可以不写
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "common_static"),
)
# 这个是默认设置,Django 默认会在 STATICFILES_DIRS中的文件夹 和 各app下的static文件夹中找文件
# 注意有先后顺序,找到了就不再继续找了
STATICFILES_FINDERS = (
"django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder"
)
可以把静态文件放在app的static文件夹下,或者STATICFILES_DIRS目录中。
我的目录结构:
我把common_static(公共静态文件夹)、collected_static(搜集的静态文件夹)放在项目目录下,把static(app的静态文件夹)放在app目录下
在DEBUG = True的情况下,使用runserver命令后,可以直接访问:static/movieWebSite/images/bg.jpg 来访问该图片。
同样,像官方文档里所说:
在settings.py文件中的INSTALLED_APPS项下一定要有django.contrib.staticfiles。
在HTML中需要编写的:
{% load static %}
<link rel="stylesheet" href="{% static 'movieWebSite/css/font-awesome.min.css' %}" media="all" />
最后,要部署到Apache上
先使用python manage.py collectstatic 命令搜集静态文件,可以方便apache部署
在httpd.conf文件中,增加如下内容:
<VirtualHost *:80>
Alias /media/ /path/to/media/ #此为meida文件的设置,可以注释掉
Alias /static/ collected_static目录的位置 #(eg:D:/allFile/Python_Project/Web/Movie/collected_static/)(注意最后需要一个'/')
<Directory /path/to/media> #此为media目录的设置,可以注释掉
Require all granted
</Directory>
<Directory collected_static目录的位置> #(eg:D:/allFile/Python_Project/Web/Movie/collected_static)
Require all granted
</Directory>
WSGIScriptAlias / wsgi文件位置 #(eg:D:/allFile/Python_Project/Web/Movie/Movie/wsgi.py)
<Directory wsgi文件所在目录位置> #(eg:D:/allFile/Python_Project/Web/Movie/Movie)
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
重启Apache服务器就OK了。
闲谈:
如果静态文件加载不出来,可以用python manage.py findstatic (staticfile) 命令来查找静态文件位置是否放置正确。
其实发现官方文档才是最有用的。