Django关闭DEBUG后的静态文件处理(与中文网址的编码无关系)

Django关闭DEBUG后的静态文件处理(与中文网址的编码无关系)

Django 关闭DEBUG后发现一些网址带中文的会访问不出来,一开始认为网址的编码有问题,就比如如下:

/static/img/%E9%99%88%E7%B2%92-%E5%85%89-%E5%A6%82%E4%B9%9F.jpg

但将DEBUG打开后又可以访问出来文件,就认为开了DEBUG后Django会自动帮我解码,所以一开始就只折腾着将编码问题解决。

但无果,所以就去搜索Django的DEBUG开关的影响,又去官方文档及源码查看

发现了一堆关于静态文件访问不了东西,就将信将疑的加了上去

 

settings.py

 

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'static/')
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
 
 
urls.py
from django.urls import re_path
from django.views import static
from django.conf import settings
urlpatterns = [
  ... ,
  re_path(r"^static/(?P<path>.*)$",static.serve,{'document_root':settings.STATIC_ROOT},name='static'),
]
 
 
 
更改了后发现仍然访问不了static文件,所以就继续去官方文档中寻找,又去源代码中看了看

会发现 django.contrib.staticfiles.finders 来寻找static文件的

当我在finders 中的 AppDirectoriesFinder 打下断点,并设下print("*"*50) 打开与关闭DEBUG 测试 ,发现断点并未起效(还不知道原因)

但是当打开DEBUG时会打印出内容,关闭就不会,说明DEBUG运行时会执行这里的代码,那应该就没有问题,我们下一步就需要寻找到是什么来调用的这个方法

查找Django官方文档:

https://docs.djangoproject.com/zh-hans/4.0/howto/static-files/

测试

运行使用真实 HTTP 请求(而不是内置的测试客户端,即内置的 LiveServerTestCase)的测试用例时,静态资源要与剩余内容分别提供服务,这样,测试环境才能尽量重现真实的问题。但 LiveServerTestCase 只拥有非常基本的为静态文件提供服务的能力:它并不知道 staticfiles 应用的查找功能,且总是假设静态内容已被收集至 STATIC_ROOT 目录下。

因此, staticfiles 自带了 django.contrib.staticfiles.testing.StaticLiveServerTestCase,这是一个内置子类,能够透明地以类似我们在开发阶段 DEBUG True 时获得的方式为所有静态资源在测试期间提供服务。即无需先用 collectstatic 收集它们。

通过对官方文档以及百度的搜索,发现 “collectstatic” 这个功能,

当我将 python3 manage.py collectstatic 输入发现之前动态加载的中文静态文件可以访问了,所以不是因为中文名的编码问题,而是因为动态加载的问题,在DEBUG=False时,Django不会自动将我们把静态文件收集起来,原因如下:

  • 大多数较大的 Django 站点使用单独的 Web 服务器——即不运行 Django 的服务器——来提供静态文件。该服务器通常运行不同类型的 Web 服务器——速度更快但功能较少。
  • 不安全,它没有经过任何类型的安全审计,不是为生产而设计的,所以为什么当你将 python3 manage. py runserver --insecure 可以强制Django处理静态文件,但英文单词是不安全。

可查看官方文档了解生产中静态文件的部署:https://docs.djangoproject.com/zh-hans/4.0/howto/static-files/deployment/

所以在动态更改static文件时,就需要加上d或输入 os.system("python3 manage.py collectstatic --noinput") 去进行static文件的收集

 

所以,综上,如果动态更改了static文件,DEBUG=FALSE时需要进行指令收集才能访问到更改后的static文件,同时需要更改 settings.py 与 urls.py 这两个文件这就是为什么有时候修改js/css文件保存后,但仍然没用,是因为没有收集static的原因。

 

未经允许,不得转载!

posted @ 2022-02-10 00:14  Tanch  阅读(146)  评论(0)    收藏  举报