• Django静态文件的加载以及STATIC_URL、 STATIC_ROOT 、STATICFILES_DIRS的区别


    Djangon生产环境静态资源的处理

    Django 关闭DEBUG模式后,就相当于是生产环境了。

    Django框架一旦作为生产环境,它的静态文件访问接口就不应该从Django框架中走,必须在Django框架前端部署nginx或者其他web服务器来提供静态访问入口

    With debug turned off Django won't handle static files for you any more - your production web server (Apache or something) should take care of that.

    nginx配置如下:

    server {
        listen         80;
        server_name    127.0.0.1
        charset UTF-8;
        access_log      /var/log/nginx/django_pro01_access.log;
        error_log       /var/log/nginx/django_pro01_error.log;
        client_max_body_size 75M;
        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8000;
            uwsgi_read_timeout 2;
        }
        # 在nginx中要单独做访问/static/目录的路由
        location /static {  
            expires 30d;
            autoindex on;
            add_header Cache-Control private;
            alias /usr/share/nginx/django_pro01/static/;
         }
     }

    所有静态文件都应该从“/usr/share/nginx/django_pro01/static/”这个目录中(也就是上面定义的STATIC_ROOT)获取。

    运行 python manage.py collectstatic 命令的目的,是将在开发模式中定义的静态目录,统一拿到STATIC_ROOT目录下,对外提供“/static”(STATIC_URL)为访问URL:

      1.首先从Django的扩展包中,将admin管理后台的jss 和css等静态文件拷贝到配置文件中的STATIC_ROOT目录下。

      2.然后将STATICFILES_DIRS 列表中所有目录下的内容也拷贝到STATIC_ROOT目录下

    最佳实践

    最佳的配置方式是将所有的App 下面的静态文件统一放置到一个目录下面,然后将该目录设置为STATICFILES_DIRS,STATIC_ROOT则设置为另外的目录:

    # 对外提供WEB访问时的URL地址
    STATIC_URL = '/static/'
    # 开发阶段放置项目自己的静态文件,不能包含STATIC_ROOT路径
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, 'staticfiles'),
    )
    # 执行collectstatic命令后会将项目中的静态文件(包括STATICFILES_DIRS、自带admin的静态文件)收集到该目录下面来(所以不应该在该目录下面放置自己的一些静态文件,因为会覆盖掉)
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

    在开发阶段Django把/static 映射到django.contrib.staticfiles这个App,django.contrib.staticfiles自动地从STATICFILES_DIRS、STATIC_ROOT以及各个App的static子目录里面搜索静态文件。

    一旦部署到开发环境上,settings.py不需要重新编写,只要在Nginx的配置文件里面写好映射,/static将会被Nginx处理。

    django.contrib.staticfiles虽然仍然存在,但因为不会接收到以/static/开始的路径,所以将不会产生作用。不必担心Django会使处理速度变慢。

    当settings.DEBUG is False的时候,staticfiles将自动关闭。

    Django继续使用静态资源的办法 

    Django在非debug模式下,不处理静态资源文件,原因可能是性能,使用CDN比较好,但是小应用就不用了,解决办法:

    • python manage.py runserver 0:8088 --insecure
    • https://github.com/evansd/whitenoise
    • https://github.com/heroku-python/dj-static

    在django中使用静态文件

    1. 首先确保django.contrib.staticfiles在 INSTALLED_APPS中

    2. 在settings中定义 STATIC_URL   STATIC_URL = '/static/'
    3. 在你app的static目录中存放静态文件,比如:my_app/static/my_app/example.jpg.
    4. 如果有别的静态资源文件,不在app下的static目录下,可以通过 STATICFILES_DIRS来指定额外的静态文件搜索目录。
    STATICFILES_DIRS = [
                os.path.join(BASE_DIR, "static"),
                ...
            ]

        5. 在模板中使用load标签去加载静态文件,通过模板标签static和给定的相对路径来构成一个URL

      {% load static %}
      <img src="{% static "my_app/example.jpg" %}" alt="My image"/>

     当然也可以直接使用路径
      <img src="static/my_app/example.jpg" alt="My image"/>

        

    汇集静态资源到指定目录

    python manage.py collectstatic在执行时,django默认会去查看定义在STATICFILES_DIRS里的目录,以及在INSTALLED_APPS里定义了的app的static目录。如果这些目录下有文件,则把文件全部收集起来,拷贝到STATIC_ROOT目录下。当使用django的runserver时,如果请求的是一个静态文件,django也是会默认查看上述的ROOT、DIRS和static目录。但是,在部署到服务器上时,此规则就不使用了

    来源:

    http://blog.51cto.com/wenguonideshou/2089955

    参考:

    https://www.qikqiak.com/post/django-staticroot-staticfilesdirs-function/

    http://whitenoise.evans.io/en/stable/base.html

    https://blog.csdn.net/G_SANGSK/article/details/80499994

    https://zhuanlan.zhihu.com/p/31475023

  • 相关阅读:
    自动清除firefox缓存
    2013年02月24日
    java&nbsp;Class类
    Learning by doing——获黄色领骑衫之感
    2017《面向对象程序设计》课程作业八
    2017《面向对象程序设计》课程作业七
    2017《面向对象程序设计》课程作业六
    2017《面向对象程序设计》课程作业五
    2017《面向对象程序设计》课程作业四
    2017《面向对象程序设计》课程作业三
  • 原文地址:https://www.cnblogs.com/shengulong/p/10322055.html
Copyright © 2020-2023  润新知