Django中DEBUG模式及static静态文件

一、DEBUG介绍

在settings.py中,默认值是DEBUG = True

1、当DEBUG = True时

  • 如果开启了DEBUG模式,那么以后我们修改了Django项目的代码,然后按下ctrl+s,那么Django就会自动的给我们重启项目,不需要手动重启。
  • 如果开启了DEBUG模式,那么以后Django项目中的代码出现bug了,那么在浏览器中和控制台会打印出错信息。否则的我们很难寻找到bug的位置,也不方便调试代码。
  • 在生产环境中,禁止开启DEBUG = True,因为当你的网站出错误时,别人能看到你的源代码,而我们也不需要给用户看到这些错误信息。所以需要关掉DEBUG = True,即设置DEBUG = False
    如果设置了DEBUG = False,那么就必须设置settings.py中的ALLOWED_HOSTS.

2、ALLOWED_HOSTS:这个变量是用来设置以后别人只能通过这个变量中的ip地址或者域名来进行访问。
可以设置为你的IP或域名

ALLOWED_HOSTS = [
    '.example.com',  # Allow domain and subdomains
    '.example.com.',  # Also allow FQDN and subdomains
]

也可以设置为允许所有的访问,我一般都设为*

ALLOWED_HOSTS = ['*']

二、STATICFILES_DIRS

在开发模式下(Debug=True)时,访问静态文件有下面两种情况

  • (1)可以在我们所在的project下建立相应的app, 然后每个app下都建立相应的static文件夹,文件夹名称一定要是static,Django将通过django.contrib.staticfiles在每个app的static文件夹中为我们自动查找这些静态文件。
  • (2)配置STATICFILES_DIRS,在所有的app文件外面,建立一个公共的文件夹, 因为有些静态文件不是某个app独有的,那么就可以把它放到一个公共文件夹里面,方便管理(注意,建立一个公共的静态文件的文件夹只是一种易于管理的做法,但是不是必须的,app是可以跨app应用静态文件的,因为部署模式下最后所有的静态文件都会在STATIC_ROOT里面存在) 。

STATICFILES_DIRS告诉django,首先到STATICFILES_DIRS里面寻找静态文件,其次再到各个app的static文件夹里面找(注意, django查找静态文件是惰性查找,查找到第一个,就停止查找了)。

我一般习惯于直接在项目根目录直接创建一个static文件,然后根据在里面根据项目名再创建文件夹来分类静态文件,像下面这样,比如echars是我项目的名称。这样就不用再特地到app下建static文件,不过这种方式比较适合自己写项目的时候,毕竟自己写的时候整个项目都是自己控制的,static文件放一起也清楚,如果是合作写项目的话可以放在每个app下,然后在STATICFILES_DIRS中添加路径。

# 存放静态文件的目录,其中也可以包含url,这里使用的是直接在根目录下创建的static文件夹
STATICFILES_DIRS= [
     os.path.join(BASE_DIR,'static'),
]

在这里插入图片描述

三、STATIC_ROOT

只有在部署模式下(Debug=False)时生效

1、STATIC_ROOT 是在部署静态文件时(pyhton manage.py collectstatic)所有的静态文静聚合的目录,STATIC_ROOT要写成绝对地址,如下例子STATIC_ROOT设为根目录下的static_new文件,而STATICFILES_DIRS使用根目录下的static文件。

# 存放静态文件的目录,其中也可以包含url,这里使用的是直接在根目录下创建的static文件夹
STATICFILES_DIRS= [
     os.path.join(BASE_DIR,'static'),
]
STATIC_ROOT = os.path.join(BASE_DIR, "static_new") #使用 collectstatic后收集的静态文件的存放绝对路径

同时在app中也创建一个static文件夹并创建一个静态文件测试
在这里插入图片描述
2、当部署项目时,在终端输入:

python manage.py collectstatic

在这里插入图片描述
然后可以看到根目录下有创建了一个static_new文件夹,里面有STATICFILES_DIRS里设置的文件夹里的静态文件,同时也有app下static文件夹里的静态文件。
在这里插入图片描述

3、在部署模式(Debug=False)时,Django会从STATIC_ROOT设置的文件夹读取静态文件,而不再从STATICFILES_DIRS设置的文件夹或app下的static文件夹。所以在(Debug=False)时需要先 python manage.py collectstatic同步一下静态文件。

四、STATIC_URL

1、当我们创建Django项目的时候,在setting.py中默认就已经设置了STATIC_URL = ‘/static/’,通过http://127.0.0.1/static/***就可以访问相关的静态文件了。STATIC_URL用于引用STATICFILES_DIRS或STATIC_ROOT所指向的静态文件。
在这里插入图片描述

2、在html文件中可以使用 {% static “静态文件地址” %} 这样的模板变量来引用静态文件

 <script src={% static "echarts/echarts.min.js" %}></script>
 <script src={% static "jquery-3.3.1.js" %}></script>
 <script src={% static "myjs/setcsrftoken.js" %}></script>
 <script src={% static "echarts/macarons.js" %}></script>
 <script src={% static "echarts/dark.js" %}></script>
 <script src={% static "echarts/infographic.js" %}></script>
 <script src={% static "echarts/shine.js" %}></script>
 <script src={% static "echarts/vintage.js" %}></script>
 <script src={% static "echarts/roma.js" %}></script>

{% static %}这个模板变量使用的就是STATIC_URL的值,例如默认的STATIC_URL值为’/static/’,那么上面模板变量引用后的值便为/static/开头的地址。
在这里插入图片描述
如果改为statictest,那么模板变量便为statictest。从而可以验证出{% static %}这个模板变量使用的就是STATIC_URL的值,这里只是做一个测试,默认还是使用系统自动配置的/static/

STATIC_URL = '/statictest/'

在这里插入图片描述

所以说STATIC_URL其实是一个别名,是用于引用STATICFILES_DIRS或STATIC_ROOT所指向的静态文件的,用{% static %}来引入静态文件的话,就不用每个静态文件都要绝对路径了。

3、那么STATIC_URL又是怎么能正确的找到静态文件地址的呢。

(1)、在开发模式下(Debug=True)时,使用的是STATICFILES_DIRS和app下的static中的静态文件,Django 有默认的对STATIC_URL路由能自动找到放在里面的静态文件。

(2)、在部署模式(Debug=False)时,使用的是STATIC_ROOT中的静态文件,此时则没有了默认的对STATIC_URL的路由,需要自己在project的urls.py中写一个,将STATIC_URL开头的请求转发到STATIC_ROOT中进行查找。

from django.views.static import serve
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
    re_path(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}, name='static'),
]

(3)、在部署模式(Debug=False)时,还有一种方法是使用文件服务器如nginx来实现:

location /static {
        expires 30d;
        autoindex on;
        add_header Cache-Control private;
        alias /root/myproject/static;
     }

此时我们在应用中加载静态文件的话就只需要这么来写了,需要将STATIC_URL设为/static/,以img加载为例:

<img src="/static/images/good.png" alt="My image"/>

具体的介绍和配置在之前的博客里有nginx+uwsgi+django部署,对这种方法这里就不多说了。

五、综上所述,当改为部署模式(Debug=False)时需要注意几个步骤。

平时写代码的时候还是直接使用开发模式方便排查错误,当要部署到服务器时再改成部署模式。

1、修改setting.py中的DEBUG和ALLOWED_HOSTS。

DEBUG = False
ALLOWED_HOSTS = ['*']

2、修改静态文件配置,STATIC_URL不用修改就使用默认的,而STATIC_ROOT的路径我直接使用了根目录下的static,但是STATIC_ROOT的地址不能与STATICFILES_DIRS中的地址相同的,但我平时STATICFILES_DIRS也是用的根目录下的static。。。感觉直接用一个文件夹比较方便,省得好多个文件夹乱七八糟的,所以在部署模式的时候就先注释掉STATICFILES_DIRS中有冲突的地址。大家根据自己项目的具体情况来配置就好了。

STATIC_URL = '/static/'

# 存放静态文件的目录,其中也可以包含url
STATICFILES_DIRS= [
     #os.path.join(BASE_DIR,'static'),
]

STATIC_ROOT = os.path.join(BASE_DIR, "static") #使用 collectstatic后收集的静态文件的存放绝对路径

3、project的urls.py添加静态文件路由,因为在部署模式下默认是没有给静态文件做路由的。

from django.conf import settings  
from django.views.static import serve   
urlpatterns = [
    re_path(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}, name='static'),
]

4、同步静态文件

python manage.py collectstatic
  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值