<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Read Sean

    Read me, read Sean.
    posts - 508, comments - 655, trackbacks - 9, articles - 4

    [Pylons] Routes和controller,一個簡單的例子

    Posted on 2009-01-26 16:21 laogao 閱讀(4004) 評論(0)  編輯  收藏 所屬分類: On Python

    在開始之前,說點提外話,隨著對Pylons了解的深入,你可能時不時需要看看相關組件/軟件包是否有更新出來,方法也不復雜,通過"easy_install -U [組件名]"即可,在學習或者是開發過程中,最好是保持環境相對較新,直到出現相對大的release或者即將進入產品部署階段。

    繼續介紹Pylons組件,先看個例子。首先用"paster controller hello"增加一個controller,路徑中會增加出以下兩個文件:
    controllers/hello.py
    tests/functional/test_hello.py

    分別對應新增的controller類HelloController和功能測試類TestHelloController,它們分別繼承自WSGIController->BaseController和TestCase->TestController。

    我們主要看hello.py,默認內容如下:
    ?1?import?logging
    ?2?
    ?3?from?pylons?import?request,?response,?session,?tmpl_context?as?c
    ?4?from?pylons.controllers.util?import?abort,?redirect_to
    ?5?
    ?6?from?newapp.lib.base?import?BaseController,?render
    ?7?#from?newapp?import?model
    ?8?
    ?9?log?=?logging.getLogger(__name__)
    10?
    11?class?HelloController(BaseController):
    12?
    13?????def?index(self):
    14?????????#?Return?a?rendered?template
    15?????????#???return?render('/template.mako')
    16?????????#?or,?Return?a?response
    17?????????return?'Hello?World'

    如果你的服務器沒有Ctrl-C停掉,那么這個時候你已經可以通過
    http://127.0.0.1:5000/hello/index
    看到該controller的處理結果了(Hello World)。

    簡單改造一下17行:
    ????????from?pylons?import?config
    ????????
    return?'<br/>'.join(config.keys())

    我們就可以在返回頁面上顯示出所有可以通過pylons.config訪問到的參數列表。出了返回文本,也可以通過render()方法交給頁面模板引擎生成頁面,也可以通過redirect_to()跳轉到其他URL。

    Pylons是如何找到該請求應該由HelloController的index方法來處理的呢?這背后發生了什么?答案就是Routes。

    Routes的作者是Ben Bangert,是Pylons框架三個主要作者/維護者之一,早期的版本主要是仿照Ruby on Rails的routes.rb開發的,有RoR經驗的朋友可能一眼就能發現它們之間的相似之處。目前Routes的最新版是1.10.2。

    Pylons應用中,routing的配置在config/routing.py,默認生成的內容如下:
    ?1?"""Routes?configuration
    ?2?
    ?3?The?more?specific?and?detailed?routes?should?be?defined?first?so?they
    ?4?may?take?precedent?over?the?more?generic?routes.?For?more?information
    ?5?refer?to?the?routes?manual?at?http://routes.groovie.org/docs/
    ?6?"""
    ?7?from?pylons?import?config
    ?8?from?routes?import?Mapper
    ?9?
    10?def?make_map():
    11?????"""Create,?configure?and?return?the?routes?Mapper"""
    12?????map?=?Mapper(directory=config['pylons.paths']['controllers'],
    13??????????????????always_scan=config['debug'])
    14?????map.minimization?=?False
    15?????
    16?????#?The?ErrorController?route?(handles?404/500?error?pages);?it?should
    17?????#?likely?stay?at?the?top,?ensuring?it?can?always?be?resolved
    18?????map.connect('/error/{action}',?controller='error')
    19?????map.connect('/error/{action}/{id}',?controller='error')
    20?
    21?????#?CUSTOM?ROUTES?HERE
    22?
    23?????map.connect('/{controller}/{action}')
    24?????map.connect('/{controller}/{action}/{id}')
    25?
    26?????return?map

    在這個配置中,對我們剛才的實例起到決定性作用的是第23行,我們的輸入URL為"http://127.0.0.1:5000/hello/index",其中"/hello/index"通過"/{controller}/{action}"這個表達式match出controller為hello而action為index的解析結果,從而在controllers目錄找到hello.py,和其中HelloController的index方法,進行調用。

    map.connect()在上面代碼中體現出兩種用法:
    map.connect('pattern', key=value) - 指定默認的controller、action、id等
    map.connect('pattern') - 直接指定pattern

    pattern字符串允許通配符,通常在最后一個元素上,比如'/{controller}/{action}/{*url}',將后面的整個URL片段交給前面指定的controller/action處理。除此以外,map.connect()還支持

    1- "路徑別名",如:
    map.connect('name', 'pattern', [_static=True])
    如果_static設為"True",表示為"靜態命名路徑"。
    2- 額外的匹配條件,如:
    map.connect('/{controller}/{action}/{id}', requirements={'year': '\d+',})
    map.connect('/{controller}/{action}/{id}', conditions=dict(method=['GET','POST']))

    所有的route優先級為從上到下。Routes除了提供解析進來的URL的邏輯,在我們的controller和template代碼中,我們還可以方便的通過WebHelpers的url_for()方法計算相應的URL。

    Routes 1.x中的有一些仿routes.rb功能將會在2.0中被去掉,包括Route Minimization、Route Memory、Implicit Defaults等。如果有興趣的話,可以參考一下官方文檔,這里就不一一介紹了。為什么要去掉?當然主要的動機還是減少歧義,避免一些不必要的混淆。至于深層次的原因么,可以參考Tim Peters《The Zen of Python》中的一句經典的Python哲學:Explicit is better than implicit。什么?沒有聽說過?打開python命令行,輸入"import this"后回車,慢慢體會其中的道理吧。:)


    主站蜘蛛池模板: 我要看WWW免费看插插视频| 久久久久亚洲Av片无码v| 亚洲人成精品久久久久| 久久亚洲精品无码av| 91免费国产自产地址入| 亚洲不卡av不卡一区二区| 特级毛片在线大全免费播放| 午夜福利不卡片在线播放免费| 久久亚洲伊人中字综合精品| 男女免费观看在线爽爽爽视频| 美女被免费视频网站| 免费真实播放国产乱子伦| 亚洲熟妇AV日韩熟妇在线| 青青久在线视频免费观看| 亚洲香蕉久久一区二区三区四区| 一级毛片免费观看不卡的| 亚洲va在线va天堂va不卡下载| 一二三四在线观看免费高清中文在线观看| 亚洲视频在线观看免费视频| 97在线视频免费| 色婷婷亚洲十月十月色天| 亚洲一级毛片免费在线观看| 免费精品视频在线| 国产成人毛片亚洲精品| 精品久久久久久国产免费了| 亚洲va久久久噜噜噜久久| 四虎影视成人永久免费观看视频| 久久亚洲精品无码av| 亚洲国产日韩女人aaaaaa毛片在线| 在线视频免费观看高清| 色www永久免费网站| 亚洲一区二区影院| 国产av无码专区亚洲国产精品 | 美女内射毛片在线看免费人动物| 久久久久久亚洲Av无码精品专口 | 亚洲国产精品综合福利专区| 好大好硬好爽免费视频| 特级毛片免费播放| 亚洲色成人网站WWW永久四虎| 亚洲一本综合久久| 丁香花在线观看免费观看|