Python微框架web.py初印象

环境以及需要安装的软件以及模块

redhat 7.2 x86_64bit,IP:192.168.1.112
postgresql,psycopg2
web.py

!!!本文注重实际操作以及问题解决,理论自补

1、web.py安装测试

pip install web.py

对于pip的安装请参阅本人以前写过的博客

一个入门级web.py应用如下:

    import web
    #导入web.py模块
    urls = (
        '/', 'index'
        #这行表示我们要URL/(首页)被一个叫index的类处理。
    )

    class index:
        def GET(self):
            return "Hello, world!"
            #返回请求

    if __name__ == "__main__":
        app = web.application(urls, globals())
        #这会告诉web.py去创建一个基于我们刚提交的URL列表的application。这个application会在这个文件的全局命名空间中查找对应类。
        app.run()

在命令行中运行以上程序:

[[email protected] weeb]# python weeb.py 1234

好的习惯就是:对于各个项目要有自己的目录,并且易于区分

打开浏览器http://192.168.1.112:1234/,你会看到Hello, world!

2、使用模板

给模板新建一个目录(命名为 templates,与应用处于同一目录中),在该目录下新建一个以 .html 结尾的文件,如halo.html

模板文件的内容如下:

    $def with (name)
    #表示模板将从这后面取值
    $if name:
        I just wanted to say <em>hello</em> to $name.
    $else:
        <em>Hello</em>, world!

模板文件写好了,我们就要告诉应用去渲染了

在weeb.py的第一行之下添加:

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

修改下 URL 配置:

'/(.*)', 'index'

然后修改下 index.GET:

def GET(self, name):
    return render.halo(name)

render.halo的halo是模板,也就是html文件的名称!!!

现在访问 /lockey 看看,显示如下:
这里写图片描述

如果不手动输入名字显示如下:
这里写图片描述

3、简单的数据库操作

安装postgresql数据库请参阅本人博客 PostgreSQL Getting Started
安装数据库驱动模块:

pip install psycopg2

首先你需要创建一个数据库对象:

db = web.database(dbn='postgres', user='postgres', pw='redhat', db='test')

(根据自己的实际数据库状态,修改用户,密码,链接的数据库。 MySQL用户还需要把 dbn 定义改为 mysql。)

在你的库中创建一个简单的表:

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');

我们回来继续编辑weeb.py ,把 index.GET 改成下面的样子,替换整个函数:

def GET(self):
    todos = db.select('todo')
    return render.index(todos)

然后把URL列表改回来,只保留 /:

'/', 'index',

像这样编辑并替换 halo.html 的全部内容:

$def with (todos)
<ul>
$for todo in todos:
    <li id="t$todo.id">$todo.title</li>
</ul>

到目前为止weeb.py文件的内容如下:

import web
render = web.template.render('templates/')
db = web.database(dbn='postgres', user='postgres', pw='redhat', db='test')
urls = (
  '/', 'index'
)
app = web.application(urls, globals())
class index:
    def GET(self):
        todos = db.select('todo')
        return render.halo(todos)

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

运行应用然后测试数据库链接以及数据获取:
这里写图片描述

如果在这一步出现问题:

Traceback (most recent call last):
  File "weeb.py", line 2, in <module>
    import psycopg2
  File "/usr/lib64/python2.7/site-packages/psycopg2/__init__.py", line 50, in <module>
    from psycopg2._psycopg import (                     # noqa
ImportError: libpq.so.5: cannot open shared object file: No such file or directory

解决方法如下:

[[email protected] weeb]# find / -name libpq.so.5
/root/postgresql-9.6.4/src/interfaces/libpq/libpq.so.5
/usr/local/pgsql/lib/libpq.so.5
[[email protected] weeb]# ln -s /usr/local/pgsql/lib/libpq.so.5 /usr/lib
lib/     lib64/   libexec/ 
[[email protected] weeb]# ln -s /usr/local/pgsql/lib/libpq.so.5 /usr/lib/libpq.so.5
[[email protected] weeb]# ln -s /usr/local/pgsql/lib/libpq.so.5 /usr/lib64/libpq.so.5

from stackoverflow:

1: Know the path of libpq.so.5

find / -name libpq.so.5
Output example: /usr/pgsql-9.4/lib/libpq.so.5 If found nothing, check if you have already installed the suitable postgresql-libs for your postgresql version and your OS platform

2: Symbolic link that library in a "well known" library path like /usr/lib:

ln -s /usr/pgsql-9.4/lib/libpq.so.5 /usr/lib/libpq.so.5
Attention: If your platform is 64 bit, you MUST also symbolic link to 64 bit libraries path:

ln -s /usr/pgsql-9.4/lib/libpq.so.5 /usr/lib64/libpq.so.5
3: Be happy !

通过表单向数据中插入数据:

在 index.html尾部添加:

<form method="post" action="add">
<p><input type="text" name="title" /> <input type="submit" value="Add" /></p>
</form>

然后把你的URL列表改为:

'/', 'index',
'/add', 'add'

(你必须要非常小心那些逗号。如果你省略他们,Python会把所有字符串连接起来,变成 ‘/index/addadd’)

现在添加另一个类用来处理添加请求:

class add:
    def POST(self):
        i = web.input()
        n = db.insert('todo', title=i.title)
        raise web.seeother('/')

这个时候完整的weeb.py文件看起来是这样的:

import web
render = web.template.render('templates/')
db = web.database(dbn='postgres', user='postgres', pw='redhat', db='test')
urls = (
  '/', 'index',
  '/add', 'add'
)
app = web.application(urls, globals())
class index:
    def GET(self):
        todos = db.select('todo')
        return render.halo(todos)

class add:
    def POST(self):
        i = web.input()
        n = db.insert('todo', title=i.title)
        raise web.seeother('/')

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

模板文件看起来是这样的:

$def with (todos)
<ul>
$for todo in todos:
    <li id="t$todo.id">$todo.title</li>
</ul>
<form method="post" action="add">
<p><input type="text" name="title" /> <input type="submit" value="Add" /></p>
</form>

运行然后在浏览器中测试:
这里写图片描述

数据库测试:
这里写图片描述

4、form模块

详细用法可以参考http://webpy.org/form
以下为一个示例:

[[email protected] weeb]# cat weeb.py

import web
from web import form

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

urls = ('/', 'index')
app = web.application(urls, globals())

myform = form.Form( 
    form.Textbox("name",
        form.notnull,
        form.regexp('[A-Za-z0-9\-]+', 'Must be alpha or digit!'),
        form.Validator('Must be more than 5 characters!', lambda y:len(y)>5)), 
    form.Textbox("age", 
        form.notnull,
        form.regexp('\d+', 'Must be a digit'),
        form.Validator('Must be more than 5', lambda x:int(x)>5)),
    form.Textarea('descriptions'),
    form.Checkbox('hobby'), 
    form.Dropdown('french', ['mustard', 'fries', 'wine'])) 

class index: 
    def GET(self): 
        form = myform()
        # make sure you create a copy of the form by calling it (line above)
        # Otherwise changes will appear globally
        return render.halo(form)

    def POST(self): 
        form = myform() 
        if not form.validates(): 
            return render.halo(form)
        else:
            # form.d.boe and form['boe'].value are equivalent ways of
            # extracting the validated arguments from the form.
            return "Grrreat success! name: %s, age: %s" % (form.d.name, form['age'].value)

if __name__=="__main__":
    web.internalerror = web.debugerror
    app.run()

[[email protected] weeb]# cat templates/halo.html

$def with (form)

<form name="main" method="post"> 
$if not form.valid: <p class="error">Please correct the marked items and try again</p>
$:form.render()
<input type="submit" />    </form>

运行测试:
这里写图片描述
这里写图片描述
这里写图片描述

版权声明:本文为Lockey23原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Lockey23/article/details/78613690

智能推荐

1264页面推荐(中等 union all )稍微的难点在于找1的朋友

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200904233840843.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NTMxNTk0,size_16,color_FFFFFF,t...

单链表+单链表代码(链表最基础)

链表 链表是有顺序的表,在内存中存储: 链表是以节点的方式存储的 每个节点包括data域,next域:指向下一个节点 如图:发现链表的各个节点不一定是连续存放的,有跳跃的,不是连续存储 链表分为带头节点的链表和没有头结点的链表 添加: 1.先创建一个head头结点,作用就是单链表的头 2.后面每添加一个节点,就直接加入到链表最后 遍历: 代码 添加节点到链表里: 这里借助于temp节点,通过循环找...

Rtthread学习笔记(十三)RT-Thread Studio开启硬件看门狗Watchdog

一、开启硬件看门狗Watchdog 1、配置RT-Thread Settings 2、开启stm32f1xx_hal_conf.h中的宏定义 3.使用RT接口函数初始化硬件看门狗...

TYVJ 4864 天天去哪吃 || 清北学堂金秋杯大奖赛

题目描述: 记录一下i这个值上次出现的位置在哪里,就是pre...

java反编译

jvm 把Boolean类型的值flag当做int类型处理。​​​ Foo.java: 由 class 文件生成 jasm 文件:java -jar asmtools.jar jdis Foo.class > Foo.jasm  修改jasm文件: 执行反编译: java -jar jd-gui-1.6.6.jar File 打开Foo.class文件:b修改为2 重新执行java...

猜你喜欢

【学习笔记】03-v-html的学习和示例

v-html的认识和使用 示例: 显示结果: 注意:v-html是有复制的...

Java实现在线考试系统(系统介绍)

1.和现在有的考试系统有以下几种优势: a.和现在有的系统比较起来,本系统有科目、章节、老师、学生、班级等信息的管理,还有批阅试卷查看已批阅试卷等。传统的考试系统划分并不细,业务功能简单。 b.和学校的考试系统还有外面的考试系统比较起来,本系统是B/S结构,学校的考试系统一般为C/S结构,性能方面不如B/S结构,并且C/S接口需要安装客户端,客户端压力很大,我的系统只需要电脑具有浏览器,在同一局域...

计算机视觉--多视几何初步尝试

基础矩阵的原理 K和K’分别是两个相机的参数矩阵。p和p’是X在平面π的坐标表示。所以可以得出 具体计算过程 代码: #!/usr/bin/env python coding: utf-8 from PIL import Image from numpy import * from pylab import * import numpy as np from imp ...

java初学者怎么学习才可以快速入门

java初学者怎么学习才可以快速入门 一、了解JAVA 我们要知道:Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言。 Java之父:詹姆斯·高斯林 1.1 java的三个体系 Java SE(Java Platform Standard Edition)。Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境...

字段属性之主键&增删改查&自增长&唯一键约束

字段属性之主键&自增长&唯一键约束 主键 主键:primary key 主要的键 一张表中只有一个字段可以使用对应的键,用来唯一的约束该字段里面的数据,不能重复,这种称之为主键 一张表只能最多一个主键 增加主键 SQL操作中有多种方式增加主键大体分为三种 1.在创建表的时候直接在字段之后跟primary key关键字(主键本身不允许为空) 优点:非常直接:缺点:只能使用一个字段作为...