Wiki

Clone wiki

bottle-simple-todo / GudierFresher

Bottle初学者导引

snap/snap-full-v1.png

小白的痛苦

俺接触过很多想学习 Python 的小白:

  • 不论基础如何
  • 不论从什么技术投奔而来
  • 不论从什么教程/图书开始学起来

其实都经历了相同的痛苦:

  • 如何用Python 的思維来思考问题!
  • 几乎所有,用原先经验来套用到Python 上的尝试,都以挫败而告终...

最近接触到一本绝妙的入门图书:

  • 笨办法学 Python (Learn Python The Hard Way
  • 这才明白,越过这类痛苦,最有效,也是最快乐的方式就是以往在可爱的Python中吼的:用之!不学.
    • 保持空瓶心态,跟着教程,快速尝试各种案例,以最简洁的途径完成功能
    • 边干活,边用Python 来训练自个儿的Pythonic 感觉
    • 就酱!

如何开始?

Bottle: Python Web Framework 是发布不久的风头很劲的 微框架

  • 什么是框架?(Web Framework)
  • 什么是微框架?
  • 什么是Bottle? 和其它框架/微框架有什么不同? ...

各种基础/常识/立场/流派 的问题,俺这儿不准备回答,在没有对相关框架有深入 实践 前,这种讨论,是白给的,没有意义...

俺假定,读者有以下基础能力,以便开展阐述:

  1. E文1.618级水平,识字母,会查字典
  2. 操作系统初级,懂文件/目录,看得明白一般性的命令,知道点Linux和M$ 的系统差异
  3. 互联网初级,知道Google,会下载;明白什么是 http
  4. HTML 初级,懂HTML/CSS,明白怎么测试HTML代码,听说过IE6的杯具
  5. Python 小白,明白基础语法,知道怎么在交互式命令行环境中测试代码

嗯嗯嗯,看起来不少知识了,但是,这些都不知道的话,真没法儿看下去的...

Bottle 之于俺,最爽直的有:

  1. 单文件框架,可以直接包含到工程中,不用安装到系统Python 模块中,超级方便!
  2. 内置debug模式,可以用PHP/ASP等应用开发流程,不用重启服务,就可以边修订代码,边在网页中直观测试效果!
  3. URI管理,使用装饰符 和功能代码贴近在一齐,吻合 UNIX 编程艺术的要求

开始体验 Bottle 之前,估计只要知道一个默认要求:

  • 需要一个views目录来放置模板文件!

Hallo World

好的,一切从这里开始:

  1. 下载 Bottle ,将其中的 bottle.py 文件复制到一个新的空白工作目录中
  2. 创建 hallo.py 文件,并输入以下内容
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from bottle import *
@route('/')
def index():
    return 'Hallo World!'
run(host='127.0.0.1', port=8080,reloader=True)
  1. 然后,在命令行中运行 python hallo.py 应该可以见到:
$ python hallo.py
Bottle server starting up (using WSGIRefServer())...
Listening on http://127.0.0.1:8080/
Use Ctrl-C to quit.

用任意浏览器访问 http://127.0.0.1:8080/

  • 应该见到: snap/hallo-return.png
  • 而且,这时,再看命令行,应该可以见到不断的有运行日志输出

说明:

  1. Bottle 框架使用成功!
  2. 完成并发布了一个应用网站:
    • 该网站功能只有一个:"返回'Hallo World!'的字串"

需要理解的只有:

  1. run(host='127.0.0.1', port=8080,reloader=True) 表示,网站将发布在http://127.0.0.1:8080/
  2. @route('/') 表示,将响应:http://127.0.0.1:8080/**的请求
    • 技巧,在于,这里可以叠加声明!比如说:
@route('/index.html')
@route('/index.htm')
@route('/')
def index():
    # ...

表示,对于 / 或是 /index.html 以及 /index.hml 的请求,都将由 index() 函式负责接待 ;-)

简单模板

好吧,这样是无法使用 HTML 的各种操作来架构有动态交互的网站的! 所以,使用模板先!

  1. 创建子目录 views
  2. 在其中,创建模板文件 hallo.tpl,内容如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" lang="zh-CN">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
  <title>Hallo World</title>
</head>
<body>
<h1>= {{hallo}} =</h1>
</body>
</html>
  1. 修订原先 hallo.py 内容如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from bottle import *
@route('/')
def index():
    #return 'Hallo World!'
    return template('hallo.tpl'
        ,hallo="是也乎,是也乎!"
        )
debug(True)
run(host='127.0.0.1', port=8080,reloader=True)

再访问 http://127.0.0.1:8080/

  • 应该见到: snap/hallo-tpl.png

仅仅修订了四行代码,追加了一个模板,就完成了:

  1. 通过类 HTML 格式的模板,来输出最终页面,获得完备的HTML效果
  2. 通过模板中 {{hallo}} 变量,直接从Py 脚本中赋值,形成动态效果
  3. 打开调试模式(debug(True)),出错时,可以从页面中获得所有追踪信息,不用重启服务,可以继续修订代码改进!

数据交互

和一切动态应用网站一样, Simple-TODO 要求,在本地网站中,能够和用户交互,接受数据,并自动进行更新/展示

在Bottle 中,数据从一个页面流转到另外一个页面通常就两种形式:

  1. POST
  2. URI

前者通过表单提交,后者通过网址附加;

POST

假定模板中有表单,包含有名为 txtadd 的输入框

<form action="/add" method="POST">
<input type="text" name="txtadd" />
...

则,在表单提交后,根据 action="/add" 将提交到 http://127.0.0.1:8080/add 这一网址, 对应,处理脚本中,就可以:

@route('%s/add'%ini.urlprefix, method='POST')
def add():
    cnt = request.forms.get('txtadd')
  1. 声明针对POST方式响应
  2. 使用内置函式(request.forms.get('txtadd'))来获取数据

URI

假定模板中,预先组成了动态网址:

    |<a href="/edit/{{item['id']}}">修改</a>

则,点击后访问类似地址:http://127.0.0.1/add/3esdf4r324r324rdewq

@route('/edit/:itemid')
def edit(itemid):
    ...
  1. 函式的URI响应声明中用 /:itemid 来指代动态数据,注意,可以继续后缀多个
  2. 函式定义时,就可以直接将指代变量,作为函式参数接收进来!

URI设计?!

参考:

基于之前的4个练习,Bottle 框架其实已经足够用来创建各种实用网站了!

Simple-TODO 就是其中之一 !-)

不过,开始着手完成之前,推荐,先将所有功能对应的 URI 设计好,并想好所有数据变迁的关系和URI流程; 然后,再逐步实现,比边开发边想,要从容 ;-)

snap/zqbtodo-data-flow.png

开发习惯

好吧,一切都是俺的恶趣味,不分析成因了,就吼一下现在已经形成的直觉习惯:

一切 UTF8

  1. 源代码文本
  2. 源代码编码声明
  3. 硬件数据文件
  4. 网页编码声明
  5. URI/RPC...网络数据包编码
  6. 该死的可能的任何DB的数据 ... 总之,一切和应用相关的一切文本/数据,没有理由使用其它编码!

Leo

好的,这是推销,俺有一天感受到 文学化编程 的便利后, 就尽可能的在一切场合使用!

snap/leo-working.png

比较直觉的好处有::

  • 将文档和代码/模板等等在唯一界面统一管理
  • 可以将文档/代码以及任何文本以任意层次进行逻辑定义和管理
  • 可以快速重构,并保存各种中间代码,不必输出为真实脚本
  • 纯Py 作品,不依赖其它环境
  • ....

更多体验参考:

  1. LeoEnvironment - Woodpecker Wiki for CPUG
  2. 我的工具箱Leo

参考

有关 Bottle 有很多深度分析了,建议进一步挖掘阅读,在你有兴趣的前提下:

文档

Updated