Django的路由模式,主要是定义前端的URL访问模式。简单归纳有以下几种方式:
- 1、FBV结构:path(r'index/',views.index); CBV结构:path(r'home',views.Home.as_view()),
- 2、字符串拼接:path(r'detail-(\d+).html',views.detail)) 严格按照传参的顺序进行。
- 3、指定参数传输:url('^detail-(?P<nid>\d+)-(?P<uid>\d+).html',views.detail) 推荐使用这种方法,在后续进行逻辑处理的时候,即使顺序排错,也不影响逻辑方法的处理计算。
- 4、urls.py配置中路由分发对name的使用:对URL关系进行命名,以后可以根据此名称生成自己想要的URL。 如:
url(r'ffafafff/',views.index,name='i1');
url(r'yun/(\d+)/(\d+)/',views.index,name='i2');
url(r'buy/(?P<nid>\d+)/(?P<uid>\d+)/',views.index,name='i3'); - 5、创建项目,在构建多APP时,进行的URL分发:
第一种类型是参考前面的举例。第二种开始进行介绍:
1、举例:首先要知道,字典数据后是如何进行的跳转到详情页(模板语言中封装a标签),过程如下:
urls.py 文件设置:
from django.contrib import admin from django.urls import path from docker import views urlpatterns = [ path('admin/', admin.site.urls), path(r'index/',views.index), path(r'index/home.html', views.detail),#根据跳转的URL进行的页面 ]
views.py 逻辑处理定义:
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View user_dict = { 1:{'k1':'v1'}, 2:{'k2':'v2'}, 3:{'k3':'v3'}, 4:{'k4':'v4'}, } def index(request): return render(request,'2.html',{'user_dict':user_dict}) def detail(request): return render(request,'home.html')
模板语言定义 2.html :
<body> <ul> {% for row in user_dict.values %} <li><a href="home.html">{{ row }}</a></li> 封装跳转的URL {% endfor %} </ul> </body>
定义被跳转的页面:
<body> <p> Welcome To Docker !!! </p> </body>
效果如下:(点击蓝色字体,进行跳转到home.html页面)
2、举例:通过问号“?”的URL进行字典数据获取及匹配(动态数据处理)。如下:
简单版:
urls.py 文件:
from django.contrib import admin from django.urls import path from docker import views urlpatterns = [ path('admin/', admin.site.urls), path(r'index/',views.index), path(r'detail/',views.detail), ]
views.py逻辑处理:
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View #定义字典 user_dict = { 'root1':{'name':'k1','email':'[email protected]','number':'123'}, 'root2':{'name':'k2','email':'[email protected]','number':'124'}, 'root3':{'name':'k3','email':'[email protected]','number':'125'}, 'root4':{'name':'k4','email':'[email protected]','number':'126'}, } #访问主页放回数据展示 def index(request): return render(request,'2.html',{'user_dict':user_dict}) #跳转详情页的数据,根据获取到nid的数据并返回nid展示 def detail(request): nid = request.GET.get('nid') return HttpResponse(nid)
模板语言定义:2.html
<body> <ul> {% for k,row in user_dict.items %} <li><a target="_blank" href="/detail/?nid={{k}}">{{ row.name }}</a></li> 获取用户名数据 {% endfor %} </ul> </body>
效果如下:(可根据nid=root4进行更改,可获取不同的数据)
http://127.0.0.1:8000/detail/?nid=root4
知识扩展:
变更一下,处理的方法,调整跳转的详情页:
urls.py、2.html 文件不变,就逻辑处理的文件 views.py 如下:
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View user_dict = { 'root1':{'name':'k1','email':'[email protected]','number':'123'}, 'root2':{'name':'k2','email':'[email protected]','number':'124'}, 'root3':{'name':'k3','email':'[email protected]','number':'125'}, 'root4':{'name':'k4','email':'[email protected]','number':'126'}, } def index(request): return render(request,'2.html',{'user_dict':user_dict}) def detail(request): nid = request.GET.get('nid') detail_info = user_dict[nid] return render(request,'home.html',{'detail_info':detail_info})
定义详情页的home.html 文件,如下:
<body> <h1>详情页面</h1> <h3>用户名:{{detail_info.name}}</h3> <h3>邮箱:{{ detail_info.email }}</h3> </body>
效果如下:
3、举例:动态数据处理,跟进正则表达式。生成静态页面返回,(市场上比较常用)。如下:
正则表达式 (或 regexes ) 是通用的文本模式匹配的方法。 Django URLconfs 允许你 使用任意的正则表达式来做强有力的URL映射,不过通常你实际上可能只需要使用很少的一 部分功能。
文件配置,如下:
urls.py 路由分发配置:
Django 1版本与2版本,是有比较大的区。所以,在配置正则表达式的时候,可参考官网:https://docs.djangoproject.com/en/2.0/intro/tutorial03/
from django.contrib import admin from django.urls import path from docker import views from django.conf.urls import url #导入url库表 urlpatterns = [ path('admin/', admin.site.urls), path(r'index/',views.index), url(r'^detail-(?P<nid>\d+).html',views.detail), #采用url的路径分发方式,进行匹配。nid采用正则分组,进行数据传参。 ]
views.py 逻辑处理脚本:
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View user_dict = { '1':{'name':'k1','email':'[email protected]','number':'123'}, '2':{'name':'k2','email':'[email protected]','number':'124'}, '3':{'name':'k3','email':'[email protected]','number':'125'}, '4':{'name':'k4','email':'[email protected]','number':'126'}, } def index(request): return render(request,'2.html',{'user_dict':user_dict}) def detail(request,nid): detail_info = user_dict[nid] return render(request,'home.html',{'detail_info':detail_info})
模板语言定义2.html:
<body> <ul> {% for k,row in user_dict.items %} <li><a target="_blank" href="detail-{{ k }}.html">{{ row.name }}</a></li> {% endfor %} </ul> </body>
跳转返回的详情页 home.html:
<body> <h1>详情页面</h1> <h3>用户名:{{detail_info.name}}</h3> <h3>邮箱:{{ detail_info.email }}</h3> </body>
效果(通过更改nid的信息,可以得出不同的账号信息。)如下:
http://127.0.0.1:8000/detail-1.html
知识扩展:
当路由分发处理多个,正则分组的数据时, 可根据前端浏览器的get请求,进行数据nid\uid处理。如下:
urls.py 路由分发设置,nid 及uid 的传输获取:
from django.contrib import admin from django.urls import path from docker import views from django.conf.urls import url #导入url库 urlpatterns = [ path('admin/', admin.site.urls), path(r'index/',views.index), url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html',views.detail), #设定好nid\uid 的正则分组 ]
views.py 逻辑处理:
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View user_dict = { '1':{'name':'k1','email':'[email protected]','number':'123'}, '2':{'name':'k2','email':'[email protected]','number':'124'}, '3':{'name':'k3','email':'[email protected]','number':'125'}, '4':{'name':'k4','email':'[email protected]','number':'126'}, } def index(request): return render(request,'2.html',{'user_dict':user_dict}) def detail(request,nid,uid): print (nid,uid) #测试,获取到的nid,uid detail_info = user_dict[nid] return render(request,'home.html',{'detail_info':detail_info}) #进行模板语言数据展示
home.html 模板语言定义:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>详情页面</h1> <h3>用户名:{{detail_info.name}}</h3> <h3>邮箱:{{ detail_info.email }}</h3> </body> </html>
效果:当使用get进行页面访问的时候,http://127.0.0.1:8000/detail-2-9.html,可获取静态详情页。
获取到对应的nid,uid
后续:当传输的不止是,nid、uid 两个数值,而是多参数正则分组时。又该如何去获取传输的值?
对应关系,如下:
第一种对应关系: url 路由配置 url(r'^detail-(\d+)-(\d+).html',views.detail) views 函数处理方式有三种: def func(request,nid,uid): pass def func(request,*args): args = (2,9) def func(request,*args,**kwargs) args = (2,9) 第二种对应关系: url 路由配置 url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html',views.detail) views 函数处理方式有三种: def func(request,nid,uid): pass def func(request,**kwargs): kwargs = ('nid':2,'uid'=9) def func(request,*args,**kwargs) args = (2,9)
4、举例:路由分发 name 的使用 --- 对URL关系进行命名,以后可以根据此名称生成自己想要的URL。
urls.py的配置文件如下:
格式:
- 案例1:url(r'ffafafff/',views.index,name='i1');
- 案例2:url(r'yun/(\d+)/(\d+)/',views.index,name='i2');
- 案例3:url(r'buy/(?P<nid>\d+)/(?P<uid>\d+)/',views.index,name='i3');
案例:
from django.contrib import admin from django.urls import path from docker import views from django.conf.urls import url urlpatterns = [ path('admin/', admin.site.urls), path(r'ffafafff/',views.index,name='i1'), ]
views.py 的配置如下:
格式:
def fun(request,*args,**kwargs): from django.urls import reverse 案例1:url1 = reverse('i1') 案例2:url2 = reverse('i2',args=(1,2)) 案例3:url3 = reverse('i3',kwargs=("pid":2,"uid":9))
举例:
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View def index(request,*args,**kwargs): from django.urls import reverse url1 = reverse('i1') #返回URL的 print(request.path_info) #获取的的啊 return render(request,'login_1.html') #获取到的网站信息
login_1.html 模板语言的格式:
案例1:<form action="{% url "i1" %} " method="post" > #定义的URL后缀:ffafafff/
案例2:<form action="{% url "i2" 1 2 %} " method="post" > #定义的URL后缀:you/1/2
案例3:<form action="{% url "i2" pid=2 uid=9 %} " method="post" > #定义的URL后缀:buy/2/9
举例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="{% url "i1" %} " method="post" > <P> <a><input type="text" name="user" placeholder="用户名"></a> </P> <p> <a><input type="password" name="pwd" placeholder="密码"></a> </p> <p> <input type='submit' value="确认提交"/> </p> </form> </body> </html>
5、 一个Django工程,包括多个APP项目,如何做到每个自己的APP来处理自己的逻辑?
进到django项目的路径下,创建app应用。执行命令:python3.5 manage.py startapp cmdb
对于多个APP应用的 urls.py 配置 如下:
django_2.urls.py:使用include的方式进行包裹,对应到不同的APP的路由。
from django.contrib import admin from django.urls import path from django.conf.urls import url,include urlpatterns = [ path('admin/', admin.site.urls), path(r'docker/', include("docker.urls")), path(r'cmdb/', include("cmdb.urls")), ]
docker APP项目配置如下:
docker.urls.py :对应的APP项目,有自己本身的URL及处理逻辑方法
from django.contrib import admin from django.urls import path from docker import views from django.conf.urls import url,include urlpatterns = [ path(r'login', views.login), ]
docker.views.py : 包含处理的逻辑, 这里简单设置为HttpResponse返回字符。
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View def login(request): return HttpResponse("docker")
cmdb APP项目配置如下:
cmdb.urls.py :对应的APP项目,有自己本身的URL及处理逻辑方法
from django.contrib import admin from django.urls import path from django.conf.urls import url,include from cmdb.views import login urlpatterns = [ path(r'login', login), ]
cmdb.views.py : 包含处理的逻辑, 这里简单设置为HttpResponse返回字符
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View def login(request): return HttpResponse("cmdb")
测试访问:
http://127.0.0.1:8000/docker/login 返回 docker
http://127.0.0.1:8000/cmdb/login 返回 cmdb
对应不一样的处理逻辑,及返回不同结果。
~~ 以上 ~~