使用Django re_path后正则表达式未解析,请求解决方案
Django URL正则解析异常的解决思路
问题场景
你的URL配置代码如下:
主urls.py
from django.contrib import admin from django.urls import include, re_path, path urlpatterns = [ path('admin/', admin.site.urls), re_path(r'^', include('tutorials.urls')), ]
tutorials/urls.py
from django.urls import re_path from tutorials import views urlpatterns = [ re_path(r'^api/tutorials$', views.tutorial_list), re_path(r'^api/tutorials/(?P<pk>[0-9]+)$', views.tutorial_detail), re_path(r'^api/tutorials/published$', views.tutorial_list_published) ]
执行python manage.py runserver后访问API出现正则未解析的异常。
解决思路
修正子路由正则的末尾斜杠匹配:Django默认开启
APPEND_SLASH配置,会自动重定向带斜杠的URL。当前子路由正则是精确匹配无斜杠的路径(如^api/tutorials$),访问/api/tutorials/时会匹配失败。可以将正则改为支持可选斜杠:re_path(r'^api/tutorials/?$', views.tutorial_list), re_path(r'^api/tutorials/(?P<pk>[0-9]+)/?$', views.tutorial_detail), re_path(r'^api/tutorials/published/?$', views.tutorial_list_published)或者在
settings.py中设置APPEND_SLASH = False(不推荐,不符合RESTful URL规范)。替换主路由的正则写法:主路由中
re_path(r'^', include('tutorials.urls'))可以简化为path('', include('tutorials.urls')),path是Django推荐的精确路径匹配方式,避免正则表达式的潜在歧义。检查视图函数的正确性:异常不一定来自路由,需确认
views.tutorial_list、views.tutorial_detail等函数是否正确返回HTTP响应(比如使用JsonResponse),是否存在语法错误或逻辑异常。确认路由匹配顺序:确保更具体的路由放在前面(比如
api/tutorials/published要早于api/tutorials/(?P<pk>[0-9]+)),当前配置的顺序是正确的,但后续新增路由时需注意这一点。
内容的提问来源于stack exchange,提问作者gipcu
相关产品推荐
相关产品推荐

