多级url虽然可以在多个app的时候将各个应用进行归类。现在有这么一种情况,就是app01里面的views.py里面定义了大量的函数。这样的话我们势必要在app01的urls.py里也要根据函数的数量编辑绑定信息。一个函数一条绑定的信息的对应写下去。为了避免这种可怕的事情,我们就需要使用动态url来处理这种请求。所谓的动态url就是可以通过正则表达式匹配用户输入的url内容,将url当做参数传递给后端的python函数进行处理。

    首先我们在app01应用的views.py文件里新建一个函数dynamic_url()用于将接接收到的url内容进行拼接

/app01/views.py

from django.shortcuts import render
from django.shortcuts import HttpResponse
# Create your views here.

def dynamic_url(request,arg1,arg2):
    return HttpResponse(arg1+arg2)

 

修改mydjango目录下的urls.py,用正则表达式编辑匹配app01这个以后的匹配规则

/mydjango/urls.py

#!/usr/bin/env python
# coding:utf-8
from django.conf.urls import url,include
from django.contrib import admin
#记得导入app01
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^app01/', include('app01.urls')),
    url(r'^app02/', include('app02.urls')),
    #括号里的内容就是传给dynamic_url的参数,这里表示匹配两个任意数字,并把数字传给函数
    url(r'^dynamic_url/(\d+)/(\d+)$', views.dynamic_url),
    #匹配所有url的规则一定要放在最后
    url(r'^', include('app01.urls')),
]

 wKioL1bmbi-yIpBqAADf2rpGAHE797.png   

注意括号里的内容是以按先后顺序传递给python函数的

下面我们测试一下效果

wKioL1bmb0KiSg-rAABckW8FxLU752.png

如上图所致。我们url里面最后的两个数被以参数的形式传入了函数并打印到页面上了。



如果我们对参数传递的顺序有特殊的要求,以往以字典的形式匹配的内容具体对应某个参数我们可以在urls.py文件里匹配url的时候使用?P<arg>关键字来实现,下面我们只修改urls.py就可以了


/mydjango/urls.py

#!/usr/bin/env python
# coding:utf-8
from django.conf.urls import url,include
from django.contrib import admin
#记得导入app01
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^app01/', include('app01.urls')),
    url(r'^app02/', include('app02.urls')),
    # url(r'^dynamic_url/(\d+)/(\d+)$', views.dynamic_url),
    #指定第一个变量传递给函数的arg2参数,第二个变量传递给arg1参数
    url(r'^dynamic_url/(?P<arg2>\d+)/(?P<arg1>\d+)$', views.dynamic_url),
    #匹配所有url的规则一定要放在最后
    url(r'^', include('app01.urls')),
]

wKiom1bmcDyCvrboAAD_bnE8BNs929.png

再次刷新刚才的url

wKioL1bmcSXwo-_cAABdn4ewPDU300.png


在url必变的情况,参数传递的顺序已经改变了。这就是动态url。