Python web 框架:web.py

时间:2020-05-25
本文章向大家介绍Python web 框架:web.py,主要包括Python web 框架:web.py使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

From:https://www.oschina.net/question/5189_4306

Web.py github 地址:https://github.com/webpy/webpy        https://pypi.python.org/pypi/web.py

Web.py Cookbook 简体中文版:http://webpy.org/cookbook/index.zh-cn

web.py 0.3 新手指南:http://webpy.org/docs/0.3/tutorial.zh-cn

webpy 官网文档:http://webpy.org/

web.py 十分钟创建简易博客:http://blog.csdn.net/freeking101/article/details/53020728

一个简单的web.py论坛:http://www.cnblogs.com/russellluo/p/3240564.html

Web.py Cookbook 简体中文 https://webpy.org/cookbook/index.zh-cn

 1 import web # pip install web.py
 2 
 3 urls = (
 4     '/(.*)', 'index'
 5 )
 6 
 7 app = web.application(urls, globals())
 8 render = web.template.render('templates/')
 9 
10 '''
11 # 强制指定模版
12 render=web.template.frender("templates/index.html")
13 return render("Lisa")
14 
15 # 直接在代码中写出模版
16 template = "$def with (name)\nHello $name"
17 render = web.template.Template(template)
18 return render("Lisa")
19 '''
20 
21 class index:
22     def GET(self, name):
23         # i = web.input(name=None)
24         # return render.index(i.name)
25 
26         return render.index("Chidao")
27 
28 if __name__ == "__main__":
29     web.internalerror = web.debugerror  # 调试
30     app.run()
31 
32 # http://localhost:8080/
33 # python template.py port

上面就是一个基于web.py 的完整的Web 应用。将上面的代码保存为文件code.py,在命令行下执行python code.py。然后打开你的浏览器,打开地址:http://localhost:8080

修改默认端口:

在启动服务器的时候,如果你不想使用默认端口,你可以使用这样的命令来指定端口号: python code.py 8888

模版文件 index.html

 1 $def with (name)
 2 
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 4 <html xmlns="http://www.w3.org/1999/xhtml">
 5 <head>
 6     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 7     <title>Template</title>
 8 </head>
 9 <body>
10     Hi, $name
11 </body>
12 </html>

以def with 语句开始,但在关键字前需要添加”$“。

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

-- 模版含义:

在index.html第一行 $def with (name)表示本模板接受一个名为name的参数,也就是对应index类中return render.index(“Lisa”)中的Lisa。

而render=web.template.render(“templates”)表示创建一个模板对象,模板是存放于templates目录下,然后就可以用所创建的 render 对象来访问相应的模板

比如templates目录下的index.html就是用render.index来表示(实际上是匹配寻找index.*文件,第一个匹配的就认为是所对应的模板文件),如果templates下还有个a目录,a目录下有个pagea.html,那么访问这个pagea模板就要用render.a.pagea的形式了。

页面参数:

页面接收的参数可以多于一个,也可以没有,如果不需要参数,则就不需要$def with (name)这样的代码,删除掉这一句,同时修改模板中对name变量的引用,修改index类最后一句为return render.index()就可以了。

如果有参数,那么模板的第一行代码就必须是这个 $def with (…),可以多于一个参数,比如是这样$def with (gname, fname)。

模板下面的那行字改为Hi, $gname $fname。

同时Index类GET返回的时候赋予对应两个参数return render.index(“Lisa”,”Hayes”)。

这样,页面最后显示的是打印出Hi, Lisa Hayes的字样。

另外,模板接受的这个参数也可以是一个元组,比如像下面这样:return render.index((“Lisa”,”Hayes”))

在模板中可以如下以元组方式访问参数数据:Hi, $name[0] $name[1]

模板语法:

模板语法与python语法基本一致,主要差别可以从上面的代码中看到,要使用到$符号表明这不是文本而是模板代码。也就是每当用到程序代码、对象的时候就必须用$来与html代码和页面显示文本相区别。

对象赋值:

向对象赋值时需要在$与对象名之间留空格,如为一个名为vara的字符串对象赋值apple的代码为$ vara = “apple”。
另外,对象赋值语句必须独占一行,前面或后面有其他代码则会程序出错。

对象引用:

引用对象的时候直接使用 $+对象名的形式,如$vara。
另外引用对象时还可以用{}或()将对象进行明确的分组,如$(vara)s就会表示apples,如果没有括号,程序则会把 $varas作为一个整体,也就变成对varas对象的引用而发生错误。另如果像如下定义两个数字型对象:

$varb = 1

$varc = 2

然后希望计算两个值的和,如果用$varb+$varc的形式,页面上只会得到1+2而不是3,这时也就需要把两个对象放在括号里,如$(varb+varc)的形式才能得到正确答案3

注释:

模板中支持单行注释,以$#符号开始到行末都是注释内容。
$#This is comment
注释前面可以有其他内容,但是不可以有赋值代码。
如下代码是正确的:Hi $#This is comment
但下面的则会出错:$ vara = “apple” $#This is comment

打印$符号:

由于$符号在模板中有特殊用途,所以在页面上输出$时需要进行转义操作,用连续两个$表示在页面上输出一个$符号。

Can you lend me $50?

控制代码(循环、条件判断):

模板中支持for、while、if、elif、else,用法与在python一致,只是控制代码行要以$开始(包括break和continue命令),$开始的代码行中对象不需要在前面再加$符号,同时要注意缩进规则,如:

 1 $def with (toUser,fromUser,createTime,articleCnt,articles)
 2 <xml>
 3     <ToUserName><![CDATA[$toUser]]></ToUserName>
 4     <FromUserName><![CDATA[$fromUser]]></FromUserName>
 5     <CreateTime>$createTime</CreateTime>
 6     <MsgType><![CDATA[news]]></MsgType>
 7     <ArticleCount>$articleCnt</ArticleCount>
 8     <Articles>
 9         $for a in articles:
10             <item>
11                 <Title><![CDATA[$a['title']]]></Title>
12                 <Description><![CDATA[$a['desc']]]></Description>
13                 <PicUrl><![CDATA[$a['picUrl']]]></PicUrl>
14                 <Url><![CDATA[$a['url']]]></Url>
15             </item>
16     </Articles>
17 </xml>

if else判断:

$if times > max:
    Stop! In the name of love.
$else:
    Keep on, you can do it.

在for循环中,有一组内置的变量可以使用,非常方便,分别如下所示:

  • loop.index: 循环次数计数 (1-开始)
  • loop.index0: 循环次数计数(0-开始)
  • loop.first: 如果是第一次循环则为True
  • loop.last: 如果是最后一次循环则为True
  • loop.odd: 如果是第奇数次循环则为True
  • loop.even: 如果是第偶数次循环则为True
  • loop.parity: 如果循环次数为奇数值为“odd” ,反之为 “even”
  • loop.parent: 本循环的外层循环对象
1 $for a in ["a", "b", "c", "d"]: 
2     $loop.index,$loop.index0,$loop.first,$loop.last,$loop.odd,$loop.even,$loop.parity<br/>

将在页面上打印出:

1,0,True,False,True,False,odd
2,1,False,False,False,True,even
3,2,False,False,True,False,odd
4,3,False,True,False,True,even

原文地址:https://www.cnblogs.com/chidao/p/12957732.html