`
isiqi
  • 浏览: 16488406 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

web.py 进阶例程

阅读更多

web.py 的首页提供了一个 13 行的例子来演示如何开始一个应用,但其网站上似乎就没有别的更进一步的例子了。这两天简短学习了一下,写一个进阶例程。包括:读取 GET/POST 变量,以及模板的使用。

#!/usr/bin/python

import web

urls = (

 '/sample', 'sample',

 '/(.*)', '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+'!'

class sample:

 def _request(self):

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

 cache = False

 i = web.input(fname = 'yingbo', sname = 'qiu')

 #交换 fname, sname 的值

 firstName = i.sname

 surName = i.fname

 print render.sample(firstName, surName)

 def GET(self):

 self._request()

 def POST(self):

 self._request()

if __name__ == "__main__":

 import os

 os.environ['PHP_FCGI_CHILDREN'] = "1" #FastCGI 运行模式

 web.run(urls, globals())

模板:templates/sample.html

$def with (firstName, surName)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<title>dup2.net</title>

</head>

<body>

<form action="sample" method="post">

名:<input type="text" name="fname" value="$firstName" />

姓:<input type="text" name="sname" value="$surName" />

<input type="submit" value="提交" />

</form>

</body>

</html>

访问 http://www.dup2.net/papp/sample 就可以看到效果。这个 sample 可以接受 GET/POST 请求。参数为 fname sname。执行结果就是将这两个值交换显示。

web.py 每个 URL 请求分发到一个类。这里就把 sample 分发给 sample 类,其它的所有 URL 分发给 hello 类。访问一下 http://www.dup2.net/papp/ladf/badf?times=3 看看 hello 的效果。

HTTP GET POST 分别执行 class 里面的 method。使用 web.input() 来取得 request 参数和值。

然后用 web.template.render() 初始化模板目录。方法名 "sample" 对应的 "sample.html" 模板文件

申明一点,这里的例子都是基于 web.py 0.2 版本的。现在网上的 web.py 中文教程是基于 0.1 的,如果你看到的文章一开始说要安装什么 Cheetah,那肯定不适用现在的情况了。

首先说的是 Python MySQL,以及 UTF-8 字符集的事情。我这里假设你的应用是纯 UTF-8 的,而且使用 MySQL 4.1 以上的版本。

Python for MySQL 的连接扩展在 mysql-pythonDebian Sarge 的包里面是 1.2.1c2 版,是不支持 4.1 Charset 特性的,最新的 1.2.1_p2 版支持的很好,只不过从这个版本开始必须依赖 Python2.4 了。

当使用 mysql-python connect()的时候有两个重要参数,charsetuse_unicodecharset 就是指定连接以后 set names 的字符集;use_unicode 则指定 fetch result 的结果是用 'unicode string' or 'string' 类型 ? 由于最后输出的模板都是按照 string 来解析的,为了能正确运算,必须把这里设置成 0

web.py 类似 Java Servelet,可以在程序出错的时候抛出一大块异常;而且因为直接处理所有的 URL,所以它也内置一个自定义 url not found 的机制。

例子:首先是初始化部分的代码

def mynotfound():

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

 print render._404()

web.webapi.internalerror = web.debugerror

web.webapi.notfound = mynotfound

if __name__ == "__main__":

 import os

 os.environ['PHP_FCGI_CHILDREN'] = "1" #FastCGI 运行模式

 web.config.db_parameters = dict(dbn='mysql', user='webpy', pw='passwordofwebpy', \

 host='localhost',port=3306,db='club',charset='utf8',\

 use_unicode=0)

 web.run(urls, globals())


上面定义了新的 404 处理函数以及用 web.debugerror 代替原来的 500 处理函数,debugerror 可以抛出一个非常漂亮的异常页面。在 __main__ 函数里面设定了 mysql 的连接参数,这里连接到一个叫 club 的数据库

增加一个对所有以 'sample/' 开头的 URL 分发类 samples

urls = (

 '/sample', 'sample',

 '/sample/(.*)', 'samples',

 '/(.*)', 'hello'

 )

class samples:

 GET = web.autodelegate('GET_')

 POST = web.autodelegate('POST_')

 def show_signup(self, users):

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

 print render.signup(users)

 def GET_signup(self):

 users = web.select('user')

 self.show_signup(users)

 def POST_signup(self):

 i = web.input()

 web.insert('user',

 user_name=i.user_name,

 user_email=i.user_email,

 user_passport=i.user_passport)

 users = web.select('user')

 self.show_signup(users)

注意:这里用了 autodelegate ,来把 sample/abc GET 方法转到 GET_abc 方法去处理

运行实例:

访问 http://www.dup2.net/papp/sample/notfound 可以看到我自定义的 _404 输出结果

访问 http://www.dup2.net/papp/sample/signup可以执行我这里访问 MySQL 的例子.

我这里的 email 是设置成 unique key 的,这样可以在这个页面提交表单内容里面把 email 赋值为已经存在的 email,比如 spam@notinput-realemail-here.org,哈,就可以看到一个很帅的异常了..

分享到:
评论

相关推荐

    ADAU1701进阶例程:噪声处理

    ADAU1701进阶例程:噪声处理

    Arduino 例程详细教学30.咪头

    Arduino 例程详细教学30.咪头Arduino 例程详细教学30.咪头Arduino 例程详细教学30.咪头Arduino 例程详细教学30.咪头Arduino 例程详细教学30.咪头Arduino 例程详细教学30.咪头Arduino 例程详细教学30.咪头Arduino ...

    Arduino 例程详细教学1.Hello World

    Arduino 例程详细教学1.Hello WorldArduino 例程详细教学1.Hello WorldArduino 例程详细教学1.Hello WorldArduino 例程详细教学1.Hello WorldArduino 例程详细教学1.Hello WorldArduino 例程详细教学1.Hello ...

    ssd_detect.py

    ssd框架检测单张图片的例程,使用需修改路径

    3.kyLin-V3.2-OneNET-裸机-进阶例程.zip

    在压缩包中的"3.kyLin-V3.2-OneNET-裸机-进阶例程"文件夹里,包含了完整的代码示例和详细步骤,开发者可以跟随教程逐步实现设备与OneNET的对接。通过实践,加深对OneNET驱动程序的理解,提升物联网应用开发能力。 ...

    stm32标准例程库函数.zip_misc.h_startup_stm32 模板_stm32f10x v3.5.0_stm32标

    标准例程-V3.5库函数版本\keilkill.bat 标准例程-V3.5库函数版本\实验0 Template工程模板\CORE\core_cm3.c 标准例程-V3.5库函数版本\实验0 Template工程模板\CORE\core_cm3.h 标准例程-V3.5库函数版本\实验0 ...

    Arduino 例程详细教学13.温度传感器

    Arduino 例程详细教学13.温度传感器Arduino 例程详细教学13.温度传感器Arduino 例程详细教学13.温度传感器Arduino 例程详细教学13.温度传感器Arduino 例程详细教学13.温度传感器Arduino 例程详细教学13.温度传感器...

    工业自动化 TwinCAT3 OOP编程进阶例程

    《工业自动化 TwinCAT3 OOP编程进阶例程》是一个深入探讨TwinCAT3对象导向编程(OOP)技术的应用实例教程。在这个教程中,我们将深入理解如何利用TwinCAT3这一强大的自动化软件进行高效、模块化的编程。TwinCAT3是...

    Arduino 例程详细教学29.矩阵键盘

    Arduino 例程详细教学29.矩阵键盘Arduino 例程详细教学29.矩阵键盘Arduino 例程详细教学29.矩阵键盘Arduino 例程详细教学29.矩阵键盘Arduino 例程详细教学29.矩阵键盘Arduino 例程详细教学29.矩阵键盘Arduino 例程...

    Arduino 例程详细教学4.交通灯

    Arduino 例程详细教学4.交通灯Arduino 例程详细教学4.交通灯Arduino 例程详细教学4.交通灯Arduino 例程详细教学4.交通灯Arduino 例程详细教学4.交通灯Arduino 例程详细教学4.交通灯Arduino 例程详细教学4.交通灯...

    Arduino 例程详细教学3.流水灯

    Arduino 例程详细教学3.流水灯Arduino 例程详细教学3.流水灯Arduino 例程详细教学3.流水灯Arduino 例程详细教学3.流水灯Arduino 例程详细教学3.流水灯Arduino 例程详细教学3.流水灯Arduino 例程详细教学3.流水灯...

    Arduino 例程详细教学7.蜂鸣器

    Arduino 例程详细教学7.蜂鸣器Arduino 例程详细教学7.蜂鸣器Arduino 例程详细教学7.蜂鸣器Arduino 例程详细教学7.蜂鸣器Arduino 例程详细教学7.蜂鸣器Arduino 例程详细教学7.蜂鸣器Arduino 例程详细教学7.蜂鸣器...

    Arduino 例程详细教学8.模拟值

    Arduino 例程详细教学8.模拟值Arduino 例程详细教学8.模拟值Arduino 例程详细教学8.模拟值Arduino 例程详细教学8.模拟值Arduino 例程详细教学8.模拟值Arduino 例程详细教学8.模拟值Arduino 例程详细教学8.模拟值...

    Arduino 例程详细教学5.按键控制

    Arduino 例程详细教学5.按键控制Arduino 例程详细教学5.按键控制Arduino 例程详细教学5.按键控制Arduino 例程详细教学5.按键控制Arduino 例程详细教学5.按键控制Arduino 例程详细教学5.按键控制Arduino 例程详细教学...

    Arduino 例程详细教学6.抢答器

    Arduino 例程详细教学6.抢答器Arduino 例程详细教学6.抢答器Arduino 例程详细教学6.抢答器Arduino 例程详细教学6.抢答器Arduino 例程详细教学6.抢答器Arduino 例程详细教学6.抢答器Arduino 例程详细教学6.抢答器...

    Arduino 例程详细教学12.感光灯

    Arduino 例程详细教学12.感光灯Arduino 例程详细教学12.感光灯Arduino 例程详细教学12.感光灯Arduino 例程详细教学12.感光灯Arduino 例程详细教学12.感光灯Arduino 例程详细教学12.感光灯Arduino 例程详细教学12....

    Arduino 例程详细教学36.直流电机

    Arduino 例程详细教学36.直流电机Arduino 例程详细教学36.直流电机Arduino 例程详细教学36.直流电机Arduino 例程详细教学36.直流电机Arduino 例程详细教学36.直流电机Arduino 例程详细教学36.直流电机Arduino 例程...

    Arduino 例程详细教学14.倾斜开关

    Arduino 例程详细教学14.倾斜开关Arduino 例程详细教学14.倾斜开关Arduino 例程详细教学14.倾斜开关Arduino 例程详细教学14.倾斜开关Arduino 例程详细教学14.倾斜开关Arduino 例程详细教学14.倾斜开关Arduino 例程...

    Arduino 例程详细教学19.舵机控制

    Arduino 例程详细教学19.舵机控制Arduino 例程详细教学19.舵机控制Arduino 例程详细教学19.舵机控制Arduino 例程详细教学19.舵机控制Arduino 例程详细教学19.舵机控制Arduino 例程详细教学19.舵机控制Arduino 例程...

    Arduino 例程详细教学10.光控声音

    Arduino 例程详细教学10.光控声音Arduino 例程详细教学10.光控声音Arduino 例程详细教学10.光控声音Arduino 例程详细教学10.光控声音Arduino 例程详细教学10.光控声音Arduino 例程详细教学10.光控声音Arduino 例程...

Global site tag (gtag.js) - Google Analytics