在学习使用DRF框架的时候,学到了使用router自动生成视图集的url部分,遇到了一个很奇怪的事情,我的生成url是这样写的:
urlpatterns = []
from rest_framework.routers import SimpleRouter, DefaultRouter
# 创建路由对象
router = SimpleRouter()
# 注册视图集
router.register("", IndexViewSet, basename="index")
router.register("lists", UserinfoModelViewSet, basename="lists")
urlpatterns += router.urls
# 输出结果
for i in urlpatterns:
print(i)
如此输出的url是下面这样的,但是当我直接访问127.0.0.1:8000/lists/也就是倒数第二个时,访问出现404,我很不解
<URLPattern '' [name='homePage']>
<URLPattern '^$' [name='index-list']>
<URLPattern '^charts/$' [name='index-charts']>
<URLPattern '^table_list/$' [name='index-table-list']>
<URLPattern '^(?P<pk>[^/.]+)/$' [name='index-detail']>
<URLPattern '^lists/$' [name='lists-list']>
<URLPattern '^lists/(?P<pk>[^/.]+)/$' [name='lists-detail']>
排除视图名字写错,方法写错,url写错之后,我开始关注了router的自动生成方面。
由于我一开始使用的前缀为空,所以我觉得可能是他的问题,当我调整了
router.register("lists", UserinfoModelViewSet, basename="lists")
router.register("index", IndexViewSet, basename="index")
确实没有问题了,大功告成!!但是我不理解,此次生成的url是
<URLPattern '' [name='homePage']>
<URLPattern '^lists/$' [name='lists-list']>
<URLPattern '^lists/(?P<pk>[^/.]+)/$' [name='lists-detail']>
<URLPattern '^index/$' [name='index-list']>
<URLPattern '^index/charts/$' [name='index-charts']>
<URLPattern '^index/table_list/$' [name='index-table-list']>
<URLPattern '^index/(?P<pk>[^/.]+)/$' [name='index-detail']>
加了前缀罢了。
我继续尝试,更换了register的顺序,
router.register("lists", UserinfoModelViewSet, basename="lists")
router.register("", IndexViewSet, basename="index")
让lists在前,空前缀在后,生成的url为
<URLPattern '' [name='homePage']>
<URLPattern '^lists/$' [name='lists-list']>
<URLPattern '^lists/(?P<pk>[^/.]+)/$' [name='lists-detail']>
<URLPattern '^$' [name='index-list']>
<URLPattern '^charts/$' [name='index-charts']>
<URLPattern '^table_list/$' [name='index-table-list']>
<URLPattern '^(?P<pk>[^/.]+)/$' [name='index-detail']>
再次访问127.0.0.1:8000/lists,这次成功了,我诧异这个结果,终于确定是url顺序的问题。通过控制变量法分别删减可能出错的’^
′
和
′
(
?
P
<
p
k
>
[
/
.
]
+
)
/
'和'^(?P<pk>[^/.]+)/
′和′(?P<pk>[/.]+)/’,我确定是后者出现了问题。由于我对正则遗忘的厉害,去查阅资料后发现,应该是?P< pk >命名的组识别了lists,导致查询不到。
url从上到下查找的顺序让django先识别了?P< pk >,然后就没有真正访问到lists,导致访问出错。
初学,我也不确定,欢迎指出错误。。