BOTTLE的高级技巧
来源:互联网 发布:nginx 只允许内网访问 编辑:程序博客网 时间:2024/06/05 07:31
之前对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类里,有一个成员函数:
12345
- <span style="color:#ff7700"><strong>def</strong></span> get_url<span style="color:black">(</span><span style="color:#008000">self</span>, routename, <span style="color:#66cc66">**</span>kargs<span style="color:black">)</span>:
- <span style="color:#483d8b">""" Return a string that matches a named route """</span>
- scriptname = request.<span style="color:black">environ</span>.<span style="color:black">get</span><span style="color:black">(</span><span style="color:#483d8b">'SCRIPT_NAME'</span>, <span style="color:#483d8b">''</span><span style="color:black">)</span>.<span style="color:black">strip</span><span style="color:black">(</span><span style="color:#483d8b">'/'</span><span style="color:black">)</span> + <span style="color:#483d8b">'/'</span>
- location = <span style="color:#008000">self</span>.<span style="color:black">router</span>.<span style="color:black">build</span><span style="color:black">(</span>routename, <span style="color:#66cc66">**</span>kargs<span style="color:black">)</span>.<span style="color:black">lstrip</span><span style="color:black">(</span><span style="color:#483d8b">'/'</span><span style="color:black">)</span>
- <span style="color:#ff7700"><strong>return</strong></span> urljoin<span style="color:black">(</span>urljoin<span style="color:black">(</span><span style="color:#483d8b">'/'</span>, scriptname<span style="color:black">)</span>, location<span style="color:black">)</span>
那么这个routename是哪里来的呢?看 route 装饰器的参数:
12
- <span style="color:#ff7700"><strong>def</strong></span> route<span style="color:black">(</span><span style="color:#008000">self</span>, path=<span style="color:#008000">None</span>, method=<span style="color:#483d8b">'GET'</span>, callback=<span style="color:#008000">None</span>, name=<span style="color:#008000">None</span>,
- apply=<span style="color:#008000">None</span>, skip=<span style="color:#008000">None</span>, <span style="color:#66cc66">**</span>config<span style="color:black">)</span>:
其中的name参数就是routename(这里不得不说一下,这种方式比flask要好些,要用才指定name,而不需要为了实现url_for,把整个框架都实现的很复杂)
所以看到这里大家也就明白了,bottle的url生成器是绑定在Bottle实例上的,所以跨实例访问默认是做不到的。
而可能由于bottle所推崇的micro化,所以其源码中特意对默认Bottle示例包装出了一个函数:
12345
- <span style="color:#ff7700"><strong>for</strong></span> name <span style="color:#ff7700"><strong>in</strong></span> <span style="color:#483d8b">''</span><span style="color:#483d8b">'route get post put delete error mount
- hook install uninstall'</span><span style="color:#483d8b">''</span>.<span style="color:black">split</span><span style="color:black">(</span><span style="color:black">)</span>:
- <span style="color:#008000">globals</span><span style="color:black">(</span><span style="color:black">)</span><span style="color:black">[</span>name<span style="color:black">]</span> = make_default_app_wrapper<span style="color:black">(</span>name<span style="color:black">)</span>
- url = make_default_app_wrapper<span style="color:black">(</span><span style="color:#483d8b">'get_url'</span><span style="color:black">)</span>
- <span style="color:#ff7700"><strong>del</strong></span> name
这样做的好处是,如果工程只用到默认的Bottle实例的话,在模板中就可以直接使用url,而不必再多传个Bottle实例进去。
更正一下,bottle的get_url是不能跨app调用的,比如被mount的app调用主app的get_url会错掉,因为此时的SCRIPT_NAME是当前页的path,所以拼装起来会乱掉,所以就不要尝试了。
但是怎么才能让模板能够访问到local变量呢?我们接下来介绍
二. 给模板指定默认的变量
因为笔者用的最多的是jinja2,所以模板相关的介绍都是以jinja2为例子.
由于bottle的很多实例都是使用的代理模式,如request,response,local,所以我们可以放心的将这些变量传入到模板默认变量里去。
代码也很简单:
1234567
- <span style="color:#ff7700"><strong>from</strong></span> bottle <span style="color:#ff7700"><strong>import</strong></span> BaseTemplate
- BaseTemplate.<span style="color:black">defaults</span>.<span style="color:black">update</span><span style="color:black">(</span><span style="color:#008000">dict</span><span style="color:black">(</span>
- request=request,
- local=local,
- <span style="color:black">)</span>
- <span style="color:black">)</span>
有兴趣的话,大家也可以去直接看一下源码,很好懂
三. 给模板增加filters
还是以jinja2为例,直接给出代码如下:
12345678910111213141516171819
- <span style="color:#ff7700"><strong>from</strong></span> bottle <span style="color:#ff7700"><strong>import</strong></span> BaseTemplate
- <span style="color:#ff7700"><strong>if</strong></span> <span style="color:#483d8b">'filters'</span> <span style="color:#ff7700"><strong>not</strong></span> <span style="color:#ff7700"><strong>in</strong></span> BaseTemplate.<span style="color:black">settings</span>:
- BaseTemplate.<span style="color:black">settings</span><span style="color:black">[</span><span style="color:#483d8b">'filters'</span><span style="color:black">]</span> = <span style="color:black">{</span><span style="color:black">}</span>
- filters = BaseTemplate.<span style="color:black">settings</span><span style="color:black">[</span><span style="color:#483d8b">'filters'</span><span style="color:black">]</span>
- <span style="color:#ff7700"><strong>def</strong></span> urlencode_filter<span style="color:black">(</span>params<span style="color:black">)</span>:
- <span style="color:#483d8b">''</span><span style="color:#483d8b">'
- urlencode
- '</span><span style="color:#483d8b">''</span>
- <span style="color:#ff7700"><strong>from</strong></span> <span style="color:#dc143c">urllib</span> <span style="color:#ff7700"><strong>import</strong></span> urlencode
- <span style="color:#ff7700"><strong>return</strong></span> urlencode<span style="color:black">(</span>params<span style="color:black">)</span>
- filters.<span style="color:black">update</span><span style="color:black">(</span><span style="color:#008000">dict</span><span style="color:black">(</span>
- urlencode=urlencode_filter,
- <span style="color:black">)</span>
- <span style="color:black">)</span>
OK,一共就是这些,这里基于的bottle版本是 0.10.9,如果有不相符的地方,请查看bottle版本。
- BOTTLE的高级技巧
- BOTTLE的高级技巧
- Bottle高效开发的几点技巧
- Gradle的高级技巧
- Gradle的高级技巧
- CSS 的高级技巧
- Gradle的高级技巧
- Gradle的高级技巧
- bottle的几个小坑
- PHP的十个高级技巧
- PHP的十个高级技巧
- GridView的高级应用技巧
- PHP的十个高级技巧
- Oracle的SQL高级技巧
- 编写控件的高级技巧
- 共享数据的高级技巧
- 病毒的高级编写技巧
- 所谓的javascript高级技巧
- Android自定义控件实战——下拉刷新控件终结者:PullToRefreshLayout
- [深度分析] Python Web 开发框架 Bottle
- 改变视图后,如何找回菜单项。
- CI服务器Jenkins中添加clearcase插件
- 构造函数
- BOTTLE的高级技巧
- 自定义控件实战高级实用篇 ,仿淘宝商品浏览界面,图书阅读器平滑翻页,滚动选择器
- STL array的max_size方法(14)
- Python 扩展中的Py_BuildValue()函数
- functools.wraps
- gridview控件实现行变色
- POJ 1523 SPF (无向图求割点)
- What does functools.wraps do?
- 智能电视主界面设计演变及开发工具发展