commit/obp.RWPy4learner.v1: ream D: 推送 Jibo's ch05 第一节

13 views
Skip to first unread message

Bitbucket

unread,
May 29, 2012, 4:26:43 AM5/29/12
to zoomquiet...@gmail.com
1 new commit in obp.RWPy4learner.v1:


https://bitbucket.org/ZoomQuiet/obp.rwpy4learner.v1/changeset/63b1e7a93e2a/
changeset: 63b1e7a93e2a
user: ream D
date: 2012-05-29 03:11:15
summary: 推送 Jibo's ch05 第一节
affected #: 3 files

diff -r 124aa8aad8fb8be8387726d9bdd8cd20834bf540 -r 63b1e7a93e2a3e9f42ad0f40c5c1683844c207ca source/ch02/Function.rst
--- a/source/ch02/Function.rst
+++ b/source/ch02/Function.rst
@@ -221,7 +221,7 @@


带参数的函数,搜索联系人函数
----------------
+-----------------------------------
小白通过搜索引擎和行者们的帮助,完成了读取联系人文本文件的函数化。比较了一下原来的代码,和函数化后的代码,他发现,函数化使代码结构更清晰了。”恩!使用函数有挺多优势的。何不把其它功能,比如搜索联系人的代码块也函数化呢?这样我就不用每次查找联系人都重复这一大块代码了。”
于是,小白动手写搜索联系人的函数。他首先把搜索联系人的代码块缩进,使用"def SearchContact():"给这段代码取了一个函数名,叫做SearchContact。与前面两次函数化不同的是,小白希望能够把用户查询的联系人做为自变量输入函数。他隐约记得舅舅说过,函数括号里是放变量名的。于是,他把SearchQuery加到了自定义的函数中,这行代码变为了"def SearchContact(SearchQuery):"。下面是小白完成函数化后的通讯录软件。舅舅所言不虚,函数化后的程序果然结构更清楚易懂了。

@@ -280,7 +280,7 @@


保存联系人的函数
----------------
+--------------------------
在完成通讯录的函数化后,小白对自己学习 Python 的能力有了更多的自信。他决定进一步开发通讯录的功能。现在的通讯录,只有查询功能。但是他用过的其它通讯录软件都有新建联系人和更新联系人等功能。小白计划先给软件增加一个新建联系人功能。当查不到联系人时,提醒用户提供这个联系人的信息,然后保存到文本文件中。小白将这个新建联系人的函数取名为"CreateNewContact",定义这个函数的代码为 "def CreateNewContact():" 。当搜索联系人函数找不到联系人时,即"print "无此联系人""代码之后,调用CreateNewContact函数。

这个新建联系人的功能主要包括两部分。一是提示用户输入,二是将用户输入的联系人信息写入文件文件中。对于提示用户输入,可以使用NewContact = raw_input("输入新的联系人信息:")就可以了。 对于将信息写入文本文件,小白在上一节文本处理时已经有不少了解。使用fh = open('Contact.txt', 'w')是创建一个新的叫做Contact.txt文件。小白需要的是在已经存在的Contact.txt的末尾增加新的记录。小白回忆了学习文本处理时看到的帖子,更新已经存在的文本,应该使用'a'(append的英文缩写)这个参数,代码为"fh = open('Contact.txt', 'a')"。


diff -r 124aa8aad8fb8be8387726d9bdd8cd20834bf540 -r 63b1e7a93e2a3e9f42ad0f40c5c1683844c207ca source/ch02/index.rst
--- a/source/ch02/index.rst
+++ b/source/ch02/index.rst
@@ -1,6 +1,11 @@
-模块
+.. include:: ../LINKS.rst
+
+.. _chapter1index:
+
+ch02: 模块
============================================

+
小白给同学秀他的通讯录软件,却被同学逼视了! 命令行的通讯录实在太难用了。那么多参数,实在太难记住了! 难道就不能有个对话框,提示查询词语的参数吗?!




diff -r 124aa8aad8fb8be8387726d9bdd8cd20834bf540 -r 63b1e7a93e2a3e9f42ad0f40c5c1683844c207ca source/ch05/TryBottle.rst
--- a/source/ch05/TryBottle.rst
+++ b/source/ch05/TryBottle.rst
@@ -1,7 +1,4 @@
-.. include:: ../LINKS.rst
-
-
-初窥Bottle
+初窥Bottle
===================

目标回顾
@@ -9,57 +6,29 @@

小白想让自己的通讯录在自家电脑、学校电脑和手机上都能同步数据,于是就想做成一个网站,来存放自己的通讯录。

-小白用Google查了一下"python web",蹦一下跳出好多:
+小白用bing查了一下"python web",蹦一下跳出好多:

- - `PythonWeb框架`_ ,第 1 部分: 使用 Django 和 Python 开发 Web 站点
+ - Python Web 框架,第 1 部分: 使用 Django 和 Python 开发 Web 站点

- - `Python`_ web.py的简介
+ - [Python]web.py的简介

-点进去一看,原来django和web.py都是“框架”
+点进去一看,原来django和web.py都是“框架”。小白仔细读了一下搜索结果,发现除了django, web.py外,Python还有许多框架,如, bottle, tornado, flask等。python这么多框架,应该选什么框架呢?

-行者曰::

- 用Python作Web,用框架吧!简单又快速!
-
-
-框架是什么?
-
-框架
+选择框架
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

小白往后翻了几页,又发现了一个关键字“wsgi”。

-再查找“python wsgi”,找到了一个简单示范 `WSGI`_ ::
+再查找“python wsgi”,找到了一个wsgi的简单示范

- from wsgiref.simple_server import make_server
-
- # Every WSGI application must have an application object - a callable
- # object that accepts two arguments. For that purpose, we're going to
- # use a function (note that you're not limited to a function, you can
- # use a class for example). The first argument passed to the function
- # is a dictionary containing CGI-style envrironment variables and the
- # second variable is the callable object (see PEP 333).
- def hello_world_app(environ, start_response):
- status = '200 OK' # HTTP Status
- headers = [('Content-type', 'text/plain')] # HTTP Headers
- start_response(status, headers)
-
- # The returned object is going to be printed
- return ["Hello World"]
-
- httpd = make_server('', 8000, hello_world_app)
- print "Serving on port 8000..."
-
- # Serve until process is killed
- httpd.serve_forever()
-
+ .. literalinclude:: ../_static/src/wsgi.py

那么wsgi应该就是一种协议,我把代码写成这个样子,用上他的模块、函数、方法,就能发布咯!

不过小白看到这句::

- status = '200 OK'
-
+ status = '200 OK'

惊呼:虽然不知道是什么意思,但一看“OK”就知道这个函数是正常情况下显示什么内容,但是异常情况应该更多。
这里是200,那么404、403、500、505……总之1到n的都要自己写?
@@ -71,181 +40,78 @@
小白看到这句::

成熟的web框架应该有:基本HTTP请求处理、GET或POST数据的接受、模板、数据库、session等功能。
-

晕倒,这些都是什么东西啊?不过这样看来,框架的内容还是很丰富的,基本上是有什么直接调用就好了。

-坊间传说,很酷的框架 `Bottle`_ ,速度超快,超级轻巧,拥有一系列高级功能。
+坊间传说,很酷的框架bottle,速度超快,超级轻巧,拥有一系列高级功能。小白顺藤摸瓜,找到了bottle的老巢——http://bottlepy.org/,小白看到::

+Bottle is a fast, simple and lightweight WSGI micro web-framework for Python.

-安装
+Bottle是一个快速,简单又轻量的Python的WSGI迷你web框架……真的?
+
+
+看到了bottle这些优点,小白有些心动。他决定用bottle框架来开发网页版本的通讯录。
+
+
+安装Bottle 框架
----------------------------
+在正式学习Bottle之前,首要任务就是安装Bottle。在学习网站开发前,小白已经有了比较丰富的python开发经验。安装一个Python的第三方库很简单。只用easy_install 加上框架名就可以了。

-小白顺藤摸瓜,找到了bottle的老巢—— http://bottlepy.org/,小白看到::
+安装一个先。::

- Bottle is a fast, simple and lightweight WSGI micro web-framework for Python.
- Bottle是一个快速,简单又轻量的Python的WSGI迷你web框架……
-
-
-真的?安装一个先。::
-
- easy_install -U bottle
+ easy_install bottle

亦或直接下载代码::

https://github.com/defnull/bottle/raw/master/bottle.py

+安装完Bottle后,小白发现,Bottle的源代码只有一个文件,两千多行。这么小的框架,应该很容易学习吧。 Bottle果然轻巧,却包括了大部分web框架的功能。

-竟然可以使用2to3转化为在python3下使用!

-小白还是使用2.x版的

-发现:只有一个文件,两千多行,果然轻巧阿,却包括了大部分web框架的功能
-
-以前小白只知道有web.py这种轻便框架,也没有bottle这么小阿!
-
-找文档
+找Bottle文档
---------------------------

小白发现官网是英文版本,找来找去都没有找到中文版

于是上列表吼,“有没有Bottle的中文版文档呀?”。有行者说,“Bottle的文档早就翻译好了。到下面的链接看看吧。”

-- http://pro.yeeyan.org/bottle08/articles
+* http://pro.yeeyan.org/bottle08/articles

原来,热心行者早就翻译了呢!

-热身
+
+简单的Hello, World程序
-------------------------------
+根据以前的学习经验,小白决定,先写一个"Hello, World"的程序,以了解Bottle的基本功能。

-小白的目的很单纯:热身
-
-试用一下这个框架。
-
+小白Bottle的文档里抄到了一个简单的代码,取名为index.py。代码如下:
::

- from bottle import route, run
- @route('/:name')
- def index(name='World'):
- return '<b>Hello %s!</b>' % name
- run(host='localhost', port=8080)
+ from bottle import route, run

-纯粹从文档里面抄来的。一个可用的网站将将5行就构建好了,爽!
+ @route('/')
+ def index():
+ return '<b>Hello World!</b>'

-为了方便阅读,同时也能够加强理解,小白吧from语句换成了import语句。
+ run(host='localhost', port=8080)

- .. literalinclude:: ../../src/5_webmala/web1/TryBottle.py

-
-其中:
- @装饰器,相当于 `index=bottle.route(index)` ,一个很好的特性
- 这里起到URL映射的作用。
- 而且在 `Bottle`_ 中, URL映射是可以堆叠的,这里使用了两个 `bottle.route` 装饰器;
- 分别捕获两种情况:
-
- - http://localhost:8080/
- - http://localhost:8080/myname
-
-
-在上面的代码中::
-
- run(host='localhost', port=8080)
-
-这一段run函数就是发布应用。其中,
-`host='localhost'`是以本机做为服务器(host)。
+小白看了一下这段代码,似乎显示Hello程序,只用5行代码。第一行导入Bottle的route和run函数。第二行"@route('/')",不太清楚它的功能。不过根据route(路由)的意思,小白猜测,它可以是起URL映射的作用。第三和四行是一个显示Hello World的函数。第五行运行这段代码,run(host='localhost', port=8080)这一段run函数就是发布应用。其中,host='localhost'是以本机做为服务器(host)。
port就是发布端口,随便设一个四位数字就行了,我们这里设置为8080。


-
-GET
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-程序中index函数接受了一个GET参数
-
-常常在URL后面看到以‘?’开头的长长的字符串,以&隔开,这就是GET参数
-
-
-运行and调试
+运行和调试
-----------------------------

-进入目录后,`python TryBottle.py` 一下,输出一大堆东西::
-
- Bottle server starting up (using WSGIRefServer())...
- Listening on http://localhost:8080/
- Use Ctrl-C to quit.
-
-根据说明访问 http://localhost:8080
-
-呀,报错
-
-.. image:: ../_static/snap/malaweb_error.png
-
-
-怎么搞得!
-
-依据bottle.route('/:name')这一句,发现url后面必须要跟一串字符
-
-访问
-
-http://localhost:8080/RWPyL
-
-done!出现结果。
-
-.. image:: ../_static/snap/TryBottle.png
-
-
-装饰器故事
----------------------------
-
-装饰器这玩意儿,到底是怎么回事?
-
-上Google搜索一下“python 装饰器”,得出以下结果::
-
-
- def Func(func):
-
- def Function():
- print('hello,world!')
- return func
- return Function
+根据Bottle文档的指示,进入网站代码所在的目录后,运行python index.py就可以启动网站服务器了。小白在命令行中看到了如下的信息,表示启动服务器成功。::
+ hejibo@ubuntu:~/bottle$ python index.py
+ Bottle server starting up (using WSGIRefServer())...
+ Listening on http://localhost:8080/
+ Hit Ctrl-C to quit.


-这就是一个装饰器的原型。可以这么来看,装饰器就是给函数添油加醋,和“类继承”有一些相似之处。
+上面的信息表示,在浏览器地址栏输入http://localhost:8080/就可以访问网站了。 小白在浏览器中看到了“Hello World!”。小白对Bottle的精巧和易学习非常满意,短短五行代码,就可以写一个基本的网页。

-上面的装饰器,就是把一个函数func(不是函数的返回值)传进去,在Function函数中加一些东西(添加了print语句),
-然后再运行原来函数的内容(return func),最后将Function(也就是经过加工的func)作为返回值传出来。这样,
-func就变成了Function,虽然他还叫func。
+小白决定,进一步深入学习Bottle,以开发一个基本Bottle的网站通讯录。

-如何对函数进行装饰?::
-
- @Func
- def run():
- printf('Hi, world')
-
- run()
-
-输出::
-
- hello,world!
- Hi,world
-
-
-
-
-调试技巧
----------------------------
-
-声明为调试状态,并配置运行参数,允许自动重启::
-
- bottle.debug(True)
- bottle.run(host='localhost', port=8080, reloader=True) #发布
-
-
-将发生神奇的事情:
-
-- 每当我们修订源代码后
-- `Bottle`_ 将自动发觉,并重启自身!
-- 而我们可以直接到浏览器中刷新,见到成果 ;-)
-
-.. image:: ../_static/snap/ch05-bottle-reload.png
-

Repository URL: https://bitbucket.org/ZoomQuiet/obp.rwpy4learner.v1/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
Reply all
Reply to author
Forward
0 new messages