网站首页 文章专栏 django MEDIA_ROOT、STATIC_ROOT的使用和区别
本站使用的django 开发,故使用了nginx 反向代理,之前一切使用良好,今天要上传一个图片,突然发现上传后,打开404。百思不得其解,这明明上传成功了,文件我也看了,也有啊。思考 ,再次思考 。突然想起来,是不是需要python manage.py collectstatic 把静态文件复制到 settings.STATIC_ROOT 于是,就是傻傻地执行了一下
python manage.py collectstatic
OK,果断是这样,可以打开了。
反思,反思,以后每次上传完图片,还要执行这个命令?这是不是太不人性化?难道django 就是这样?不会吧,当了十几年大哥了,如果连这个都想不到,白瞎了我的哥。接下来,通过查阅资料,原来是这样的
DJANGO 对静态文件分两种处理:
分别 对 css,js ,png,jpeg,jpg等,(不需要动态更改的,意思是就是部署上去就不改变放里面)
STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'对上传图片这类的静态文件,需要另一个配置:
MEDIA_ROOT = os.path.join(BASE_DIR, 'img') MEDIA_URL = '/img/'STATICFILES_STORAGE 这个真不知道什么意思
STATIC_ROOT 项目根目录下 staticfiles 目录,开发时(DEBUG=True), 不会理它,生产环境就需要执行(collectstatic)来生成.
STATIC_URL 请求访问时的前缀,其实叫请求访问的标示更对,告诉DJANGO 以这个开头的URL 是要访问staticfiles目录下的资源
MEDIA_ROOT 同STATIC_ROOT 一要,它就在项目根目录下创建 img 目录
MEDIA_URL 同STATIC_URL 一样,html页面访问时是这样
如果上传后,图片目录是这样的 项目根目录/img/images/logo.png ,那就按下面的依此类推
<img src="{{MEDIA_URL}}/images/logo.png">
静态文件就更不会用说了<img src="{{STATIC_URL}}/css/home.css">
最后,要在urls.py 后面添加
from django.contrib.staticfiles.urls import staticfiles_urlpatterns import settings from django.conf.urls.static import static ..... urlpatterns = [ # Examples: # url(r'^$', 'project.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^$', home), url(r'index', index), url(r'^health$', health), ......... ] urlpatterns += staticfiles_urlpatterns() urlpatterns += static(settings.MEDIA_URL , document_root=settings.MEDIA_ROOT)
开发时当你DEBUG = true ,一切是正常的,如果你想在开发时试试DEBUG=False 时,上传的图片还是会404的,因为 DJANGO 默认关闭DEBUG时,不会对图片进行处理,这就需要前端有代理做这样的事,下面贴出我nginx 的配置
server { listen 80 default_server; client_max_body_size 50M; server_name www.zhaoyanchang.com zhaoyanchang.com; location / { proxy_pass http://127.0.0.1:8000; #你的django 开放端口 proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect http:// https://; } location /static { #这里做了访问静态目录不走uwsgi expires 30d; autoindex on; add_header Cache-Control private; alias /web/perblog/staticfiles; # } location /img { #这里做了访问静态目录不走uwsgi expires 30d; autoindex on; add_header Cache-Control private; alias /web/perblog/img; # }
好辛苦的,转载请自留链接