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. [leetcode]215. Kth Largest Element in an Array 数组中第k大的元素

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  2. springmvc使用数组接收页面商品列表批量删除传过来的参数,并完成批量删除的操作。

    1.1 需求 在商品列表页面选中多个商品,然后删除. 1.2 需求分析 此功能要求商品列表页面中的每个商品前有一个checkbox,选中多个商品后点击删除按钮把商品id传给controller,根据商 ...

  3. 【原创】VB超强游戏外挂帮助类,封装了很多方法

    ''' <summary> ''' a very nice file that can be used on other projects ''' </summary> ''' ...

  4. php调试利器之phpdbg

    信海龙的博客 php调试利器之phpdbg 简介 PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境. PHPDBG的目标是成为一个轻量级.强大.易用的 ...

  5. Js中的this关键字(吉木自学)

    研究生毕业答辩完,开始继续为转行努力.小白要奋斗了,加油.本文引自JS核心系列:浅谈函数的作用域. 在一个函数中,this总是指向当前函数的所有者对象,this总是在运行时才能确定其具体的指向, 也才 ...

  6. dbus通信与接口介绍

    DBUS是一种高级的进程间通信机制.DBUS支持进程间一对一和多对多的对等通信,在多对多的通讯时,需要后台进程的角色去分转消息,当一个进程发消息给另外一个进程时,先发消息到后台进程,再通过后台进程将信 ...

  7. Python图像处理库:Pillow 初级教程-乾颐堂

    Image类 Pillow中最重要的类就是Image,该类存在于同名的模块中.可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个图片. 使用Image模块中的open函数 ...

  8. CURL_SAFE_UPLOAD

    1.版本差异 PHP5.4:支持通过在数组数据中,使用“@+文件全路径”的语法附加文件 curl_setopt(ch, CURLOPT_POSTFIELDS, array( 'file' => ...

  9. php用get方式传json数据 变成null了

    $data = I('param.data'); $data=stripslashes(html_entity_decode($data));//$data为传过去的json字符串

  10. Vue.js 生命周期的应用

    生命周期示意图 值得注意的几个钩子函数 activated 类型:Function 详细: keep-alive 组件激活时调用. 该钩子在服务器端渲染期间不被调用. 参考: 构建组件 - keep- ...