路由系统
在Django的urls中我们可以根据一个URL对应一个函数名来定义路由规则如下:
这里需要注意下:当客户访问过来请求的时候,到达路由系统后是根据正则来匹配的,如果上面的匹配成功了,
后面的路由规则将不会继续匹配,需要注意!!!!所以我们在后面都加一个$来做结尾
1、基本的URL对应。
urls中我们可以根据一个URL对应一个函数名来定义路由规则如下:
from cmdb import views urlpatterns = [ url(r‘^login/$‘, views.login), url(r‘^index/$‘, views.index), url(r‘^lists/$‘, views.lists), url(r‘^add/$‘, views.add), ]
2.基于app的路由
根据app对路由规则进行一次分类
当app的urls很多的时候,那么就不能再工程的urls下面去设置
应该这样设置:
1.首先在helloword下面的urls这样设置
#导入includefrom django.conf.urls import url,includefrom django.contrib import admin#导入app下的view函数from CMDB import viewsurlpatterns = [ url(r‘^admin/‘, admin.site.urls), #使用CMDB 的urls规则 url(r‘^CMDB/‘,include(‘CMDB/urls‘)) ]
2.在CMDB app下面创建一个urls.py
内容:
from django.conf.urls import url,includefrom django.contrib import admin#导入app下的view函数from . import viewsurlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^login/‘,views.login), url(r‘^index/‘,views.index), url(r‘^reg/‘,views.reg), url(r‘^layout/‘,views.layout), ]
3.在CMDB app下面的views里创建上面urls对应的函数
from django.shortcuts import render,HttpResponse# Create your views here.def index(request): # return HttpResponse(‘<h1>hello world!!!</h1>‘) return render(request,‘index.html‘)def login(request): return HttpResponse(‘login‘)def reg(request): return HttpResponse(‘reg‘)def layout(request): return HttpResponse(‘layout‘)
4、访问
http://127.0.0.1:8000/CMDB/admin/ admin后台管理http://127.0.0.1:8000/CMDB/layout/http://127.0.0.1:8000/CMDB/login/http://127.0.0.1:8000/CMDB/reg/http://127.0.0.1:8000/CMDB/index/
3、动态路由 (动态URL传参【一个参数】)
比如分页:当urls大量过多的时候比如几百个的时候,那么肯定不会去写几百个路由规则
所有这个时候就需要动态urls,使用正则表达式来完成。
1、获取book后面的这个值 2、运行views.book这个函数,并把获取的值自动传给 views.book 作为参数他的参数
1.在CMDB 下面的urls写入以下内容:
from django.conf.urls import url,includefrom django.contrib import admin#导入app下的view函数from . import viewsurlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^book/(\d+)$‘, views.book), //正则匹配]
2. 在CMDB 下面的views写入以下内容:
from django.shortcuts import render,HttpResponse# Create your views here.def book(request,num): print(num) return HttpResponse(num)
当用户访问http://127.0.0.1:8000/CMDB/book/数字的时候
django会在自动把参数传给views里的book函数。
3.测试访问:
http://127.0.0.1:8000/CMDB/book/2 http://127.0.0.1:8000/CMDB/book/1
4.动态路由(传多个参数)
问:我是否可以传多个参数?
可以传多个参数它是 已 / 来分割的。
1.在CMDB下面的urls写入以下内容:
from django.conf.urls import url,includefrom django.contrib import admin#导入app下的view函数from . import viewsurlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^book/(\d+)/(\d+)$‘, views.book),]
2.在CMDB下面的views写入以下内容:
def book(request,num1,num2): print(num1,num2) num = int(num1) + int(num2) return HttpResponse(num)
3.测试访问:
http://127.0.0.1:8000/CMDB/book/2/1 显示3 http://127.0.0.1:8000/CMDB/book/2/10 显示12
他的顺序是:正序的,你先给他传那个值,第一个参数就是那个
5.动态的路由(Key:value的形式)
通过正则表达式的分组来做!
url(r‘^user_list/(?P<v1>\d+)/(?P<V2>\d+)$‘, views.user_list),
这里?p<v1>这里的 v1就是key,vlaue就是传进去的值,
def user_list(request,v2,v1): print v2 , v1 return HttpResponse(v1+v2)
这样我们就不必按照顺序去取了,可以通过key,value的方式来取传进来的值
1.在CMDB下面的urls写入以下内容:
from django.conf.urls import url,includefrom django.contrib import admin#导入app下的view函数from . import viewsurlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^book/(?P<k1>\d+)/(?P<k2>\d+)$‘, views.book), 这里 ?p<v1> 这里的v1就是key,vlaue就是传进去的值,]
2.在CMDB下面的views写入以下内容:
from django.shortcuts import render,HttpResponse# Create your views here.def book(request,k1,k2): print(k1,k2) return HttpResponse(k1+k2)
6、URL中专(分级匹配)
在实际的生产环境中有这么一种情况:在一个project下面有很多APP,那么我们的路由规则只能写在一个文件里吗?
当然不是,我们可以通过下面的方式来把他分开:
url(r‘^app01/‘, include("app01.urls")),
然后在app01内创建一个文件urls,不要忘记注册app。然后在访问app01里的url的时候通过:hostip:port/app01/index or hostip:port/app01/login
7、基于反射实现动态路由设计
有很多的WEB框架,他和Django不太一样。比如 mvc 他会将所有的URL做成一个分类的形式。
在Django中咱们一般是一个url对应一个函数。
但是在其他的WEB框架中他们也把url也进行用正则处理了。比如下面:
url(r‘^(?P<controller>\w+)/(?P<action>\w+)‘, mp),
# 咱们给他做个定义mp中第一个是文件比如
# home.py 第二个参数是文件中的函数 def index # #/home/index/ #/login/index/ #/update/index/
但是上面的方法仅仅是通过反射来实现的,通过文件找到里面的函数然后执行!
但是在Django中不建议使用此方法。因为不同的WEB框架建议你使用不同的方式,Django就不建议使用反射
来源: http://www.cnblogs.com/luotianshuai/p/5278175.html
Django 中间件 和 请求生命周期。
首先:对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端。
http://www.cnblogs.com/luotianshuai/p/5278175.html 【随后总结】