精华内容
下载资源
问答
  • ThinkPHP路由机制简介

    2020-10-22 16:02:33
    主要介绍了ThinkPHP路由机制,结合实例形式简单分析了ThinkPHP路由机制的原理与相关使用技巧,需要的朋友可以参考下
  • MVC路由机制

    2013-12-12 08:39:40
    MVC路由机制
  • 主要介绍了Zend Framework框架路由机制,结合代码分析了Zend Framework路由机制所涉及的控制器,路由器原理与相关代码实现技巧,需要的朋友可以参考下
  • Dubbo路由机制概述

    万次阅读 2018-06-28 20:20:23
    上一节我们主要讲解了利用dubbo-admin如何进行参数的动态修改,本节将重点介绍集群实现中另外一个实现细节:路由机制,Dubbo的路由机制主要解决的目的就是服务调用时,从已知的所有服务提供者中根据路由规则刷选服务...

       上一节我们主要讲解了利用dubbo-admin如何进行参数的动态修改,本节将重点介绍集群实现中另外一个实现细节:路由机制,Dubbo的路由机制主要解决的目的就是服务调用时,从已知的所有服务提供者中根据路由规则刷选服务提供者。

    1、Dubbo路由机制概述

       以下内容来源于官方文档:
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
       以上是Dubbo 路由机制的基本知识,接下来从源码的角度分析一下其实现原理。

    2、Router相关类图:
    这里写图片描述

    1. Router:dubbo路由接口类
      ● URL getUrl() :获取路由配置URL。
      ● < T> List< Invoker< T>> route(List< Invoker< T>> invokers, URL url, Invocation invocation) :根据路由规则返回符合规则的服务调用者。
    2. ConditionRouter:条件路由规则。
    3. ScriptRouter:脚本路由规则(JavaScript)。

    2.1 如何添加路由规则

       可以通过dubbo-admin管理后台,动态添加路由规则,其界面如图所示:
    这里写图片描述
       点击保存后,使用URL描述一条路由规则,并将存储在注册中心${service}/routers目录下,然后通知相关订阅者(服务消费者【调用方】)。
       具体调用的方法为RegistryDirecotry#notify方法,其片段如下:

    // routers
    if (routerUrls != null && !routerUrls.isEmpty()) {  // @1
         List<Router> routers = toRouters(routerUrls);     // @2
         if (routers != null) { // null - do nothing           
              setRouters(routers);                                        // @3
          }
    }
    

       代码@1:如果routerUrls 不为空,说明注册中心的catalog=routers目录下新增或删除了某些路由规则,最后存在路由规则。
       代码@2:将路由规则URL转换为路由实现类Router接口的实现类,例如条件路由规则、脚本路由规则具体实现类。
       代码@3:将现存的路由规则实现类覆盖RegistroyDirectory#routers属性,在下一次服务调用时,这些路由规则将生效。

       我们见到看一下toRouter方法的实现:

       RegistryDirectory#toRouters

    private List<Router> toRouters(List<URL> urls) {
            List<Router> routers = new ArrayList<Router>();
            if (urls == null || urls.isEmpty()) {
                return routers;
            }
            if (urls != null && !urls.isEmpty()) {
                for (URL url : urls) {
                    if (Constants.EMPTY_PROTOCOL.equals(url.getProtocol())) {
                        continue;
                    }
                    String routerType = url.getParameter(Constants.ROUTER_KEY);
                    if (routerType != null && routerType.length() > 0) {
                        url = url.setProtocol(routerType);
                    }
                    try {
                        Router router = routerFactory.getRouter(url);
                        if (!routers.contains(router))
                            routers.add(router);
                    } catch (Throwable t) {
                        logger.error("convert router url to router error, url: " + url, t);
                    }
                }
            }
            return routers;
        }
    

       方法实现比较简单,就是基于协议头condition://或script://构建具体的路由规则实现类。
       从上面两个方法可以看出,当主从中心的路由配置发生变化后,会重新构建RegistryDirectory的List< Router> routers属性,那这个属性在什么时候用呢?

       AbstractDirectory#list

    public List<Invoker<T>> list(Invocation invocation) throws RpcException {
            if (destroyed) {
                throw new RpcException("Directory already destroyed .url: " + getUrl());
            }
            List<Invoker<T>> invokers = doList(invocation);
            List<Router> localRouters = this.routers; // local reference
            if (localRouters != null && !localRouters.isEmpty()) {
                for (Router router : localRouters) {
                    try {
                        if (router.getUrl() == null || router.getUrl().getParameter(Constants.RUNTIME_KEY, false)) {
                            invokers = router.route(invokers, getConsumerUrl(), invocation);
                        }
                    } catch (Throwable t) {
                        logger.error("Failed to execute router: " + getUrl() + ", cause: " + t.getMessage(), t);
                    }
                }
            }
            return invokers;
        }
    

       在通过RegistryDirector时,获取List< Invoker>时,会对所有的Invoker列表进行路由过滤,然后返回符合路由规则的Invoker,本文就不相信分析Dubbo是如何根据配置的条件路由规则、脚本路由规则去过滤,其实现细节,如有兴趣,可关注:ConditionRouter、ScriptRouter。


    欢迎加笔者微信号(dingwpmz),加群探讨,笔者优质专栏目录:
    1、源码分析RocketMQ专栏(40篇+)
    2、源码分析Sentinel专栏(12篇+)
    3、源码分析Dubbo专栏(28篇+)
    4、源码分析Mybatis专栏
    5、源码分析Netty专栏(18篇+)
    6、源码分析JUC专栏
    7、源码分析Elasticjob专栏
    8、Elasticsearch专栏(20篇+)
    9、源码分析MyCat专栏

    展开全文
  • AngularJs路由机制

    千次阅读 2016-01-31 17:03:31
    最近项目要用到Angularjs路由机制,所以打算学一学,了解一下路由机制
     
    

    概述

    最近项目要用到Angularjs路由机制,所以打算学一学,了解一下路由机制。在谈路由机制前有必要先提一下现在比较流行的单页面应用,就是所谓的single page APP(SPA)。单页面应用(SPA)是旨在对Web应用发动革命的软件运动中可信度很高的一种。此类应用有望进行更加模块化的开发,令应用更加容易地适配与多个设备,并拥有更好的应用生命周期管理—这些几乎是软件架构师希望的全部。

    路由机制

    为了实现无刷新的视图切换,我们通常会用ajax请求从后台取数据,然后套上HTML模板渲染在页面上,然而ajax的一个致命缺点就是导致浏览器后退按钮失效,尽管我们可以在页面上放一个大大的返回按钮,让用户点击返回来导航,但总是无法避免用户习惯性的点后退。解决此问题的一个方法是使用 hash,监听hashchange事件来进行视图切换,另一个方法是用HTML5的history API,通过pushState()记录操作历史,监听popstate事件来进行视图切换,也有人把这叫pjax技术。基本流程如下:


    如此一来,便形成了通过地址栏进行导航的深度链接( deeplinking  ),也就是我们所需要的路由机制。通过路由机制,一个单页应用的各个视图就可以很好的组织起来了。

    简单应用

    我们打算创建一个简单的应用,涉及主页,关于和联系我们页面。虽然Angular是为创建比这更复杂的应用而生的,但是本教程展示了许多我们在大型项目中需要的概念。

    目标

    • 单页应用

    • 无刷新式页面变化

    • 每个页面包含不同数据

    虽然使用Javascript和Ajax可以实现上述功能,但是在我们的应用中,Angular可以使我们处理更容易。

    层次结构

    • view 用来存放HTML静态页面

    • JS- controllers 自己定义JS

    • components 里面用来存放公用J是

    • css 存放css样式


    ngRoute包括的内容

    ng的路由机制是靠ngRoute提供的,通过hash和history两种方式实现了路由,可以检测浏览器是否支持history来灵活调用相应的方式。ng的路由(ngRoute)是一个单独的模块,包含以下内容:

    • 服务$routeProvider用来定义一个路由表,即地址栏与视图模板的映射
    • 服务$routeParams保存了地址栏中的参数,例如{id : 1, name : 'tom'}
    • 服务$route完成路由匹配,并且提供路由相关的属性访问及事件,如访问当前路由对应的controller
    • 指令ngView用来在主视图中指定加载子视图的区域以上内容再加上$location服务,我们就可以实现一个单页面应用了。下面来看一下具体如何使用这些内容。
    • 开发步骤:
    • 1.创建一个index.html用来做我们的主页面,里面可能会引入我们所需要的js和css;
    • <!doctype html>
      <html lang="en">
      <head>
      	<meta charset="UTF-8">
      	<title>Document</title>
      	<!--[if lt IE 9]>
      	<script>
      	(function(){
      	    var tags = ['header','footer','figure','figcaption','details','summary','hgroup','nav','aside','article','section','mark','abbr','meter','output','progress','time','video','audio','canvas','dialog'];
      	    for(var i=tags.length - 1;i>-1;i--){ document.createElement(tags[i]);}
      	})();
      	</script>
      	<![endif]-->
      	<link rel="stylesheet" type="text/css" href="bower_components/bootstrap/dist/css/bootstrap.css">
      	<link rel="stylesheet" type="text/css" href="css/main.css">
      </head>
      <body class="container">
      	<header class="col-md-12">
      		<h1>图书管理系统Demo</h1>
      	</header>
      	<main class="col-md-12">
      		<nav class="col-md-2">
      			<ul>
      				<li><a href="#/">首页</a></li>
      				<li><a href="#/second">图书列表</a></li>
      				<li><a href="#/third">学生列表</a></li>
      			</ul>
      		</nav>
      		<section class="col-md-10" ng-app="odyapp" ng-view></section>
      		<!-- <section ui-view></section> -->
      
      	</main>
      	<footer class="col-md-12">
      		Copyright &copy; 2015-2016 All Rights Reserved
      	</footer>
      	<script type="text/javascript" src="bower_components/jquery/dist/jquery.js"></script>
      	<script type="text/javascript" src="bower_components/bootstrap/dist/js/bootstrap.js"></script>
      	<script type="text/javascript" src="bower_components/angular/angular.js"></script>
      	<script type="text/javascript" src="bower_components/angular-route/angular-route.js"></script>
      	<script type="text/javascript" src="bower_components/angular-ui-router/release/angular-ui-router.js"></script>
      	<script type="text/javascript" src="js/app.js"></script>
      	<script type="text/javascript" src="js/filters/filter.js"></script>
      	<script type="text/javascript" src="js/directives/directive.js"></script>
      	<script type="text/javascript" src="js/services/service.js"></script>
      	<script type="text/javascript" src="js/controllers/index.js"></script>
      	<script type="text/javascript" src="js/controllers/second.js"></script>
      	<script type="text/javascript" src="js/controllers/third.js"></script>
      </body>
      </html>
      上面的JS是我们所需要的Js,下面的Js可以暂时忽略,以后会用到;
    • 2.创建模型和控制器
    • 先需在模块声明中注入对ngRoute的依赖,如下:

      var odyapp=angular.module("odyapp",[
      	"ngRoute",
      	])

      $routeProvider提供了定义路由表的服务,它有两个核心方法,when(path,route)和otherwise(params),先看一下核心中的核心when(path,route)方法。

      when(path,route)方法接收两个参数,path是一个string类型,表示该条路由规则所匹配的路径,它将与地址栏的内容( $location.path) 值进行匹配。如果需要匹配参数,可以在path中使用冒号加名称的方式,如:path为/show/:name,如果地址栏是/show/tom,那么参 数name和所对应的值tom便会被保存在$routeParams中,像这样:{name : tom}。我们也可以用*进行模糊匹配,如:/show*/:name将匹配/showInfo/tom。

      route参数是一个object,用来指定当path匹配后所需的一系列配置项,包括以下内容:

    • controller //function或string类型。在当前模板上执行的controller函数,生成新的scope
          controllerAs //string类型,为controller指定别名
          template //string或function类型,视图所用的模板,这部分内容将被ngView引用
          templateUrl //string或function类型,当视图模板为单独的html文件或是使用了<script type="text/ng-template">定义模板时使用
          resolve //指定当前controller所依赖的其他模块
          redirectTo //重定向的地址
      最简单的原生态路由

    • var odyapp=angular.module("odyapp",[
      	"ngRoute",
      	"odyapp.controller",
      	"odyapp.filter",
      	"odyapp.directive",
      	"odyapp.service"
      	])
      //使用原生路由
      odyapp.config(['$locationProvider','$routeProvider',function($locationProvider,$routeProvider){
      	'use strict';
      	$routeProvider
      	// .when("/",template="<div></div>")
      	.when("/",{templateUrl:"view/index.html",controller:"indexCtrl"})
      	.when("/second",{templateUrl:"view/second.html",controller:"secondCtrl"})
      	.when("/third",{templateUrl:"view/third.html",controller:"thirdCtrl"})
      	.otherwise({redirectTo:"/"});
      }]);
      
      这里的controller,表示的是一个控制器,我们会在里面写一些Js方法用来控制流程跳转。filter是用来过滤一些数据的,我们可以在里面控制哪些数据显示,哪些数据不显示,以及数据显示的内容,directive里面可以用来写一些非angularJs的一些Js,比如jquery或者原生态js。service里面可以用来处理我们的业务逻辑。虽然有些东西没有用到,但是如果是一个完整的项目的话,这些都是必须的。

    • 3.主视图模板中指定加载子视图的位置

    • 我们的单页面程序都是局部刷新的,那这个“局部”是哪里呢,这就轮到ngView出马了,只需在模板中简单的使用此指令,在哪里用,哪里就是“局部”。例如:

      <div ng-view></div>
      <ng-view></ng-view>

      我们的子视图将会在此处被引入进来。完成这三步后,你的程序的路由就配置好了。

    • 其实我们的路由里面已经明确的指定View,在子页面里面也可以不适用ngView去绑定,只需要把子页面交给ng-controller就好了。下面为一个小

    • Demo;

    • 点击打开链接

    展开全文
  • C# WebApi 路由机制剖析

    2021-01-01 11:29:01
    前言:从MVC到WebApi,路由机制一直是伴随着这些技术的一个重要组成部分。 它可以很简单:如果你仅仅只需要会用一些简单的路由,如/Home/Index,那么你只需要配置一个默认路由就能简单搞定; 它可以很神秘:你的url...
  • 为使下一代互联网NGI(next generation Intemet)获得服务质量Qos(quality of service)路由能力,提出了无连接QoS路由机制,该机制包括接纳控制、扩展的域内和域间协议.设计探测报文和反馈报文完成接纳控制,引入...
  • 针对无线Mesh网络安全路由机制匮乏、内部恶意节点在数据传输过程中容易产生分组丢失的问题,提出了一种基于动态信誉的无线Mesh网络安全路由机制(SRMDR)。首先,采用动态信誉机制评价节点行为,根据节点直接信誉值...
  • 由于域内信息的私密性,各自治域之间不会共享相关的数据,传统的域间路由协议无法提供高效的跨域路由机制。为克服现有协议存在的不足,提出了一种基于机器学习的联邦路由机制,该机制通过各自治域的神经网络模型和...
  • WMN的QoS保证机会路由机制
  • 随着计算机网络的发展,自组织网络因其具有灵活性、自适应性、顽健性等...为保证网络状态变化下应用的QoS,采用了混合式重路由机制,针对不同网络失效状况作出相应的处理。仿真实验表明,该路由机制具有良好的性能。
  • 传统网络由于其分布式网络的特性,其路由技术具有路由收敛慢、节点认知不...OpenFlow目前并无一种标准化的路由机制。基于POX与Mininet搭建用于仿真研究的平台,并在该平台下开发路由组件,实现了最短路径转发的机制。
  • 为了提高路由抑制虚假路径的能力, 文中将信任机制引入到域间路由中, 采用可信度表示路径的真实可信程度,提出了基于可信度的域间路由机制, 其主要思想为在路径选择时考虑路径的可信度,选取可信度高的路径作为最优路径...
  • 主要介绍了angular学习之ngRoute路由机制,ngRoute是一个Module,提供路由和深层链接所需的服务和指令。有需要的可以了解一下。
  • 域间安全路由机制对路由劫持的防御能力研究 安全实践 网络信息安全 区块链 业务安全 系统安全
  • windows消息路由机制

    2013-11-28 23:47:50
    转载的关于windows消息路由机制的图片文档,希望有点帮助吧,嘿嘿
  • 主要介绍了AngularJS入门教程之路由机制ngRoute,结合实例形式分析了AngularJS路由机制的原理、ngRoute的组成、配置、参数与相关使用技巧,需要的朋友可以参考下
  • 针对间断连接无线网络中限制消息副本路由机制的低消息投递率与存在恶意节点攻击的问题,提出了一种节点状态实时感知的安全路由机制,采用供给需求模型对节点转发消息的过程进行建模,通过动态感知节点活跃度、邻居...
  • 基于 ICN 的协作缓存和路由机制
  • 带有相遇预测的自适应路由机制
  • 针对矿井巷道结构狭长而造成无线传感器网络节点能耗不均的问题,提出了一种新的矿井无线传感器路由机制,即矿井非均匀分簇LBUC-M协议:构造一个新的阈值公式以一定周期选举候选簇首,以非均匀半径确定最终簇首,使得远离...
  •  传感器网络的路由机制要能够简单而且高效地实现信息传输。  (2)可扩展性  在无线传感器网络中,检测区域范围或节点密度不同,造成网络规模大小不同;节点失败、新节点加人以及节点移动等,都会使得网络拓扑...
  • pecan的路由机制

    千次阅读 2019-04-19 18:04:48
    pecan的路由机制 基于对象分发的路由机制 pecan使用对象分发的方式将某个HTTP请求(request)映射给某个控制器(controller)。 对象分发机制首先将请求路径分割成一系列的字符串,并根据这些字符串从root控制器开始...

    pecan的路由机制

    基于对象分发的路由机制

    pecan使用对象分发的方式将某个HTTP请求(request)映射给某个控制器(controller)。

    对象分发机制首先将请求路径分割成一系列的字符串,并根据这些字符串从root控制器开始依次寻找下一级控制器。可以将应用的控制器集合想象成一个对象树,这个树的每一个分支对应了一个URL路径。下面通过代码来介绍pecan的路由机制。

    from pecan import expose
    
    class BooksController(object):
        @expose()
        def index(self):
            return "Welcome to book section."
    
        @expose()
        def bestsellers(self):
            return "We have 5 books in the top 10."
    
    class CatalogController(object):
        @expose()
        def index(self):
            return "Welcome to the catalog."
    
        books = BooksController()
    
    class RootController(object):
        @expose()
        def index(self):
            return "Welcome to store.example.com!"
    
        @expose()
        def hours(self):
            return "Open 24/7 on the web."
    
        catalog = CatalogController()

    对于上述代码,如果此时有这样一个请求:/catalog/books/bestsellers,则pecan首先将这个请求分割成:catalog, books, bestsellers。接下来,pecan将会从root控制器中寻找catalog,找到catalog对象后,pecan会继续在catalog控制器中寻找books,以此类推一直找到bestsellers。如果URL以’/‘结束,那么pecan将会查找最后一个控制器的index方法。

    进一步讲,下面的这些请求路径:

    └── /
        ├── /hours
        └── /catalog
             └── /catalog/books
                └── /catalog/books/bestsellers

    将会路由给这些控制器方法:

    └── RootController.index
        ├── RootController.hours
        └── CatalogController.index
             └── BooksController.index
                └── BooksController.bestsellers

    expose()方法

    你可以通过expose()方法告诉pecan一个控制器类中的哪些方法是公开可见的。如果一个控制器类的某个方法没有被expose()装饰,那么pecan不会将请求路由给它。

    expose()有很多使用方法。最简单的用法就是不给它传递任何参数。在这种情况下,这个控制器返回一个代表HTML响应体的字符串。如下面的代码所示。

    from pecan import expose
    
    class RootController(object):
        @expose()
        def hello(self):
            return 'Hello World’

    不过,更常见的用法是指定一个模板和名字空间,如下所示,html_template.mako是一个模板,hello()方法返回的是一个名字空间{‘msg’:’hello!'},该名字空间被用来渲染html_template.mako模板。

    from pecan import expose
    
    class RootController(object):
        @expose('html_template.mako')
        def hello(self):
            return {'msg': 'Hello!’}

    html_template.mako模板内容:

    <!-- html_template.mako -->
    <html>
        <body>${msg}</body>
    </html>

    除了HTML模板,pecan也内置一个特殊的json渲染器,它将名字空间渲染进一个json文本,如下所示:

    from pecan import expose
    
    class RootController(object):
        @expose('json')
        def hello(self):
            return {'msg': 'Hello!'}

    expose()方法也可以被层叠调用,这允许你根据请求内容的不同而生成不同的响应内容。

    from pecan import expose
    
    class RootController(object):
        @expose('json')
        @expose('text_template.mako', content_type='text/plain')
        @expose('html_template.mako')
        def hello(self):
            return {'msg': 'Hello!'}
    

    从这里可以看见,我们用不同的参数分别调用了三次expose()方法。

    @expose('json')

    第一个调用告诉pecan当客户端请求/hello.json或者http header中包含“Accept: application/json”时,将hello()方法响应的名字空间渲染进json文本。

    @expose('text_template.mako', content_type='text/plain')

     第二个调用告诉pecan当客户端请求/hello.txt或者http header中包含“Accept: text/plain”时,使用text_template.mako模板文件。

    @expose('html_template.mako')

    第三个调用告诉pecan当客户端请求/hello.html时,使用html_template.mako模板文件。如果客户端请求/hello,并且没有显式指明内容格式,则pecan默认使用text/html的内容格式进行响应,假设客户端想要HTML。

    显式指定路径分段

    偶尔,你想在路径里面显式指定分段,例如有这样一个请求:/some-path,由于python语法限制,pecan并不能将该请求的处理方法声明为some-path,即下面的代码在python中是无效的:

    class RootController(object):
    
        @pecan.expose()
        def some-path(self):
            return dict()

     为了能绕过这种限制,pecan允许你在expose()装饰器内指定一个路径分段,如下面代码段所示:

    class RootController(object):
    
        @pecan.expose(route='some-path')
        def some_path(self):
            return dict()

    在这个例子中,pecan应用将会给/some-path/请求返回HTTP 200,但对于/some_path/请求将会返回HTTP 404。

    route()方法也可以被显式的用来作为对expose()方法中route参数的代替,如下面代码段所示:

    class RootController(object):
    
        @pecan.expose()
        def some_path(self):
            return dict()
    
    pecan.route('some-path', RootController.some_path)

    更进一步,用同样的方式,还可以利用route()方法来将请求路由给下一级控制器。

    class ChildController(object):
    
        @pecan.expose()
        def child(self):
            return dict()
    
    class RootController(object):
        pass
    
    pecan.route(RootController, 'child-path', ChildController())

    在这个例子中,pecan应用将会给请求/child-path/child/返回HTTP 200响应。

    基于请求方法的路由

    expose()方法中的generic参数可以根据请求方法对URL进行重载。在下面的例子中,同一个URL可以被两个不同的方法处理(一个用来处理HTTP GET请求,一个用来处理HTTP POST请求)。当在expose()方法的参数中指定“generic=True”后,对’/‘的GET请求,由index()方法处理,对’/‘的POST请求将会由index_POST()方法处理。

    from pecan import expose
    
    
    class RootController(object):
    
        # HTTP GET /
        @expose(generic=True, template='json')
        def index(self):
            return dict()
    
        # HTTP POST /
        @index.when(method='POST', template='json')
        def index_POST(self, **kw):
            uuid = create_something()
            return dict(uuid=uuid)

    Pecan的路由算法

    有时,标准的对象分发路由方式不足以将某个URL路由到一个控制器上。pecan提供了几种方法去使对象分发方式的路由发生短路,以便用更多的控制来处理URL,以下这些特殊的方法用来实现这个目标:_lookup(),_default(),_route()。在你的控制器上定义这些方法可以让你更加灵活的处理一个URL的全部内容或部分内容。

    _lookup()方法

    _lookup()提供一种方式处理一个URL的部分内容,并返回一个新的控制器用于处理URL的剩余部分。一个_lookup()方法可以提供一个或多个参数,以及URL的分片。同时_lookup()方法应该用可变的位置表示URL的剩余部分,并且在它的返回值里包含未处理的剩余URL部分。在下面的例子中,对象分发路由算法将会把remainder列表传递给该方法返回的控制器。

    _lookup()除了被用来动态创建控制器以外,当没有其他任何控制器方法能够匹配一个URL且没有定义_default()方法时,_lookup()方法作为最后一个方法被调用。

    from pecan import expose, abort
    from somelib import get_student_by_name
    
    class StudentController(object):
        def __init__(self, student):
            self.student = student
    
        @expose()
        def name(self):
            return self.student.name
    
    class RootController(object):
        @expose()
        def _lookup(self, primary_key, *remainder):
            student = get_student_by_primary_key(primary_key)
            if student:
                return StudentController(student), remainder
            else:
                abort(404)
    

    对'/8/name’的GET请求将会返回primary_key等于8的学生的名字。

    _default()方法

    对于标准的对象分发路由机制,当没有其他任何控制器方法能够匹配一个URL时, _default()方法作为最后一个方法被调用。

    from pecan import expose
    
    class RootController(object):
        @expose()
        def english(self):
            return 'hello'
    
        @expose()
        def french(self):
            return 'bonjour'
    
        @expose()
        def _default(self):
            return 'I cannot say hello in that language'

    在上面的例子中,对/spanish的请求将会路由到RootController._default()方法。

    _route()方法

    _route()方法允许一个控制器完全覆盖pecan的路由机制。pecan它本身也使用_route()方法去实现它的RestController。如果你想在pecan之上定义一套替代的路由机制,那么定义一个包含_route()方法的基控制器将会使你完全掌控请求的路由。

    展开全文
  • 如何基于有限且确定的路由结构来支持多样化服务是当前研究面临的问题,采用路由结构的自组织和自调节来实现路由与业务的“自适配”,提出一种面向多样化服务定制的多态路由机制。该机制通过自适配网络路由结构的基本...
  • 摘要:为了把响应时间引入传感器网络中的路由机制,细分了网络层次,分析了响应时间模型、基于二层架构的传感器网络,制定了2种可行方案.新路由机制以现有节能路由算法为基础,根据时间约束修正路由路径和增添带有响应...
  • 针对可信网络中服务质量QoS (quality of service)重路由的特点,提出了一种基于疫苗接种免疫遗传的QoS 重路由机制。对网络模型、用户需求以及满意度计算方法进行了描述。为解决QoS 选路的可信问题,构造了链路信任...
  • 基于路由机制的时变路网k近邻算法
  • 针对数据中心网络流量大小分布不均匀、传输性能需求不相同的特征,提出了面向传统树型数据中心网络结构的软件定义混合路由机制SHR(software-defined hybrid routing)。SHR通过统计计算将数据流分为大流和小流,为...
  • 一种基于蚂蚁群体智能的信息中心网络路由机制,通过考虑内容提供者的移动性,设计了解决移动性的机制

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 206,256
精华内容 82,502
关键字:

路由机制