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',]
from django.urls import re_pathfrom django.views import staticfrom django.conf import settingsurlpatterns = [... ,re_path(r"^static/(?P<path>.*)$",static.serve,{'document_root':settings.STATIC_ROOT},name='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的原因。
未经允许,不得转载!

浙公网安备 33010602011771号