Django( 学习第三部 Django的url路由层)
目录
url路由层
注意事项
url(r "^index/ ", views.index), 路径前置导航斜杠(对应的是根路径的那个),不需要写,Django会自动加上.
http://17.0.0.1:8000/index 当我们访问Django的url路径时,如果请求路径最后没有写/, 那么Django会发出一个重定向的响应,告诉浏览器, 自动加上/ 来访问.
在settings.py配置文件中修改: APPEND_SLASH =True ## 默认为True Django会自己加 当为False 时 Django就不会自动加/ .
url 路由匹配
注意事项:
- url方法,第一个参数是正则表达式,只要第一个参数能够匹配到内容,就会立刻停止向下匹配,并且直接执行对应的视图函数
- 输入url的时候会默认加斜杠,若没有加Django会做重定向,自动添加一个斜杠再次进行匹配.
- 关闭Django自动添加斜杠进行匹配 APPEND_SLASE = Fales / True 默认为True 自动添加斜杠.
- 有名分组和无名分组不可以混合使用,(有名 分组可以有多个,无名分组也可以有多个,切记俩者不可以混用)
无名分组
url(r'^text/(\d+)/',views.test) def tset(request,xx) print(xx) return HttpResponse('tset')
无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数
位置传参
有名分组
url(r'^add/(?P<a>\d+)/',views.test) def tset(request,a) print(a) return HttpResponse('tset')
有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数
关键字传参
反向解析:
通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数
#先给路由与视图函数起一个别名 url(r'*func_kk/',views.func,name='ooo') 前端解析 < a href = "{% ooo %}">111</a> 后端解析 form django.shortcuts import render,HttpResponse,redirect,reverse reverse("ooo")
无名分组的反向解析
# 无名分组对的反向解析 url (r'^index/(\d+)/',views.inde,name='ooo') 前端解析 {% url "ooo" 123 %} 后端解析 reverse( 'ooo' ,args=(1,) ) 这个数字在写代码的时候应该放什么 数字一般情况下放的是数据的主键值 数据的编辑和删除 url(r'^edit/(\d+)/',views.edit,name="ooo") def edit(request,edit_id): reverse('ooo' ,args=(edit_id,)) {% for user_obj in user_queryset %} <a href= {% url 'ooo' user_obj.id %} >编辑</a> {% endfor%}
有名分组的反向解析
# 有名分组的反向解析 url(r'^index/(?P<year>\d+)/',views.index,name='ooo') 前端解析 <a href ='{% url 'ooo' year=123 %}'>111</a> #(了解) < a href = '{% url "ooo" 123%}'>123</a> #记忆 后端解析 print(reverse("ooo" , kwargs={'yesr':123})) #(了解) print( reverse('ooo',args=(111,)))
路由分发
Django1.1版本的路由分发
主路由#主路由
from django.conf.urls import url,include from app01 import urls as app01_urls from app02 import urls as app02_urls
或者
如下 from django.contrib import admin urlpatterns = [ url(r'admin/',admin.site.urls), #方式1 url(r'app01/',include(app01-urls)), url(r'app02/',include(app02-urls)), #方式2(推荐使用) url(r'app01/',include('app01.urls')), url(r'app02/',include('app02.urls')), ]
子路由
#子路由 from django.conf.urls import url from app01 import views urlpatterns = [ url(r'add/',views.add), ]
Django2.2版本的路由分发
(对多个APP中的重名视图函数根据不同的APP进行分发,互不干扰)
主路由
from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('app01/', include("app01.urls")), path('app02/', include('app02.urls')) ]
#主路由的的re_path中不可以加$符
子路由
from django.urls import path from app01 import views urlpatterns = [ path('func/', views.func) ]
名称空间(了解)
(多个应用出现相同的别名时,研究反向解析会不会自动识别应用前缀)
正常情况下的反向解析是没有办法自动识别前缀
主路由
#主路由 from django.conf.urls import url,include urlpatterns = [ url(r'admin/',admin.site.urls), url(r'app01/',include('app01.urls',namespace='app01')), url(r'app02/',include('app02.urls',namespace='app02')), ]
子路由
#子路由 from django.conf.urls import url from app01 import views #app01 urlpatterns = [ url(r'add/',views.add,name='add'), ] #app02 urlpatterns = [ url(r'add/',views.add,name='add'), ]
视图函数中的反向解析
reverse('app01:add') reverse('app01:add')
前端中的反向解析
{% url "app01:add" %} {% url "app02:add" %}
django之间的版本区别
1.x与2.x
区别一
django 1.x中路由层使用的是url方法 url()中的第一个参数支持正则 from django.conf.urls import url urlpatterns = [ url(r'admin/', admin.site.urls), url(r'^add/',viwes.add) ] django 2.x和3.x 中使用的是path方法 path()中的第一个参数不支持正则,写什么匹配什么 from django,urls import path,re_path #导入模块,支持正则 urlpatterns = [ path('admin/',admin.site.urls), path('add/',viwes.add)
re_path(r'^add/',views.add) #支持正则 ]
区别二
path 内部默认支持五种转换器 (支持自定义转换器)
str int slug uuid path
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
path('index/<int:id>/',index) 视图函数 def index(request,id): print(id,type(id)) return HttpResponse('index')
好好学习,天天向上。