路由系统和中间件系统

 路由系统

 在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这样设置


#导入include
from django.conf.urls import url,include
from django.contrib import admin
#导入app下的view函数
from CMDB import views
urlpatterns
= [
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,include
from django.contrib import admin
#导入app下的view函数
from . import views
urlpatterns
= [
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,include
from django.contrib import admin
#导入app下的view函数
from . import views
urlpatterns
= [
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,include
from django.contrib import admin
#导入app下的view函数
from . import views
urlpatterns = [
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,include
from django.contrib import admin
#导入app下的view函数
from . import views
urlpatterns
= [
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就不建议使用反射



Django 中间件 和 请求生命周期。

首先:对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端。



http://www.cnblogs.com/luotianshuai/p/5278175.html  【随后总结】












posted @ 2016-09-10 08:51  Ju-do-it  阅读(1222)  评论(0编辑  收藏  举报