zoukankan      html  css  js  c++  java
  • 路由系统和中间件系统

     路由系统

     在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  【随后总结】












    GitHub:https://github.com/ju-do-it
    个人博客:https://zhangju.lookdoc.cn
    博客园:https://www.cnblogs.com/zhangju
    Copyright ©2020 Ju-do-it
    【转载文章务必保留出处和署名,谢谢!】
  • 相关阅读:
    English,The Da Vinci Code, Chapter 23
    python,meatobject
    English,The Da Vinci Code, Chapter 22
    English,The Da Vinci Code, Chapter 21
    English,The Da Vinci Code, Chapter 20
    English,The Da Vinci Code, Chapter 19
    python,xml,ELement Tree
    English,The Da Vinci Code, Chapter 18
    English,The Da Vinci Code, Chapter 17
    English,The Da Vinci Code, Chapter 16
  • 原文地址:https://www.cnblogs.com/zhangju/p/5858698.html
Copyright © 2011-2022 走看看