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
    【转载文章务必保留出处和署名,谢谢!】
  • 相关阅读:
    Calendar来进行一个时间段内每天的判断
    关于PreparedStatement的setDate的了解
    git学习--创建标签
    git学习--bug分支
    hibernate(1)
    JavaScript(三)---- 控制流程语句
    JavaScript(二)---- 变量、数据类型和运算符
    JavaScript(一)---- 概述
    css(四)-- 盒子模型和定位
    css(三)-- 常用属性
  • 原文地址:https://www.cnblogs.com/zhangju/p/5858698.html
Copyright © 2011-2022 走看看