一般配置路由在urls.py文件中
urlpatterns = [
path('正则表达式',views.视图函数,参数,别名),
]
参数说明:
1、一个正则表达式字符串
2、一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
3、可选的要传递给视图函数的默认参数(字典形式)
4、一个可选的name参数(别名)
例子:
urlpatterns = [
path('index/<int:year>',views.hello),
path('addstudent/<str:name>',views.add_student),
]
- 注意
- 要捕获一段url中的值,需要使用尖括号,而不是之前的圆括号;
- 可以转换捕获到的值为指定类型,比如例子中的int:name。默认情况下,捕获到的结果保存为字符串类型,不包含/这个特殊字符;
- 规则的前面不需要添加/,因为默认情况下,每个url都带一个最前面的/。比如:articles, 不能写成 /articles。
path转换器
-
django默认情况下内置的路由转换器:
1 str 匹配任何非空的字符串,不包含/ 为django的默认转换器 path(‘index’,add/str:name,views.test)
2 int 匹配0和正整数,返回一个int类型 path(‘index’,add/int:name,views.test)
3 slug 匹配任何ascii字符以及连接符 下划线 例如:lixinyu_1-test (不常用)
4 uuid 存储通用唯一识别码 但是字母必须小写,必须使用破折号 返回uuid对象 (不常用)
5 path 匹配任何非空字符串,可以包含/ 此转换器可以匹配整个url而不是一段一段url字符串(不常用)
正则表达式路由
- 正则表达式中 使用的是re_path()
-
在python正则表达式中,命名正则表达式的语法是(?Ppattern),其中name是组的名称,pattern是需要匹配的规则
-
特点 1 year中匹配不到非四位数字,这是正则表达式决定的
2 传递给视图的所有参数都是字符串类型例
from django.urls improt path,re_path
from 项目app文件夹 import views
urlpatterns = [
path(‘add/2003/’,views.add_student),
#表示add/2003/这个路径映射views模块的add_student函数
re_path(r’^add(?P[0-9]{4})/KaTeX parse error: Expected 'EOF', got '#' at position 28: …_student), #̲表示匹配4个0-9的任意数字,…’, views.add_student),
表示匹配数字,不进行传参。
-
指定视图参数的默认值
-
使用视图参数的默认值就是给视图函数中赋值,而后传递到路由中
例
from django.urls import path
from blog import views
urlpatterns = [
path(‘admin/’, admin.site.urls),
path(‘blog/int:num/’,views.study),
path(‘blog/pageint:num/’,views.study),
]#views.py中创建
def study(request, num=1):
return HttpResponse(‘展示内容’)地址内输入
http://127.0.0.1:8000/blog/1/
http://127.0.0.1:8000/blog/page1/两个URL模式指向同一个视图views.study —— 但是第一个模式不会从URL 中捕获任何值。如果第一个模式匹配,page() 函数将使用num参数的默认值"1"。如果第二个模式匹配,page() 将使用正则表达式捕获的num 值。
错误页面处理
当Django找不到与请求匹配的URL时,或者抛出一个异常时,将调用一个错误处理视图。错误视图包括400、403、404和500,分别表示请求错误、拒绝服务、页面不存在和服务器错误
-
handler400 ——django.conf.urls.handler400 请求错误
-
handler403 ——django.conf.urls.handler403 拒绝服务
-
handler404 ——django.conf.urls.handler404 页面不存在
-
handler500 ——django.conf.urls.handler500 服务器错误
这些值可以在根URLconf中设置 在其它app中的二级URLconf中设置这些变量无效
Django中又内置的HTML模板,用域返回错误页面给用户,也可以自定义错误页面
首先在根URLconf中额外增加下面的条目
from django.conf.urls import url
from blog import views
urlpatterns = [
url(r’^blog/ ′ , v i e w s . s t u d y ) , u r l ( r ′ b l o g / p a g e ( ? P < n u m > [ 0 − 9 ] + ) / ', views.study), url(r'^blog/page(?P<num>[0-9]+)/ ′,views.study),url(r′blog/page(?P<num>[0−9]+)/’, views.study),
]
#增加的条目
handler400 = views.bad_request
handler403 = views.permission_denied
handler404 = views.page_not_found
handler500 = views.page_error在views.py中增加四个处理视图
def page_not_found(request):
return render(request, ‘404.html’)def page_error(request):
return render(request, ‘500.html’)def permission_denied(request):
return render(request, ‘403.html’)def bad_request(request):
return render(request, ‘400.html’)
而后根据需要在templates文件夹下创建404.html、403.html、400.html、500.html四个页面
urls分层模块化(路由分发)
-
通常在每个app里各自创建一个urls.py路由模块,从根路由出发,将所属url请求全部转发到想用的urls.py模块中
from django.urls import include,path
urlpatterns = [
path(‘community/’, include(‘aggregator.urls’)),
path(‘contact/’, include(‘contact.urls’))
]
路由转发使用的时include()方法,需要提前导入,参数是转发目的地路径的字符串,路径以圆点分割
例子中的正则表达式没有包含$,但是包含一个末尾的斜杠,每当Django遇到include()(来自django.conf.urls.include())时,会去掉url中匹配的部分并将剩下的字符串发送给include的URLconf做进一步处理,也就是转发二级路由。
个人观点:
路由分发就是项目本身的路由不承担过多的路由,将路由分发到子app的urls.py中,功能类似于蓝图的作用
在项目本身urls.py里导入include,本身主urls.py只负责设置子路由的路径,而后在子app设置路由参数。
主app
url_pro/urls.py
from django.contrib import admin
from django.urls import path,re_path,include
from url_app import views
urlpatterns = [
path('admin/', admin.site.urls),
path('abc/',include('url_app.urls',namespace='url_app')),
path('url_app1/', include('url_app1.urls',namespace='url_app1'))
]
子app
url_app1/urls.py
from django.urls import path,re_path
from . import views
# 子路由文件
app_name = 'url_app1'
urlpatterns = [
#path('',views.index)
#re_path(r'^$',views.index)
#re_path(r'([a-z]{3})/(\d+)/',views.index)
#path('<int:id_>/<str:name>/',views.index)
re_path(r'^$',views.index,name='index')
]
url_app/urls.py
from django.urls import path,re_path
from . import views
# 子路由文件
app_name = 'url_app'
urlpatterns = [
#path('',views.index)
#re_path(r'^$',views.index)
#re_path(r'([a-z]{3})/(\d+)/',views.index)
#path('<int:id_>/<str:name>/',views.index)
path('test/',views.test,name='test'),
path('redir/',views.redir,name='redir'),
re_path(r'index/',views.index,name='index')
]
问:URLconf匹配请求URL中的哪些部分?
答 :
请求的URL被看做是一个普通的Python字符串,URLconf在其上查找并匹配。进行匹配时将不包括GET或POST请求方式的参数以及域名。
URLconf不检查使用何种HTTP请求方法,所有请求方法POST、GET、HEAD等都将路由到同一个URL的同一个视图。在视图中,才根据具体请求方法的不同,进行不同的处理。
例如:
在http://qzone.qq.com/8436830/的请求中,URLconf将查找8436830
http://qzone.qq.com/8436830/?page=4的请求中,URLconf也将查找8436830