天天看點

web.py和postgres增删改查小例子

代碼結構

dmeo/
    demo.sql
    demo.py
    demo.html
    edit.html
           

demo.sql

/* 
 * CREATE DATABASE mydb TEMPLATE template0;  建立資料庫
 * psql mydb;  進入新建立資料庫
 * \i demo.sql 導入sql
 */
CREATE TABLE demo(
    email   varchar(128)    PRIMARY KEY,
    name    varchar(50)     NOT NULL,
    phone   varchar(11)
)
           

demo.py 運作python demo.py

# -*- coding: utf-8 -*-
import web
from web import form
import re

urls = ("/",        "index", 
        "/update/(.*)/", "update",
        "/delete/(.*)/", "delete",)

app = web.application(urls, globals())
render = web.template.render('', cache=False)   # 配置模闆路徑
db = web.database(host="127.0.0.1",dbn='postgres', db='mydb', user='postgres', pw='000000') # 資料庫連結 不寫host會出錯

# EMAIL 驗證
def is_email(email):
    p = re.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*")
    return p.match(email) != None

# 表單
demo_form = form.Form(
    form.Textbox("email", description="email"),
    form.Textbox("name", description="name"),
    form.Textbox("phone", description="phone"),
    validators = [
        form.Validator(u"email必填", lambda i: i.email),
        form.Validator(u"email格式錯誤", lambda i: is_email(i.email)),
        form.Validator(u"name必填", lambda i: i.name),]
)

class index:
    def GET(self):
        """查詢"""
        demoitems = db.select('demo')
        df = demo_form()
        return render.demo(demoitems, df)
    
    def POST(self):
        """增加"""
        demoitems = db.select('demo')
        df = demo_form()
        if not df.validates():
            return render.demo(demoitems, df)
        else:
            email = df.email.value
            name = df.name.value
            phone = df.phone.value
            db.insert('demo', email = email, name = name, phone = phone)
            web.seeother('/')

class update:
    """更新"""
    def GET(self, key):
        demo = db.select('demo',vars={"key":key}, where="email=$key")
        if len(demo):
            data = demo[0]
            df = demo_form()
            df.email.value = data.email
            df.name.value = data.name
            df.phone.value = data.phone
            return render.edit(df)
        else:
            web.seeother('/')
    
    def POST(self, key):
        df = demo_form()
        if not df.validates():
            return render.edit(df)
        else:
            email = df.email.value
            name = df.name.value
            phone = df.phone.value
            db.update('demo', vars={"key":key},
                              where="email=$key",
                              email = email,
                              name = name,
                              phone = phone)
            web.seeother('/')

class delete:
    """删除"""
    def GET(self, key):
        db.delete('demo',vars={"key":key}, where="email=$key")
        web.seeother('/')

if __name__ == "__main__":
    app.run()
           

demo.html

$def with(demoitems,form)
<hr />
<h2>INSERT</h2>
<form action="/" method="post">
$:form.render()
<input type="submit" value="submit">
</form>
<hr />
<h2>LIST</h2>
<table>
    <tr>
        <td>email</td>
        <td>name</td>
        <td>phone</td>
    </tr>
    $for demo in demoitems:
        <tr>
            <td>$demo.email</td>
            <td>$demo.name</td>
            <td>$demo.phone</td>
            <td>
                <a href="/update/$demo.email/" target="_blank" rel="external nofollow" >EDIT</a>
            </td>
            <td>
                <a href="/delete/$demo.email/" target="_blank" rel="external nofollow" >DELETE</a>
            </td>
        </tr>
</table>
           

edit.html

$def with(form)
<hr />
<h2>UPDATE</h2>
<form action="/update/$form.email.value/" method="post">
$:form.render()
<input type="submit" value="submit">
</form>