1. Django的路由解析: 是从上往下进行匹配的
url(r'index', views.index) #这里的index 解析都可以被解析到的, abcindex index indexabc url(r'^index', views.index) #这里的index 解析是index indexabc url(r'^index/$', views.index) #这里的index 解析是精确解析 只有index 才可以被解析 例题: url(r'index/', views.index), url(r'^app1_index/', app1_views.index), url(r'^app2_index/', app2_views.index), 这里的解析是先 解析 index 后面的app1_index app2_index 都不会被解析到的
2. url 的分组模式,分为无名分组 和 有名分组两大类
url(r'^delete/(\d+)/(\d+)$', views.delete) #这里是无名分组 def delete(request, n1, n2) #可以在views 内设置 n1,n2 随便设置 请求路径: http://127.0.0.1/delete/1/2 n1 拿到的值为1 n2 拿到的值为2 url(r'^delete/(?P<id>\d+)/(?P<num>\d+)$', views.delete) #这里就是有名分组 def delete(request, id, pwd): #这里是在 一定要写id 和pwd 次序不能乱 请求路径:http://127.0.0.1/delete/1/2 id 拿到的值为 1 pwd 拿到的值为2
3. 有多个app的共存路由区分
from app1 import views as app1_views from app2 import views as app2_views #当出现app1 和app2 多个app存在时, 可以取别名来认识 as app1_views | app2_views url(r'^app1_index/', app1_views.index), url(r'^app2_index/', app2_views.index), #各自去自己的index 内拿想要的信息 ,不会冲突,因为有别名来识别 在settings.py 文件内 添加最后的信息'app1.apps.App1Config','app2.apps.App2Config', INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app.apps.AppConfig', 'app1.apps.App1Config', 'app2.apps.App2Config', ]
例题: 1.from django.conf.urls import include # 在总路由里面添加 include 2.urlpatterns = [ url(r'^app01/', include('app01.urls')), url(r'^app02/', include('app02.urls')), ] # 在总路由写include 分发出去 3. 在各自的app 创建一个 urls.py 文件 并写入以下代码 from django.conf.urls import url from app1 import views urlpatterns = [ url(r'login/', views.login, name='login'), ] #注意: http访问的时候不能直接输入http://127.0.0.1:8080/login 这样识别不了 # 一定要输入http://127.0.0.1:8080/app1/login 如果是app2内的 就要输入app2 不能直接输入login
4. 小知识路由别名与方向解析的用法
6. 路由别名是干什么用的: 主要是吧路由的名字自定义,这样路由名字修改了,前台显示的也不需要修改 1. urlpatterns = [ url(r'login/', views.login ,name='login'), ] #这里name = 'login' 这里就是定义路由别名的名字 2. <a href="{% url 'login' %}"> dianwo </a> #在模板层 输入 {% url '别名' %} 这样就是定义好了路由别名 7. 反向解析的作用可以后台映射拿到前面模板的内容信息: 注意:反向解析,解析的是路由别名,使用反向解析一定要先设置好路由别名 例题: 1. 在views 界面 添加 reverse from django.shortcuts import render, HttpResponse, redirect, reverse 2. url(r'login/',views.login,name='login'), #无参数 url(r'login/(\d+)/$',views.login,name='login'), #无名分组 url(r'login/(?P<id>\d+)/$',views.login,name='login'), #有名分组 3. {% url 'index' %} #无参数 在模板层 {% url 'index' 123 % } # 无名分组 在模板层 {% url 'index' id=446 %} # 又名分组 在模板层 4. url =reverse('login') #无参数 url = reverse('index',args=(123,)) #无名参数 url = reverse('login', kwargs={'id':446}) #有名参数 例题: def delete_flag_ready(request, id): print("可以删除") url = reverse('delete_flag_test', kwargs={'id': id}) # 反解对有名分组传参 url = reverse('delete_flag_test', args=(id, )) # 反解对无名分组传参 print('>>>', url) return redirect(url) else: # 直接返回 index print("无需删除") url = reverse('index') #注意,这里的反向解析,'index'是路由别名 return redirect(url)
5. 案例:
''' 主路由: from django.conf.urls import include urlpatterns = [ url(r'^app01/', include('app01.urls', namespace='app01')), url(r'^app02/', include('app02.urls', namespace='app02')), ] app01应用下路由 from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^test/', views.test, name='test') ] app02应用下路由 from django.conf.urls import url from app02 import views urlpatterns = [ url(r'^test/', views.test, name='test') ] 前端页面反向解析:{% url 'app01:test' %} | {% url 'app02:test' %} 视图函数reverse方法:url = reverse('app01:test') | url = reverse('app02:test') '''