路由系统和中间件系统
路由系统
在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.动态路由(传多个参数)
问:我是否可以传多个参数?
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),
但是上面的方法仅仅是通过反射来实现的,通过文件找到里面的函数然后执行!
但是在Django中不建议使用此方法。因为不同的WEB框架建议你使用不同的方式,Django就不建议使用反射
Django 中间件 和 请求生命周期。
首先:对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端。
http://www.cnblogs.com/luotianshuai/p/5278175.html 【随后总结】
个人博客:https://zhangju.lookdoc.cn
博客园:https://www.cnblogs.com/zhangju
Copyright ©2020 Ju-do-it
【转载文章务必保留出处和署名,谢谢!】