简单而直接的Python web 框架:web.py

简介: 来源:https://www.oschina.net/question/5189_4306 web.py 是一个Python 的web 框架,它简单而且功能强大。web.py 是公开的,无论用于什么用途都是没有限制的。 先让大家感受一下web.py 的简单而强大: import weburls = ( '/(.*)', 'hello')clas

来源:https://www.oschina.net/question/5189_4306


web.py 是一个Python 的web 框架,它简单而且功能强大。web.py 是公开的,无论用于什么用途都是没有限制的。

先让大家感受一下web.py 的简单而强大:

import web

urls = (
    '/(.*)', 'hello'
)

class hello:
    def GET(self, name):
        i = web.input(times=1)
        if not name: name = 'world'
        for c in xrange(int(i.times)): print 'Hello,', name+'!'

if __name__ == "__main__": 
    web.run(urls, globals())
看看,上面就是一个基于web.py 的完整的Web 应用。不信?!将上面的代码保存为文件code.py,在命令行下执行 python code.py 。然后打开你的浏览器,打开地址: http://localhost:8080/RossWan ,看看结 果 :)没有意外的话(当然要先安装web.py,下面会有介绍),浏览器会显示“ Hello, RossWan! ”。这是一个最简单的Hello world Web 应用。是不是很简单?!下面将较为详细地介绍下web.py 。Find fun :)

1. 安装

单击这里下载web.py 的安装文件,将下载得到的文件web.py-0.21.tar.gz 解压,进入解压后的文件夹,在命令行下执行:python setup.py install,在Linux 等系统下,需要root 的权限,可以执行:sudo python setup.py install

安装完毕之后,就可以正式开始web.py 之旅…

2. URL 处理

对于一个站点来说,URL 的组织是最重要的一个部分,因为这是用户看得到的部分,而且直接影响到站点是如何工作的,在著名的站点如:del.icio.us ,其URLs 甚至是网页界面的一部分。而web.py 以简单的方式就能够构造出一个强大的URLs。

在每个web.py 应用,必须先import web 模块:

import web
现在,我们须要告诉web.py URL 如何组织,让我们以一个简单例子开始:
urls = (
  '/', 'index'    )

在上面的例子中,第一部分(‘/’)是一个匹配URL 的正则表达式,像/,/help/faq,/item/(\d+),等等;第二部分(‘index’)是一个类名,匹配的请求将会被发送过去。

现在,我们需要编写index 类。当大部人浏览网页的时候,他们都没有注意到,浏览器是通过HTTP 跟World Wide Web 通信的。通信的细节不太重要,但要明白一点,用户是通过URLs(例如 / 或者 /foo?f=1)来请求web 服务器完成一定请求的(例如 GET 或者POST)。

GET 是最普遍的方法,用来请求一个页面。当我们在浏览器里输入“harvard.edu” 的时候,实际上它是向Web 服务器请求GET ”/“。另一个常见的方法是POST,常用于提交特定类型的表单,例如利用信用卡付费和处理一个订单。注意,GET URLs 能够被搜索引擎索引得到(想像一下Google 尝试购买你网站上的所用物品)。

在我们的web.py 代码中。我们清晰区分这两种方法:

class index:
    def GET(self):
        print "Hello, world!"

当接收到一个GET 请求时,上面的GET 方法将会被web.py 调用。

好的。现在,我们只需添加最后一行代码,让web.py 启动网页应用:

if __name__ == "__main__":
    web.run(urls, globals())

上面告诉web.py 如何配置URLs,以及找寻的类在文件中的全局命名空间。

整个code.py 文件的内容如下:

import web

urls = (
  '/', 'index'    )

class index:
    def GET(self):
        print "Hello, world!"

if __name__ == "__main__": 
    web.run(urls, globals())
注意到没有,虽然我说了很多东西,但实际上web 应用的代码就只得上面的几行,而且这是一个完整的web.py 应用。在你的命令行下输入:
$ python code.py
Launching server: http://0.0.0.0:8080/
现在,你的web.py 应用已经启动了服务器。通过浏览器访问 http://localhost:8080/  的话,会见到”Hello, world!“。在启动服务器的时候,你可以在 python code.py  后面添加IP 地址/端口 来控制web.py 启动的服务器。例如: python code.py 8888

3. 调试

web.py 本身也提供调试的工具。在最后的“if name …” 代码前面添加:

web.webapi.internalerror = web.debugerror
并在最后的“ if name … ” 添加” web.reloader “:
if __name__ == "__main__": 
    web.run(urls, globals(), web.reloader)

上面的代码会使你在调试的阶段得到更多有用的信息。web.reloader 其实是一个中间件,当你在运行时修改了code.py 文件后,web.reloader 会重新加载code.py 文件,让你在浏览器上立刻可以看到变化。如何有多何变化的话,还是需要重新启动服务器。web.py 也提供web.profiler ,可以输出有用的信息,有关每个页面的每个函数调用的次数,这用助于你改善代码。

4. 模板

在Python 里面编写HTML 代码是相当累赘的,而在HTML 里嵌入Python 代码则有趣得多。幸运地,web.py 使这过程变得相当容易。

注意:旧版本的web.py 是用Cheetah templates 模板的,你可以继续使用,但官方已不再提供支持。

在我们的web 应用里,添加一个新的文件夹用来组织模板文件(例如”/templates“)。然后再新建一个HTML 文件(例如:”index.html“):

<em>Hello</em>, world!
或者,你可以用web.py 的模板语言用编写这个HTML 文件:
$def with (name)

$if name:
    I just wanted to say <em>hello</em> to $name.
$else:
    <em>Hello</em>, world!

注意上面代码的缩进!

正如你所见的,上面的模板看上去跟这Python 文件很相似,以def with 语句开始,但在关键字前需要添加”$“。

注意:在模板内的变量,如果包含有HTML 标记,以$ 方式引用变量的话,HTML 标记只会以纯文本的显示出来。要想HTML 标记产生效果,可以用$: 引用变量。

现在,回到code.py 文件,在”import web” 的下一行添加:

render = web.template.render('templates/')

这告诉web.py 在哪里可以搜索得到模板目录。

提示:可在render 调用里添加cache = False 使得每次访问页面时都重载模板。

下面继续修改code.py 文件的GET 方法:

def GET(self):
    name = 'Bob'
    print render.index(name)

上面的”index“ 是模板的名字,”name“ 是传递过去的参数。

修改code.py 文件的urls 变量:

urls=(
    '/(.*)', 'index')

上面的“/(.*)” 是一个正则表达式。

再将GET 方法修改如下:

def GET(self,name):
    print render.index(name)

现在,访问”/“的话,会显示”Hello, world!“;访问”/Joe“ 的话,会显示”I just want to say hello to Joe“。

如果你想学习更多关于web.py templates 的话,可以访问templetor page

5. 数据库

注意:在你开始连接数据库之前,请先安装正确的数据库驱动。例 如,MySQL 使用MySALdb,Postgre 使用psycopg2

添加以下代码,则可以正确配置你的数据库:

web.config.db_parameters = dict(
    dbn='postgres',
    user='username',
    pw='password',
    db='dbname'
)

现在,先行在数据库里创建一个简单的表:

CREATE TABLE todo (
  id serial primary key,
  title text,
  created timestamp default now(),
  done boolean default 'f'
);
初始化一行:
INSERT INTO todo (title) VALUES ('Learn web.py');
回到code.py,修改 GET  方法如下:
def GET(self):
    todos = web.select('todo')
    print render.index(todos)
修改 urls  变量:
urls = (
    '/', 'index')
重新编辑index.html 文件如下:
$def with (todos)
<ul>
$for todo in todos:
    <li id="t$todo.id">$todo.title</li>
</ul>

现在,可以访问”/“,如果显示”Learn web.py“,则祝贺你成功了!

现在,再让我们看看如何向数据库写入。

在index.html 文件的尾部添加如下内容:

<form method="post" action="add">
   <p>
       <input type="text" name="title" />
       <input type="submit" value="Add" />
   </p>
</form>
修改code.py 文件的 urls  变量如下:
urls = (
    '/', 'index',
    '/add', 'add'
)
在code.py 里添加一个类:
class add:
    def POST(self):
        i = web.input()
        n = web.insert('todo', title=i.title)
        web.seeother('/')

web.input 使你能够方便地访问用户通过表单提交上来的变量。web.insert 用于向数据库的 “todo” 表插入数据,并且返回新插入行的ID。web.seeother 用于重转向到”/“。

提示:对于数据库的操作,还有web.transact(), web.commit(), web.rollback()web.update()

在web.py 里,还有web.inputweb.query 和其它的函数,返回”Storage objects”,可以像字典型类(dictionaries) 的使用。

6. 总结

web.py 的确相当的小巧,应当归属于轻量级的web 框架。但这并不影响web.py 的强大,而且使用起来很简单、很直接。在实际应用上,web.py 更多的是学术上的价值,因为你可以看到更多web 应用的底层,这在当今“抽象得很好”的web 框架上是学不到的 :) 如果想了解更多web.py,可以访问web.py 的官方文档

这篇教程到这里也要结束了,如果你对web.py 有兴趣,可以搜索更多关于web.py 的文档看看,你一定会发现更酷的东西。Have fun!


目录
相关文章
|
14天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【4月更文挑战第9天】本文对比了Python三大Web框架Django、Flask和Pyramid。Django功能全面,适合快速开发,但学习曲线较陡;Flask轻量灵活,易于入门,但默认配置简单,需自行添加功能;Pyramid兼顾灵活性和可扩展性,适合不同规模项目,但社区及资源相对较少。选择框架应考虑项目需求和开发者偏好。
|
1天前
|
XML Web App开发 测试技术
python的Web自动化测试
【4月更文挑战第16天】Python在Web自动化测试中广泛应用,借助Selenium(支持多浏览器交互)、BeautifulSoup(解析HTML/XML)、Requests(发送HTTP请求)和Unittest(测试框架)等工具。测试步骤包括环境搭建、编写测试用例、初始化浏览器、访问页面、操作元素、验证结果、关闭浏览器及运行报告。注意浏览器兼容性、动态内容处理和错误处理。这些组合能提升测试效率和质量。
11 6
|
2天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
19 1
|
2天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
11 1
Flask框架在Python面试中的应用与实战
|
5天前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
11 0
|
8天前
|
数据库 开发者 Python
Python中使用Flask构建简单Web应用的例子
【4月更文挑战第15天】Flask是一个轻量级的Python Web框架,它允许开发者快速搭建Web应用,同时保持代码的简洁和清晰。下面,我们将通过一个简单的例子来展示如何在Python中使用Flask创建一个基本的Web应用。
|
8天前
|
前端开发 数据挖掘 API
使用Python中的Flask框架进行Web应用开发
【4月更文挑战第15天】在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架。它简洁、灵活且易于扩展,使得开发者能够快速地构建出高质量的Web应用。本文将深入探讨Flask框架的核心特性、使用方法以及在实际开发中的应用。
|
9天前
|
关系型数据库 数据库 开发者
Python中的Peewee框架:轻量级ORM的优雅之旅
【4月更文挑战第13天】在Python的众多ORM框架中,Peewee以其轻量级、简洁和易于上手的特点,受到了许多开发者的青睐。Peewee的设计理念是“小而美”,它提供了基本的ORM功能,同时保持了代码的清晰和高效。本文将深入探讨Peewee的核心概念、使用场景以及实战应用,帮助读者更好地理解和使用这一框架。
|
9天前
|
SQL API 数据库
Python中的SQLAlchemy框架:深度解析与实战应用
【4月更文挑战第13天】在Python的众多ORM(对象关系映射)框架中,SQLAlchemy以其功能强大、灵活性和易扩展性脱颖而出,成为许多开发者首选的数据库操作工具。本文将深入探讨SQLAlchemy的核心概念、功能特点以及实战应用,帮助读者更好地理解和使用这一框架。
|
11天前
|
网络协议 Java API
Python网络编程基础(Socket编程)Twisted框架简介
【4月更文挑战第12天】在网络编程的实践中,除了使用基本的Socket API之外,还有许多高级的网络编程库可以帮助我们更高效地构建复杂和健壮的网络应用。这些库通常提供了异步IO、事件驱动、协议实现等高级功能,使得开发者能够专注于业务逻辑的实现,而不用过多关注底层的网络细节。