方法expose()

展开目录
方法expose()

  Pecan中使用expose()作为装饰器进行url的映射。下面我们分析第一个Pecan工程中的url映射,并且添加自定义的url映射。

第一个Pecan工程

  在第一个中,进行url映射的代码位于controllers/root.py中。

from pecan import expose, redirect
from webob.exc import status_map


class RootController(object):

    @expose(generic=True, template='index.html')
    def index(self):
        print('index()')
        return dict()

    @index.when(method='POST')
    def index_post(self, q):
        print('index_post(%s)' % q)
        redirect('https://pecan.readthedocs.io/en/latest/search.html?q=%s' % q)

    @expose('error.html')
    def error(self, status):
        print('error()')
        try:
            status = int(status)
        except ValueError: # pragma: no cover
            status = 500
        message = getattr(status_map.get(status), 'explanation', '')
        return dict(status=status, message=message)

  1.使用@expose(generic=True, template='index.html')装饰index(self),其含意是将根url(例如:http://127.0.0.1:8080/)的GET请求映射到方法index(self)。可以使用curl命令来验证。

[root@www.fmttr.com my_project]# curl http://127.0.0.1:8080/
<html>
    <head>
        <title>
    Welcome to Pecan!
...

  2.使用@index.when(method='POST')装饰index_post(self, q),其含意是将根url的POST请求映射到方法index_post(self, q)。其中的q表示接受一个参数。同样的可以使用curl命令三验证。

[root@www.fmttr.com my_project]# curl -X POST http://127.0.0.1:8080/john
302 Found

The resource was found at https://pecan.readthedocs.io/en/latest/search.html?q=john; you should be redirected automatically.

  3.使用@expose('error.html')装饰error(self, status),其含意是将错误的url映射到方法error(self, status)。同样的可以使用curl命令三验证。使用curl访问一个不存在的curl

[root@www.fmttr.com my_project]# curl http://127.0.0.1:8080/noexist
<html>
    <head>
        <title>
    Server Error 404


自定义url映射

  在Pecan中,最简单的url映射就是使用@expose()装饰指定的方法。下面我们在“第一个Pecan工程”的代码基础上,添加自定义的url映射。
  我们先在文件controllers/root.py中的类RootController添加方法,并且使用expose()装饰。

    @expose('news.html')
    def news(self):
        print('news()')
        return dict(headline='news healine', content='This is content.')

  上面的代码,将url(http://127.0.0.1:8080/news)映射到方法news()。此方法返回一个字典,这个字典的内容会在指定的模版news.html进行渲染(即进行变量值替换)。模版文件news.html需要放到templates目录下,其内容为:

<%inherit file="layout.html" />

## provide definitions for blocks we want to redefine
<%def name="title()">
    ${headline}
</%def>

## now define the body of the template
    <header>
        <h1>${headline}</h1>
    </header>
    <p>${content}</p>

  模版文件news.html中的${headline}和${content}在渲染时,会被替换成news()方法返回的字典中对应的键值。

按对象路由

  上面的例子实际上没有反应Pecan按对象进行路由的特性,下面我们通过简单的例子,展示此特性。
  假设我们有这么一个url:/country/england/london,我们该怎么进行url映射呢?因为Pecan是根据对象进行路由的,我们可以在RootCotroller设置对象country,在country中设置对象england,而london可以是对象england的一个方法,这样就完成了此url的映射。具体代码如下:

class England(object):
    @expose()
    def london(self):
        return 'This is Londow.'


class Country(object):
    england = England()

class RootController(object):
  ...
  country = Country()

  可以使用curl命令来验证url映射是否成功:

[root@www.fmttr.com my_project]# curl http://127.0.0.1:8080/country/england/london
This is Londow.