当⽤户在您的Web应⽤程序上发出⻚⾯请求时,Django会获取url中请求路径(端 ⼝之后的部分),然后通过urls.py⽂件查找与路径相匹配的视图,然后返回HTML 响应或404未找到的错误(如果未找到)。在urls.py中,最重要的是 “urlpatterns” 列表。这是您定义URL和视图之间映射的地⽅。映射是URL模式中的path对象,例如
一、建立到app的路由
我们创建了一个app名字就叫app,我们想向这个app分发路由请求,我们的项目朱目录有一个urls.py
,我们写入下面的代码
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# 我们用include就可以使 http://127.0.0.1:8000/app 的内容指向app的urls.py
path('app/', include('app.urls'))
]
我们在我们的app目录下创建一个urls,写入下面的代码
from django.urls import path
from app import views
urlpatterns = {
# 这样我们访问 http://127.0.0.1:8000/app/index 就会使用views中的index函数来处理
path('index/', views.index, name='index'),
}
我们写一下我们视图函数views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello Django")
我们启动这个项目,访问 http://127.0.0.1:8000/app/index/ 会得到一个我们返回的字符串"Hello Django"
到此我们基本学会了怎么简历一个路由以及返回数据
二、路径转换器
默认情况下,以下路径转换器可用:
str
- 匹配任何非空字符串,不包括路径分隔符 。如果表达式中未包含转换器,则这是默认设置。'/'
int
- 匹配零或任何正整数。返回 .int
slug
- 匹配由 ASCII 字母或数字以及连字符和下划线字符组成的任何辅助字符串。例如。building-your-1st-django-site
uuid
- 匹配格式化的 UUID。为防止多个URL映射到同一网页,必须包含短划线,字母必须小写。例如075194d3-6885-417e-a8a8-6c931e272f00
path
- 匹配任何非空字符串,包括路径分隔符 。这允许您与完整的 URL 路径进行匹配,而不是像 匹配 。'/'
str
2.1、str
urlpatterns = {
path('index/<str:name>', views.index, name='index'),
}
from django.http import HttpResponse
def index(request,name):
return HttpResponse(name)
我们访问http://127.0.0.1:8000/app/index/ok的到的结果是 ok
2.2、int
urlpatterns = {
path('index/<int:name>', views.index, name='index'),
}
我们访问http://127.0.0.1:8000/app/index/12的到结果12
2.3、slug
urlpatterns = {
path('index/<slug:name>', views.index, name='index'),
}
我们访问http://127.0.0.1:8000/app/index/django-url的到结果django-url
2.4、uuid
urlpatterns = {
path('index/<uuid:name>', views.index, name='index'),
}
我们访问http://127.0.0.1:8000/app/index/075194d3-6885-417e-a8a8-6c931e272f00的到结果075194d3-6885-417e-a8a8-6c931e272f00
这里有些许不同的就是,我们访问别的的不到结果,但是例如str中我们写int值也能的到结果
2.5、path
urlpatterns = {
path('index/<path:name>', views.index, name='index'),
}
我们访问http://127.0.0.1:8000/app/index/django/urls的到结果django/urls
三、使用正则表达式
如果我们的path已经无法满足我们对路由的需求了,我们可以使用正则表达式
下面是之前使用正则表达式重写的示例 URLconf:
from django.urls import path, re_path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
]
这完成的事情与前面的示例大致相同,除了:
- 将匹配的确切 URL 受到的约束稍多。例如,年份 10000 将不再匹配,因为年份整数被限制为正好四位数字。
- 每个捕获的参数都作为字符串发送到视图,而不管正则表达式的匹配类型如何。
四、错误处理
当 Django 找不到所请求 URL 的匹配项时,或者当引发异常时,Django 会调用错误处理视图。
用于这些情况的视图由四个变量指定。对于大多数项目来说,它们的默认值应该足够了,但是可以通过覆盖它们的默认值来进一步自定义。
可以在根 URLconf 中设置此类值。在任何其他 URLconf 中设置这些变量将不起作用。
值必须是可调用的,或者是表示应调用以处理手头的错误条件的视图的完整 Python 导入路径的字符串。