报错显示:
根urls.py
from django.contrib import admin
from django.urls import path, include
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('admin/', admin.site.urls),
path('login/',obtain_jwt_token),
path(r"^",include("blog.urls")),
]
子应用blog下的urls.py
from django.urls import re_path
from blog_my.apps.blog import views
urlpatterns = [
re_path(r"test/$",views.TestView.as_view(),name="test"),
]
问题原因:
好吧,是我大意了,以前没有怎么注意这几个函数的区别
url(route, view, kwargs=None, name=None)
path(route, view, kwargs=None, name=None)
re_path(route, view, kwargs=None, name=None)
注意
- url是Django 1.x中的写法,在Django2.1中,开始舍弃Django1.x中的url写法,它可以在路径中使用正则。
- path是2.x默认使用的,但是不可以使用正则!不可以使用正则!
- re_path,可以使用正则。
所以,我在根urls.py中的path中使用了正则,因此无法匹配到子路由路径,把正则^去掉就可以了。
补充
既然path不可以使用正则,它也提供了类似正则的路径转换器,以补充通过正则获取参数的缺陷
str:匹配任何非空字符串,但不含斜杠/,如果你没有专门指定转换器,那么这个是默认使用的;
int:匹配0和正整数,返回一个int类型
slug:可理解为注释。该转换器匹配任何ASCII字符以及连接符和下划线,比如’ building-your-1st-django-site‘;
uuid:匹配一个uuid格式的对象。为了防止冲突,规定必须使用破折号,所有字母必须小写,例如’075194d3-6885-417e-a8a8-6c931e272f00‘ 。返回一个UUID对象;
path:匹配任何非空字符串,重点是可以包含路径分隔符’/‘。这个转换器可以帮助你匹配整个url而不是一段一段的url字符串。
实例
urlpatterns = [
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]