只能说,在django的开发中,这是笔者遇到的挺奇妙的错误。
如果你的项目主路由urls.py
路径,只是一个空 ’ ’ 的路径,如下所示:
path('', admin.site.urls),
那么当你想要下载文件时,就会弹出这样的信息,一开始我还以为是我改动了源码,导致主路由内的其他路由,读取不到,后来反应过来了,原来是这个 admin.site.urls
, 在搞事情。
#setting.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
#设置静态文件路径为主目录下的media文件夹
MEDIA_URL = '/download/'
#url映射
我的理解是这里的路由被截断了,其他的路由相当于是被忽略了,所以当我想要下载文件时,media
路由映射就一直报错,错误一直都是这个上面的这个错误,说是找不到该下载文件的路由,也就无法映射为文件下载路径,所以迟迟无法解决下载文件的问题,按道理之前我已经解决了下载文件的问题了,只要在主路由文件内添加下载文件的路由,如下:
方法1:
# 主路由表文件 urls.py
from outsource.settings import MEDIA_URL, MEDIA_ROOT
from django.conf.urls.static import static
from django.views.static import serve
urlpatterns = [
path('test/', admin.site.urls),
re_path(r'^download/(?P<path>.*)$', serve, {'document_root': MEDIA_ROOT}, name='下载文件'), # 下载任意文件
]
要注意,如果 path 内的路由是空的,即 ' '
,那么就有问题了,默认进入的是 admin.site.urls
的路由表内,django 的路由查找是惰性查找,找到了就停止并返回,不过这里一开始就被路由截断了,直接进入了 admin.site.urls
,都不返回主路由表,重新查找路由的,所以只好配置内容给主路由,否则平时的路由查询,是没什么问题,但是要用到下载文件的功能,就会出问题,所以笔者的解决方法,就只能为主路由添加具体内容,而不是 空字符串 ' '
这里应该是有个判断逻辑,如果为空 ' '
, 就会进行 admin.site.urls
路由表查询,否则就怎么样。
之前我的代码是这样的:之后下载文件时,就会报错,第一个path的路由配置了空字符串,所以报错,后来不配置空字符串时,就没问题。
报错时的代码逻辑:
# 主路由表文件 urls.py
from outsource.settings import MEDIA_URL, MEDIA_ROOT
from django.conf.urls.static import static
from django.views.static import serve
urlpatterns = [
path('', admin.site.urls),
re_path(r'^download/(?P<path>.*)$', serve, {'document_root': MEDIA_ROOT}, name='下载文件'), # 下载任意文件
]
方法2:
# 主路由表文件 urls.py
from outsource.settings import MEDIA_URL, MEDIA_ROOT
from django.conf.urls.static import static
from django.views.static import serve
urlpatterns = [
re_path(r'^download/(?P<path>.*)$', serve, {'document_root': MEDIA_ROOT}, name='下载文件'), # 下载任意文件
path('', admin.site.urls),
]
只要在进入 admin.site.urls
之前,提前找到下载的路由,就可以防止路由截断了,将想要被找到的路由,放在 admin.site.urls
路由之前就好了。