8、第十 - WEB开发进阶 - Django URL路由分发

Django基于正则表达式的URL

  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进行字典数据获取及匹配(动态数据处理)。如下:

扫描二维码关注公众号,回复: 4647487 查看本文章

简单版:

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 

对应不一样的处理逻辑,及返回不同结果。

~~ 以上 ~~ 

猜你喜欢

转载自www.cnblogs.com/chen170615/p/9930797.html