Python的Bottle框架的一些使用技巧介绍

之前对bottle做过不少的介绍,也写过一些文章来说明bottle的缺点,最近发现其实之前有些地方说的不太公平,所以趁此机会也来更正一下。

    bottle是支持类似flask url_for的语法的,具体使用方法在下文介绍
    bottle的request.query之类的参数默认是str类型,也是有原因的,比如我在给google做代理的时候,编码就不一定是utf8的,如果强制转化utf8就会报错
    之前的bug也得到了修正,比如mount(‘/x’,app)之后,/x/和/x都可以访问到

OK,现在正式进入主题,我们来介绍一些bottle的一些高级使用

一. 智能创建url

这部分在bottle的文档上是没有介绍的(其实bottle明明实现了很多贴心的功能,不知道为啥都不写在文档上)。
Bottle类里,有一个成员函数:

def get_url(self, routename, **kargs):  """ Return a string that matches a named route """  scriptname = request.environ.get('SCRIPT_NAME', '').strip('/') + '/'  location = self.router.build(routename, **kargs).lstrip('/')  return urljoin(urljoin('/', scriptname), location) def get_url(self, routename, **kargs):  """ Return a string that matches a named route """  scriptname = request.environ.get('SCRIPT_NAME', '').strip('/') + '/'  location = self.router.build(routename, **kargs).lstrip('/')  return urljoin(urljoin('/', scriptname), location)

登录后复制

那么这个routename是哪里来的呢?看 route 装饰器的参数:

def route(self, path=None, method='GET', callback=None, name=None,     apply=None, skip=None, **config): def route(self, path=None, method='GET', callback=None, name=None,     apply=None, skip=None, **config):

登录后复制

其中的name参数就是routename(这里不得不说一下,这种方式比flask要好些,要用才指定name,而不需要为了实现url_for,把整个框架都实现的很复杂)

所以看到这里大家也就明白了,bottle的url生成器是绑定在Bottle实例上的,所以跨实例访问默认是做不到的。
而可能由于bottle所推崇的micro化,所以其源码中特意对默认Bottle示例包装出了一个函数:

for name in '''route get post put delete error mount        hook install uninstall'''.split():  globals()[name] = make_default_app_wrapper(name)url = make_default_app_wrapper('get_url')del name for name in '''route get post put delete error mount        hook install uninstall'''.split():  globals()[name] = make_default_app_wrapper(name)url = make_default_app_wrapper('get_url')del name

登录后复制

这样做的好处是,如果工程只用到默认的Bottle实例的话,在模板中就可以直接使用url,而不必再多传个Bottle实例进去。

更正一下,bottle的get_url是不能跨app调用的,比如被mount的app调用主app的get_url会错掉,因为此时的SCRIPT_NAME是当前页的path,所以拼装起来会乱掉,所以就不要尝试了。

立即学习“Python免费学习笔记(深入)”;

但是怎么才能让模板能够访问到local变量呢?我们接下来介绍

二. 给模板指定默认的变量

因为笔者用的最多的是jinja2,所以模板相关的介绍都是以jinja2为例子.
由于bottle的很多实例都是使用的代理模式,如request,response,local,所以我们可以放心的将这些变量传入到模板默认变量里去。
代码也很简单:

from bottle import BaseTemplateBaseTemplate.defaults.update(dict(  request=request,  local=local,  )) from bottle import BaseTemplate BaseTemplate.defaults.update(dict(  request=request,  local=local,  ))

登录后复制

有兴趣的话,大家也可以去直接看一下源码,很好懂

三. 给模板增加filters

还是以jinja2为例,直接给出代码如下:

from bottle import BaseTemplateif 'filters' not in BaseTemplate.settings:  BaseTemplate.settings['filters'] = {}filters = BaseTemplate.settings['filters']def urlencode_filter(params):  '''  urlencode  '''  from urllib import urlencode  return urlencode(params)filters.update(dict(  urlencode=urlencode_filter,  )) from bottle import BaseTemplate if 'filters' not in BaseTemplate.settings:  BaseTemplate.settings['filters'] = {} filters = BaseTemplate.settings['filters'] def urlencode_filter(params):  '''  urlencode  '''  from urllib import urlencode   return urlencode(params) filters.update(dict(  urlencode=urlencode_filter,  ))

登录后复制

OK,一共就是这些,这里基于的bottle版本是 0.10.9,如果有不相符的地方,请查看bottle版本。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2306572.html

(0)
上一篇 2025年2月28日 09:34:21
下一篇 2025年2月23日 08:06:02

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 简单的编程0基础下Python入门指引

     你曾经想知道计算机是如何工作的吗?尽管我们不能在一篇文章里面教会你所有的东西,但是可以通过学习如何写出你自己的程序来获得一个良好的开端。在这篇Python教程中,你将会学到计算机编程的基础知识,使用对新手来说最棒的编程语言之一。什么是编程…

    2025年2月28日 编程技术
    200
  • python查找目录下指定扩展名的文件实例

    本文实例讲述了python查找目录下指定扩展名的文件。分享给大家供大家参考。具体如下: 这里使用python查找当前目录下的扩展名为.txt的文件 import ositems = os.listdir(“.”)newlist = []fo…

    编程技术 2025年2月28日
    200
  • 简单介绍Python的轻便web框架Bottle

    基本映射 映射使用在根据不同URLs请求来产生相对应的返回内容.Bottle使用route() 修饰器来实现映射. from bottle import route, run@route(‘/hello’)def hello(): retu…

    编程技术 2025年2月28日
    200
  • Python中关于字符串对象的一些基础知识

    python的字符串被划分为不可变序列的类别,意味着这些字符串所包含的字符存在从左至右的位置顺序,并且它们不可以在本地进行修改。 基本操作 字符串可以通过+操作符进行合并,可以使用*运算符进行重复。  >>>len(“ab…

    编程技术 2025年2月28日
    200
  • 给Python的Django框架下搭建的BLOG添加RSS功能的教程

    前些天有位网友建议我在博客中添加rss订阅功能,觉得挺好,所以自己抽空看了一下如何在django中添加rss功能,发现使用django中的syndication feed framework很容易实现。     具体实现步骤和代码如下:  …

    编程技术 2025年2月28日
    200
  • python单例模式实例分析

    本文实例讲述了python单例模式。分享给大家供大家参考。具体分析如下: __new__()在__init__()之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。单例模式是指创建唯一对象,单例模式设计的…

    编程技术 2025年2月28日
    200
  • 使用Python操作Elasticsearch数据索引的教程

    elasticsearch是一个分布式、restful的搜索及分析服务器,apache solr一样,它也是基于lucence的索引服务器,但我认为elasticsearch对比solr的优点在于:     轻量级:安装启动方便,下载文件之…

    编程技术 2025年2月28日
    200
  • 操作系统怎么自学教程

    要自学操作系统,请按照以下步骤进行:奠定基础:学习计算机体系结构和汇编语言,阅读操作系统教科书。选择编程语言:C/C++、Rust 或 Python。实践实践实践:创建迷你操作系统、贡献开源项目和搭建虚拟机。深入学习:了解并发编程、文件系统…

    2025年2月28日
    200
  • 在Docker上部署Python的Flask框架的教程

    Docker 本文中,我将尝试展示用docker开发python应用(主要是web应用)的可行方法。虽然我本人专注于python的flask微框架,但本文目的是演示如何通过docker更好地开发和共享应用程序,(由任何语言和框架开发的应用程…

    编程技术 2025年2月28日
    200
  • 用Python实现协同过滤的教程

    协同过滤 在 用户 —— 物品(user – item)的数据关系下很容易收集到一些偏好信息(preference),比如评分。利用这些分散的偏好信息,基于其背后可能存在的关联性,来为用户推荐物品的方法,便是协同过滤,或称协作型…

    编程技术 2025年2月28日
    200

发表回复

登录后才能评论