网站首页 文章专栏 django MEDIA_ROOT、STATIC_ROOT的使用和区别
django MEDIA_ROOT、STATIC_ROOT的使用和区别
编辑时间:2017年7月5日 17:30 作者:赵彦昌 浏览量:196

    本站使用的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; #
        }


好辛苦的,转载请自留链接




来说两句吧
最新评论