webpy 的常规使用与踩过的坑

1,359 阅读3分钟

在使用python做网站的时候首先接触的就是webpy了,这个框架小巧简单,对于小型的网络应用功能足以了,在使用的过程中也遇到过一些总是,在这里也记录总结一下

基础的框架搭建

安装

pip install web.py -i https://pypi.douban.com/simple

hello world

import web
urls = ("/.*", "hello")
app = web.application(urls, globals())
class hello:
    def GET(self):
        return 'Hello, world!'
if __name__ == "__main__":
    app.run()

return 可以返回字符串也可以返回字典,不过直接返回字符串不是一个很好的网页习惯,如果是对外提供的api是很好的,但是如果是做的网页,最好还是将数据render(渲染)到模板中

使用GET或者POST接收数据

web.input() 既可以接收GET的数据,也可以接收POST过来的数据

web.data() 通过这个方法可以取到数据

import web
urls = ("/.*", "hello")
app = web.application(urls, globals())
class hello:
    def GET(self):
        return 'Hello, world!'
    def POST(self):
        username = web.input().get('username','')
if __name__ == "__main__":
    app.run()

模板的定义使用

import web
urls = ("/.*", "hello")
app = web.application(urls, globals())
class hello:
    def GET(self):
        return 'Hello, world!'
        
app_root = os.path.dirname(__file__) #定义根路径
templates_root = os.path.join(app_root, 'templates') #定义模板所在的路径
render = web.template.render(templates_root)
if __name__ == "__main__":
    app.run()

使用的时候用return render
如: return rende.index() 则需要在templates目录下创建一个index.html 这样访问

模板中使用渲染的数据

当有以下代码的时候

name = 'yangyanxing'
return render.index(name)

此时可以在index.html中使用渲染过来的name值

$def with(name_t)

  
  hello $name_t
  

$def with 必须写在首行,with里面有多少个参数,那个在之前的py文件中就需要render多少个参数,多了少了都不行,with里可以使用默认参数,这个和一般的函数定义是一样的。

中级使用

session的使用

  • session 可以使用文件的形式也可以存储在数据库中
import web
urls = ("/.*", "hello")
app = web.application(urls, globals())
store = web.session.DiskStore('sessions') #定义session使用文件存储方式
#定义session格式,使用本地存储,还可以使用数据库存储方式
if web.config.get('_session') is None:
    session = web.session.Session(app, store,)
    web.config._session = session
else:
    session = web.config._session
class hello:
    def GET(self):
        return 'Hello, world!'
        
app_root = os.path.dirname(__file__) #定义根路径
templates_root = os.path.join(app_root, 'templates') #定义模板所在的路径
render = web.template.render(templates_root,globals={'session': session}) #将session应用到模板中
if __name__ == "__main__":
    app.run()
  • session的赋值
username = 'yangyanxing'
session.realname = username
  • session的读取

    print session.realname

  • session在模板中的使用

    $def with (something)
    $session.realname
    

上面在定义

render = web.template.render(templates_root,globals={‘session’: session})

globals={'session': session} 这里如果定义成globals={'session_t': session} 那么在模板中使用session中也要使用`$session_t

模板布局的使用

有时候对于一个小型网站,它的header与footer是一样的,只是中间的内容不一样,那么可以定义一个模板,base.html包括了header与footer,其它模板在定义的时候只要引用这个模板就行了,这样做的好处也在于当修改base.html,不用修改每一个模板。
首先定义一个基础的模板,我这里就叫做base.html

$def with (content)





欢迎来到我们的世界



    
something here
$:content

© yangyanxing.com 2016

这里有两个要点 $def with (content) 这里的content可以随意写,而下面的$:content 则是别的模板文件内容,可以这样理解,当你再使用return render.index(name) 时,其实它是将index.html里的内容当成这里的content 这样也就实现了一个基础的模板,只更新里面的内容的效果。

定义完基础模板还不行,如果要使其生效还得在py文件中修改以下定义render的代码
render = web.template.render(templates_root,globals={'session': session},base='base')
这样定义render才能将base.html设置为基础模板

此时如果index.html中是以下的样子

$def with (name)
hello $name

那么当你有以下代码的时候

myname = 'yangyanxing'
return render.index(myname)

那么最终生成的html应该是






欢迎来到我们的世界



    
something here
hello yangyanxing

© yangyanxing.com 2016

高级使用(踩过的坑)

checkbox传过来多个值的时候数据的处理

有这种情况,有一个表单它的name值下面是checkbox,如以下的html


1
2
3
4
5


此时如果在py中处理如下

class Groupaddcase:
    def POST(self):
        caseids = web.input().get('caseids')
        print caseids

这样处理的话那么传过来的caseids只有一个,当你勾选了多个checkbox时也只有一个数据传过来,解决的办法是在接收的时候将其定义成数组

class Groupaddcase:
    def POST(self):
        groupinfo  =  web.input(caseids=[])
        groupid = groupinfo.get('groupid','')

这样groupid就以数组的形式保存了传过来的checkbox的值,多个checkbox可以定义多个数组
groupinfo = web.input(caseids=[],casenames=[])

添加一个hook来处理在所有请求前做的处理

有时会有这样的需求,需要屏蔽某一个IP的客户端访问或者在访问前需要检查一下是否登录了,这种情况下可以使用hook方法来控制

def __redirect():
    rejectIP = ['192.168.0.101']
    if web.ctx.ip in rejectIP:
        raise web.seeother(r'http://so.com')
        
if __name__ == "__main__":
    app.add_processor(web.loadhook(__redirect))
    app.run()

模板中使用python的逻辑处理方法

  • 判断

    $if condition:
        yes
    $else:
        no
    
  • 循环

    $for item in some_array:
        $item['title']

判断和循环的使用都要在前面加一个$,以: 结尾,且下面的语句也要遵守缩进规则

本文由 杨彦星 发表于 杨彦星的个人博客 ,采用「署名 4.0 国际」创作共享协议。
非商业转载请注明作者及出处。商业转载请联系作者本人。
本文标题为: webpy的常规使用与踩过的坑
本文链接为:www.yangyanxing.com/article/use…



------------------------------------------------------------------------------------------------------------------------------
Enjoy it ? Donate me ! 欣赏此文?求鼓励,求支持!
------------------------------------------------------------------------------------------------------------------------------