path:path 路径转换器
这句路由:
path('media/<path:path>', serve, ...)
1. <path:path> = 路径转换器
它的作用是:
匹配任意多层的文件夹路径
2. 分成两段看
-
<path:
→ 这是 Django 自带的路径类型,专门用来匹配 包含/的完整路径(比如a/b/c/d.jpg) -
path>
→ 这是传给视图的参数名
合起来:<path:path>
意思是:
把
media/后面所有的路径,原封不动抓出来,当成变量path传给serve。
3. 举个例子你立刻懂
图片真实地址:
media/welcome/ljy.jpeg
Django 会这样匹配:
media/<path:path>
=> 把 welcome/ljy.jpeg 抓出来
=> 变成参数 path="welcome/ljy.jpeg"
4. 为什么不能用 <str>?
因为 <str> 不能匹配斜杠 /
<str:path>只能匹配:ljy<path:path>可以匹配:welcome/ljy.jpeg
所以图片、文件路径必须用 <path:path>
一句话终极总结
<path:path>
匹配 media/ 后面所有的文件路径(包括多层文件夹),并把完整路径传给后端寻找图片文件。
但我仍然建议你用官方写法(更安全)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
它内部自动帮你写好了 <path:path>,你不用自己手写。
serve Django 内置的工具函数Django 内置的工具函数
serve 就是 Django 自带的、专门用来「静态文件/图片」的视图函数,作用是:读取文件并返回给浏览器显示。
1. 它是哪里来的?
它是 Django 内置的工具函数,必须导入才能用:
from django.views.static import serve
2. 它在你的路由里做什么?
path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT})
拆解开:
- 用户访问:
/media/welcome/ljy.jpeg - Django 匹配到这条路由
<path:path>拿到:welcome/ljy.jpeg- 把这个路径 传给
serve serve去document_root(即media/文件夹)找这个文件- 找到后,把图片返回给浏览器
它 = 图片服务器
3. {'document_root': ...} 是什么?
这是传给 serve 的配置参数:
document_root
→ 从哪个文件夹里读取文件
你
超级简单总结
serve = 专门负责返回图片/文件的 Django 内置视图
你只要告诉它:
- 路径:
<path:path> - 文件夹:
document_root
它就会自动帮你返回文件。
但 99% 项目不用手动写 serve!
因为 Django 提供了更简单、更安全的官方写法:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
这一行 内部自动帮你调用了 serve,不用你自己导包、写路径。
最终一句话
serve = 读取文件并返回给浏览器的工具函数
