URL映射

Uliweb使用Werkzeug的Routing来进行URL的处理。当你使用manage.py的makeapp命令生成一个新 的App时,它会自动生成views.py文件,其中会自动从uliweb.core.SimpleFrame中导出expose 函数,它是一个decorator函数,用于修饰view函数。

通过expose可以将一个URL与一个view函数进行绑定,然后通过url_for(这是SimpleFrame提供的用 于反向生成URL的方法)来生成反向的URL。

expose说明

目前,Uliweb取消了集中的URL配置,因此你需要在每个view方法前加上expose()来定义URL。 但同时,Uliweb还允许你将URL定义在settings.ini,以方便实现URL的替換。

Uliweb目前提供两种View函数的写法,一种是简单的函数方式,另一种是类方式的定义,下 面分别进行描述。

普通View函数的处理

基本用法为:

  1. 缺省映射

    @expose()
    def index(arg1, arg2):
    return {} @expose
    def index(arg1, arg2):
    return {}

    当expose()不带任何参数(也可以不带括号)时,将进行缺省的映射。即URL将为:

    /appname/view_function_name/<arg1>/<arg2>

    如果view函数没有参数,则为:

    /appname/view_function_name
  2. 固定映射

    @expose('/index')
    def index():
    return {}
  3. 参数处理

    当URL只有可变内容,可以配置为参数。一个参数的基本形式为:

    <convertor(arguments):name>

    其中convertor和arguments是可以缺省的。convertor类型目前可以设置为:int, float, any, string, path等。不同的convertor需要不同的参数。详情请参见 下面的converter说明。最简单的形式就是 <name> 了,它将匹配/到/间的内容。 name为匹配后参数的名字,它需要与绑定的view方法中的参数名相匹配。

  4. 其它参数

    expose函数允许在义时除了给出URL字符串以外再提供其它的参数,比如:

    defaults

    它用来定义针对view函数中的参数的缺省值,例如你可以定义:

    @expose('/all', defaults={'page': 1})
    @expose('/all/<int:page>')
    def show(page):
    return {}

    这样两个URL都指向相同的view函数,但由于show方法需要一个page参数,所以对于第一 个/all来说,需要定义一个缺省值。

    build_only

    如果设置为True,将只用来生成URL,不用于匹配。目前Uliweb提供了静态文件的处理, 但一旦你想通过象Apache这样的web server来提供服务的话,就不再需要Uliweb的静态 文件服务了。但是有些文件的链接却是依赖于这个定义来反向生成的,因此为了不进行匹配, 可以加上这个参数,这样在访问时不会进行匹配,但是在反向生成URL时还可以使用。

    methods

    HTTP请求可以分为GET, POST等方法,使用methods可以用来指定要匹配的方法。比 如:

    @expose('/all', methods=['GET'])
    name(uliweb扩展)

    用来给URL起个别名。如果不提供,则会将下面的函数转为字符串形式,称为endpoint, 以它作为name的值。endpoint的形式为: appname.modelname.functionname 。 它可以用在url_for()函数中。

    template(uliweb 0.2.2扩展)

    直接用来设置View函数的模板,只有当View函数返回dict值时才生效。并且如果 view函数中定义了response.template = 'xxx.html'则,response.template优先 级最高。

    layout(0.5)

    增加动态引用父模板的参数.这样当前模板中可以不引入 {{extend 'parent.html'}},而 是由 layout 参数指明.

    关于参数更多的说明请参见werkzeug下的routing.py程序。

类View函数的处理

详细的文档参见 视图(View)

在settings.ini中定义URL

Uliweb也支持将URL定义到settings.ini,其主要目的是为了允许别人替換。比如已经开 发了一个app,有一些常用的URL的定义。但是希望别人可以替換已经定义好的URL,如果 直接写到views中,则不会进行替換,只会添加。所以放到settings.ini中就可以方便替 換了。定义示例如下:

[EXPOSES]
login = '/login', 'plugs.user.views.login'
logout = '/logout', 'uliweb.contrib.auth.views.logout'
register = '/register', 'uliweb.contrib.auth.views.register'

Key是URL的名字,值一般是二元或三元的tuple。形式为:

(url_pattern, view_function_path[, kwargs])

第一个为url模式,第二个为url对应的view函数的路径,第三个是可选的,应该是一个字典, 它是将传入expose中的参数。

GET和POST

为了方便处理expose(methods=['GET', 'POST'])这样的URL,uliweb还定义了GET和POST, 分别用于处理GET和POST方法,其它的象DELETE要象上面这样定义。

与decorator联用时的注意事项

有时我们希望通过使用decorator来修饰view方法,包括类的view方法。那么由于expose 本身也是一个decorator,并且当函数有参数时,在expose不传入参数时,将自动对函数 的参数进行解析,而decorator的处理方式,有可能会造成新生成的方法与原始的方法参 数不同,会使得生成的URL出现问题。因此对于普通的view函数,建议将expose放在最下 面,以保证expose先执行。而在使用类view方法时,对于只有self参数的简单方法,可以 只加decorator,并且使用自动URL的处理。但对于带有除self之外的其它的参数,使用自 动URL处理可能会出现问题,因此建议添加expose的修饰,并且放在其它的decorator之上, 如:

@expose('/myview')
class MyView(object):
@_other
def test1(self):
#这个可以 @_other
def test2(self, id):
#这样可能有问题,因为_other有可能创建新的函数,造成与test2的
#参数不同 @expose('test3/<id>')
@_other
def test3(self, id):
#正确,添加显示的expose调用,并且使用相对URL的定义,以便和
#缺省URL的处理一致 @_other
@expose('test3/<id>')
def test3(self, id):
#可能不正确

App URL 前缀定义

当我们写好一个APP时我们可能预先假定了它应该使用的URL前缀,如 /app ,但是当 别人在使用时,可能并不希望使用 /app 的前缀,而是想使用其它的。因此 Uliweb 提供了一种App前缀的配置机制,可以在原来的URL前添加一个前缀。如果你想改写,要使用 下一段介绍的URL路由的配置。可以在 settings.ini 中定义如下内容:

[URL]
appname = '/app_prefix'
#或者采用字典定义方式,是为了可以设置subdomain参数
appname = {'prefix':'/app_prefix', 'subdomain':'blog'}

[URL] 用来存放所有需要重定义 appname 前缀的section。每项的内容:key是App的名字, value是App的前缀。

一旦我们定义了这个前缀,那么在这个App下的所有URL都将加上对应的前缀。

如果某些链接的确不想添加这个前缀该如何处理,那么只要在 @expose('/url') 中添 加一个 ! 号即可取消前缀的处理,如:@expose('!/url')

URL 路由

上面的APP URL只是用来在某个app的所有URL前添加一个前缀,但是一旦要改写,则需要使用 URL路由的配置,如:

[URL_ROUTE]
name = ('pattern', 'replacement')

其中真正的匹配是值的部分,它是一个tuple,第一项是正则式字符串,第二项是将要替换的结果,可以 使用组的写法,如:

0 = (('/admin'), r'/name\\1')

正则式是一个分组的写法(有小括号),替换值的作用是在原来的URL前添加一个 /name 的字符串。这里 \\1 有两个反斜线。在处理时,Uliweb自动从URL的开始进行匹配。

key的部分可以随便命名,不是关键的。

url_for说明

url_for可以根据view方法的名字来反向生成URL。要注意,它需要一个字符串形式的view方法名, 格式为:

url_for('appname.views_module_name.function_name', **kwargs)

其中kwargs是与view方法中的参数相对应的。例如你在Hello中定义了如下URL:

@expose('/index')
def index():
pass

然后在反向生成URL时可以使用:

url_for('Hello.views.index') #结果为'/index'

如果你在运行时希望可以动态适应App名字的变化,可以使用:

url_for('%s.views.index' % request.appname)

其中request是请求对象,它有一个appname的属性表示访问的App的名字。

目前在views方法和template中都是可以直接使用这个函数的,不需要导入。

convertor说明

int

基本形式为:

<int:name>                      #简单形式
<int(fixed_digits=4):name> #带参数形式

支持参数有:

  • fixed_digits 固定长度
  • min 最小值
  • max 最大值
float

基本形式为:

<float:name>                    #简单形式
<float(min=0.01):name> #带参数形式

支持参数有:

  • min 最小值
  • max 最大值
string

这两个其实是一样的。 基本形式为:

<string(length=2):name>

支持的参数有:

  • minlength 最小长度
  • maxlength 最大长度
  • length 定长
path

与string和unicode类型,但是没有任何参数。就是匹配从第一个不是 / 的字符到跟着的字 符串或末尾之间的内容。基本形式为:

<path:name>

举例:

'/static/<path:filename>'

可以匹配:

'/static/a.css'         -> filename='a.css'
'/static/css/a.css' -> filename='css/a.css'
'/static/image/a.gif' -> filename='image/a.gif'
any

基本形式为:

<any(about, help, imprint, u"class"):name>

将匹配任何一个字符串。

[Uliweb]-URL映射的更多相关文章

  1. ASP.NET MVC 5 Web编程2 -- URL映射(路由原理)

    本章将讲述ASP.NET MVC5 的路由原理,即URL映射机制. 简单点就是解释:为什么MVC在浏览器输入地址就能访问到类(或类中的方法)?这是怎么做到的?我自己可以通过.NET写出一个自己的MVC ...

  2. urlMappings与URL映射

    此配置节的作用就是往Web程序中添加URL的映射,从而达到用户访问映射后的URL(如/Page/AAA)也能访问到源URL(如/Page/PageAAA.aspx)的效果.这也是URL映射本来的作用. ...

  3. django中“url映射规则”和“服务端响应顺序”

    1.django搜索路径 使用 import 语句时,Python 所查找的系统目录清单.      查看方式:         import sys        print sys.path   ...

  4. MVC 5 Web编程2 -- URL映射

    ASP.NET MVC 5 Web编程2 -- URL映射(路由原理) 2015-02-12 08:50 by hangwei, 704 阅读, 5 评论, 收藏, 编辑 本章将讲述ASP.NET M ...

  5. CCF CSP 201803-3 URL映射

    转载自 https://blog.csdn.net/tigerisland45/article/details/81697594 /* CCF201803-3 URL映射 */ #include &l ...

  6. SpringMvc的Url映射和传参案例(转)

    Springmvc的基本使用,包括url映射.参数映射.页面跳转.ajax和文件上传 以前学习的时候写的代码案例,今天整理笔记的时候找到了,很久没有来园子了,发上来当个在线笔记用吧,免的时间长了又忘了 ...

  7. SpringMvc的Url映射和传参案例

    Springmvc的基本使用,包括url映射.参数映射.页面跳转.ajax和文件上传 以前学习的时候写的代码案例,今天整理笔记的时候找到了,很久没有来园子了,发上来当个在线笔记用吧,免的时间长了又忘了 ...

  8. 使用 IntraWeb (32) - Url 映射与 THandlers

    最简单的 Url 映射是使用 TIWAppForm 的 class 方法: SetURL; THandlers 是 IntraWeb XIV 新增的内容处理器, 它能完成的不仅仅是 Url 映射(转发 ...

  9. Django - 将URL映射到视图

    URLconf 就像是 Django 所支撑网站的目录.它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表.你就是以这种方式告诉 Django,对于这个 URL 调用这段代码, ...

随机推荐

  1. redis中multi和pipeline区别以及效率(推荐使用pipeline)

    手册得知 pipeline 只是把多个redis指令一起发出去,redis并没有保证这些指定的执行是原子的:multi相当于一个redis的transaction的,保证整个操作的原子性,避免由于中途 ...

  2. ROS两种workspace :overlay rosbuild_ws->catkin_ws->ROS库,

    概念 ROS里面有一系列概念,作为初学者,最先接触的概念无非是node, package和workspace. node node是ROS里面最小的执行单位,你可以把node看成是一个main函数,当 ...

  3. dede添加自定义函数

    在dede安装目录下的include/extend.func.php添加自定义函数: /** * 获取文章第一张图片 */ function getFirstImg($arcId) { global ...

  4. 【SQL模板】二.创建表视图模板TSQL

    ---Name: 创建表视图模板.sql ---Purpose: 用于创建 数据库中 新的数据表/视图 ---Author: xx ---Time: 2015-12-18 10:26:06 ---Re ...

  5. mvc 验证封装到某个特征类里[特性的使用]

  6. 100 floors 2 eggs

    https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...

  7. 2018.09.07 bzoj1096: [ZJOI2007]仓库建设(斜率优化dp)

    传送门 斜率优化dp经典题. 令f[i]表示i这个地方修建仓库的最优值,那么答案就是f[n]. 用dis[i]表示i到1的距离,sump[i]表示1~i所有工厂的p之和,sum[i]表示1~i所有工厂 ...

  8. 2018.07.18 [NOI2018]归程(return)(kruskal重构树)

    传送门 新鲜出炉的noi2018试题. 下面讲讲这题的解法: 首先要学习一个叫做kruskal重构树的东东. 听名字就知道跟kruskal算法有关,没错,原来的kruskal算法就是用并查集实现的,但 ...

  9. 2018.07.10 NOIP模拟 sort(单调队列)

    Sort 题目背景 SOURCE:NOIP2016-RZZ-4 T1 题目描述 给你一个长度为 n 的排列,小W每次可以选择一个数,做以下操作: 不断把这个数与它右边的数交换. 当它右边没有数,或它右 ...

  10. Linux IPC 之信号量

    信号量(也叫信号灯)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. 信号量是进程/线程同步的一种方式,有时候我们需要保护一段代码,使它每次只能被一个执行进程/线程运行,这种工作就需 ...