77范文网 - 专业文章范例文档资料分享平台

webpy(8)

来源:网络收集 时间:2019-04-21 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

Sample Web Form

Fill Out This Form

然后将 bin/app.py 改成这样:

1 import web 2 3 urls = ( 4 '/hello', 'Index' 5 ) 6 7 app = web.application(urls, globals()) 8 9 render = web.template.render('templates/') 10 11 class Index(object): 12 def GET(self): 13 return render.hello_form() 14 15 def POST(self): 16 form = web.input(name=\17 greeting = \18 return render.index(greeting = greeting) 19 20 if __name__ == \21 app.run()

都写好以后,重启 web 程序,然后通过你的浏览器访问它。

这回你会看到一个表单,它要求你输入“一个问候语句(A Greeting)”和“你的名字(Your Name)”,等你输入完后点击“提交(Submit)”按钮,它就会输出一个正常的问候页面,不过这一次你的URL 还是http://localhost:8080/hello,并没有添加参数进去。

在 hello_form.html 里面关键的一行

是

上面这些修改的目的,是将每一个页面顶部和底部的反复用到的“boilerplate”代码剥掉。这些被剥掉的代码会被放到一个单独的 templates/layout.html 文件中,从此以后,这些反复用到的代码就由 layout.html 来提供了。

上面的都改好以后,创建一个 templates/layout.html 文件,内容如下: $def with (content)

Gothons From Planet Percal #25

$:content

这个文件和普通的模板文件类似,不过其它的模板的内容将被传递给它,然后它会将其它 模板的内容“包裹”起来。任何写在这里的内容多无需写在别的模板中了。你需要注意$:content 的用法,这和其它的模板变量有些不同。 最后一步,就是将 render 对象改成这样:

render = web.template.render('templates/', base=\

这会告诉 lpthw.web 让它去使用 templates/layout.html 作为其它模板的基础模板。重启你的程序观察一下,然后试着用各种方法修改你的 layout 模板,不要修改你别的模板,看看输出会有什么样的变化。

为表单撰写自动测试代码

使用浏览器测试 web 程序是很容易的,只要点刷新按钮就可以了。不过毕竟我们是程序员嘛,如果我们可以写一些代码来测试我们的程序,为什么还要重复手动测试呢?接下来你要做 的,就是为你的 web 程序写一个小测试。这会用到你在《习题 47》学过的一些东西,如果你不记得的话,可以回去复习一下。 为了让 Python 加载 bin/app.py 并进行测试,你需要先做一点准备工作。首先创建一个 bin/__init__.py空文件,这样 Python 就会将 bin/ 当作一个目录了。(在《习题 52》中你会去修改 __init__.py,不过这是后话。)

我还为 lpthw.web 创建了一个简单的小函数,让你判断(assert) web 程序的响应,这个函数有一个很合适的名字,就叫 assert_response。创建一个 tests/tools.py 文件,内容如下:

1 from nose.tools import * 2 import re 3 4 def assert_response(resp, contains=None, matches=None, headers=None, 5 status=\ 6 7 assert status in resp.status, \

8 (status, resp.status) 9 10 if status == \11 assert resp.data, \12 13 if contains: 14 assert contains in resp.data, \does not contain %r\% 15 contains 16 17 if matches: 18 reg = re.compile(matches) 19 assert reg.matches(resp.data), \does not match %r\% matches

if headers:

assert_equal(resp.headers, headers) 准备好这个文件以后,你就可以为你的 bin/app.py 写自动测试代码了。创建一个新文件,叫做tests/app_tests.py,内容如下:

1 from nose.tools import * 2 from bin.app import app 3 from tests.tools import assert_response 4 5 def test_index(): 6 # check that we get a 404 on the / URL 7 resp = app.request(\ 8 assert_response(resp, status=\ 9 10 # test our first GET request to /hello 11 resp = app.request(\12 assert_response(resp) 13 14 # make sure default values work for the form 15 resp = app.request(\16 assert_response(resp, contains=\17 18 # test that we get expected values 19 data = {'name': 'Zed', 'greet': 'Hola'} 20 resp = app.request(\21 assert_response(resp, contains=\22 最后,使用 nosetests 运行测试脚本,然后测试你的 web 程序。

$ nosetests

.

----------------------------------------------------------------------

Ran 1 test in 0.059s OK

这里我所做的,是将 bin/app.py 这个模块中的整个 web 程序都 import 进来,然后手动运行这个 web 程序。lpthw.web 有一个非常简单的 API 用来处理请求,看上去大致是这样子的:

app.request(localpart='/', method='GET', data=None, host='0.0.0.0:8080',

headers=None, https=False)

你可以将 URL 作为第一个参数,然后你可以修改修改 request 的方法、form 的数据、以及 header 的内容,这样你无须启动 web 服务器,就可以使用自动测试来测试你的 web 程序了。

为了验证函数的响应,你需要使用 tests.tools 中定义的 assert_response 函数,用法属下:

assert_response(resp, contains=None, matches=None, headers=None, status=\

把你调用 app.request 得到的响应传递给这个函数,然后将你要检查的内容作为参数传递给诶这个函数。你可以使用 contains 参数来检查响应中是否包含指定的值,使用status 参数可以检查指定的响应状态。这个小函数其实包含了很多的信息,所以你还是自己研究一下的比较好。

在 tests/app_tests.py 自动测试脚本中,我首先确认 / 返回了一个“404 Not Found”响应,因为这个 URL 其实是不存在的。然后我检查

了 /hello 在 GET 和 POST 两种请求的情况下都能正常工作。就算你没有弄明白测试的原理,这些测试代码应该是很好读懂的。

花一些时间研究一下这个最新版的 web 程序,重点研究一下自动测试的工作原理。确认你理解了将bin/app.py 做为一个模块导入,然后进行自动化测试的流程。这是一个很重要的技巧,它会引导你学到更多东西。

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库webpy(8)在线全文阅读。

webpy(8).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/608157.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: