最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

探究Python的Tornado框架對(duì)子域名和泛域名的支持

 更新時(shí)間:2015年05月02日 16:55:59   投稿:goldensun  
這篇文章主要介紹了探究Python的Tornado框架對(duì)子域名和泛域名的支持,Tornado作為一個(gè)典型的異步框架、在Python開發(fā)者中的人氣相當(dāng)高,需要的朋友可以參考下

其實(shí)Tornado對(duì)子域名和泛域名(除了特別說明外,以下子域名和泛域名均簡(jiǎn)稱為泛域名)的支持并不是什么新鮮事,兩年多前我用Tornado寫的開源網(wǎng)站 http://poweredsites.org 就有了對(duì)泛域名的支持,但是Tornado的官方文檔里并沒有明確對(duì)此功能進(jìn)行說明,雖然源代碼里是有注釋的,終是有點(diǎn)隱晦,這不,近日mywaiting同學(xué)就遇到了這個(gè)問題,我應(yīng)邀特撰此博文,分享下我對(duì)此的一點(diǎn)點(diǎn)經(jīng)驗(yàn)。

通常,用Tornado添加url映射路由表是直接傳handlers給Application這種方式的,比如官方的chatdemo:

class Application(tornado.web.Application):
  def __init__(self):
    handlers = [
      (r"/", MainHandler),
      (r"/auth/login", AuthLoginHandler),
      (r"/auth/logout", AuthLogoutHandler),
      (r"/a/message/new", MessageNewHandler),
      (r"/a/message/updates", MessageUpdatesHandler),
    ]
    settings = dict(
      cookie_secret="43oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
      login_url="/auth/login",
      template_path=os.path.join(os.path.dirname(__file__), "templates"),
      static_path=os.path.join(os.path.dirname(__file__), "static"),
      xsrf_cookies=True,
      autoescape="xhtml_escape",
    )
    tornado.web.Application.__init__(self, handlers, **settings)

這種方式其實(shí)添加的是一個(gè)域名通配的url映射表,即域名&子域名不限,只要訪問能夠解析到這個(gè)chatdemo上,“/auth/login” “/auth/login”這些url就都能夠正常運(yùn)行。假設(shè)www.feilong.me、abc.feilong.me、feilong2.me這個(gè)三個(gè)(子)域名均配置為可由這個(gè)chatdemo程序來host,那么訪問這三個(gè)(子)域名均可以正常使用這個(gè)chatdemo,總之域名是無關(guān)的。

實(shí)際上,這種方式它的內(nèi)部是通過Application里的這個(gè)add_handlers來實(shí)現(xiàn)的(原碼注釋如下):

  def add_handlers(self, host_pattern, host_handlers):
    """Appends the given handlers to our handler list.
 
    Note that host patterns are processed sequentially in the
    order they were added, and only the first matching pattern is
    used. This means that all handlers for a given host must be
    added in a single add_handlers call.
    """

只不過它是隱式的調(diào)用這個(gè)add_handlers而已,其關(guān)鍵點(diǎn)就在于第一個(gè)參數(shù)host_pattern(匹配域名的)上,上面那種方式,默認(rèn)添加的host_pattern是”.*$”,即域名通配,若要支持泛域名,只需要顯式的調(diào)用add_handlers來添加相應(yīng)的host_pattern和handlers即可。

接下來就以poweredsites的源碼來介紹Tornado對(duì)泛域名的支持,app.py里的Application里面有這么幾句:

   

 super(Application, self).__init__(handlers, **settings)
 
  # add handlers for sub domains
  for sub_handler in sub_handlers:
    # host pattern and handlers
    self.add_handlers(sub_handler[0], sub_handler[1])

常見的方式super(Application, self).__init__(handlers, **settings)添加的是根域名poweredsites的handlers,接著用for循環(huán)顯式添加的是子域名和泛域名的handlers。這里的sub_handlers依次放有各子域名的handlers,其最后一個(gè)是泛域名的handlers:

sub_handlers.append(site.sub_handlers)
sub_handlers.append(blog.sub_handlers)
sub_handlers.append(admin.sub_handlers)
# wildcard subdomain handler for project should be the last one.
sub_handlers.append(project.sub_handlers)

指定的子域名的sub_handlers(site.sub_handlers)是這個(gè)樣子的,這里的第一個(gè)元素就是host_pattern:

sub_handlers = ["^sites.poweredsites.org$",
        [
         (r"/", _WebsiteIndexHandler),
         (r"/feeds", _WebsitesFeedsHandler),
         (r"/([a-z0-9]{32})", _WebsiteHandler),
         (r"/([^/]+)", WebsiteHandler),
         ]
        ]

泛域名(project.sub_handlers)的區(qū)別也就在于這第一個(gè)元素,即用來做host_pattern的是通配一些子域名的:

sub_handlers = ["^[a-zA-Z_\-0-9]*\.poweredsites.org$",
        [(r"/", ProjectIndexHandler),
         (r"/top", ProjectTopHandler),
         (r"/opensource", ProjectOpensourceHandler),
         ]
        ]

在用到了泛域名的ProjectIndexHandler里,運(yùn)行時(shí)具體的子域名就可以通過下面這樣的方式獲得:

class ProjectIndexHandler(ProjectBaseHandler):
  def get(self):
    subdomain = self.request.host.split(".")[0]

需要說明的是,Tornado里面的url映射表和Django一樣是有順序的,即url依次序由上到下匹配,只要匹配到就立即結(jié)束,不再往下匹配,而帶子域名和泛域名的url路由其匹配優(yōu)先級(jí)是要高于通配域名”.*$”的(這個(gè)不用你操心,add_handlers會(huì)自動(dòng)為你做到這一點(diǎn))。同樣的,對(duì)于泛域名,因?yàn)槠渥佑蛎峭ㄅ涞?,因此指定子域名的handlers需要放到泛域名前添加,如admin、blog這類子域名的handlers要放在泛域名之前,這就是poweredsites里sub_handlers.append(project.sub_handlers)放到最后一條的原因,project這條是對(duì)應(yīng)泛域名的,http://tornado.poweredsites.org 就是靠這一條來實(shí)現(xiàn)的。

備注:需要支持泛域名,首先要你的域名解析支持泛域名。

轉(zhuǎn)載請(qǐng)注明出處:http://feilong.me/2012/08/wildcard-subdomain-support-in-tornado

相關(guān)文章

  • Python之讀取TXT文件的方法小結(jié)

    Python之讀取TXT文件的方法小結(jié)

    下面小編就為大家分享一篇Python之讀取TXT文件的方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 基于Python繪制美觀動(dòng)態(tài)圓環(huán)圖、餅圖

    基于Python繪制美觀動(dòng)態(tài)圓環(huán)圖、餅圖

    這篇文章主要介紹了基于Python制作美觀動(dòng)態(tài)圓環(huán)圖、餅圖,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python實(shí)現(xiàn)實(shí)時(shí)跟隨微信窗口移動(dòng)的GUI界面

    Python實(shí)現(xiàn)實(shí)時(shí)跟隨微信窗口移動(dòng)的GUI界面

    Python寫一些簡(jiǎn)單的GUI界面也是非常簡(jiǎn)單的,并且Python有著豐富的庫,這些庫可以很方便我們?nèi)ゲ僮鱓indows系統(tǒng)。本文就來用Python編寫一個(gè)實(shí)時(shí)跟隨微信窗口移動(dòng)的GUI界面吧
    2023-04-04
  • Django自動(dòng)注冊(cè)tasks及使用方式

    Django自動(dòng)注冊(cè)tasks及使用方式

    這篇文章主要為大家介紹了Django自動(dòng)注冊(cè)tasks及使用方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • python3 打開外部程序及關(guān)閉的示例

    python3 打開外部程序及關(guān)閉的示例

    今天小編就為大家分享一篇python3 打開外部程序及關(guān)閉的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python批量調(diào)整Word文檔中的字體、段落間距及格式

    Python批量調(diào)整Word文檔中的字體、段落間距及格式

    這篇文章主要為大家詳細(xì)介紹了如何使用Python的docx庫來批量處理Word文檔,包括設(shè)置首行縮進(jìn)、字體、字號(hào)、行間距、段落對(duì)齊方式等,需要的可以了解下
    2025-03-03
  • 聊聊python里如何用Borg pattern實(shí)現(xiàn)的單例模式

    聊聊python里如何用Borg pattern實(shí)現(xiàn)的單例模式

    這篇文章主要介紹了聊聊python里如何用Borg pattern實(shí)現(xiàn)的單例模式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-06-06
  • 對(duì)tf.reduce_sum tensorflow維度上的操作詳解

    對(duì)tf.reduce_sum tensorflow維度上的操作詳解

    今天小編就為大家分享一篇對(duì)tf.reduce_sum tensorflow維度上的操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python?PyQt5中窗口數(shù)據(jù)傳遞的示例詳解

    Python?PyQt5中窗口數(shù)據(jù)傳遞的示例詳解

    開發(fā)應(yīng)用程序時(shí),若只有一個(gè)窗口則只需關(guān)心這個(gè)窗口里面的各控件之間如何傳遞數(shù)據(jù)。如果程序有多個(gè)窗口,就要關(guān)心不同的窗口之間是如何傳遞數(shù)據(jù)。本文介紹了PyQt5中三種窗口數(shù)據(jù)傳遞,需要的可以了解一下
    2022-12-12
  • 詳解python開發(fā)環(huán)境搭建

    詳解python開發(fā)環(huán)境搭建

    這篇文章主要介紹了詳解python開發(fā)環(huán)境搭建 ,記錄一下過程,方便自己以后配置,也方便正在學(xué)習(xí)中的同事配置他們的環(huán)境。
    2016-12-12

最新評(píng)論

锡林浩特市| 隆安县| 闽侯县| 襄城县| 剑川县| 达孜县| 武穴市| 博客| 保定市| 元氏县| 斗六市| 洛扎县| 鲁山县| 苏尼特右旗| 武陟县| 南江县| 台安县| 稻城县| 大新县| 西乡县| 阿坝| 蒙城县| 镇坪县| 同仁县| 固安县| 海晏县| 周至县| 玉龙| 隆子县| 东明县| 呼玛县| 北碚区| 宜春市| 禹州市| 玉门市| 会泽县| 陆川县| 乌鲁木齐县| 东光县| 淮阳县| 吴堡县|