资讯专栏INFORMATION COLUMN

基于Linux环境的Web.py框架介绍

caikeal / 3130人阅读

摘要:前言在文章基于环境搭建框架方法介绍中介绍了客户端和服务器的交互过程,服务器接收客户端的请求后,由应用服务器对浏览器的请求进行处理,将生成的响应传递给服务器,再由服务器返回给客户端。

前言

在文章《基于Linux环境搭建Nginx+uWSGI+Python框架方法介绍》中介绍了客户端和Web服务器的交互过程,Web服务器接收客户端的请求后,由Web应用服务器对浏览器的请求进行处理,将生成的响应传递给Web服务器,再由Web服务器返回给客户端。为了简化Web网站的开发,使开发者可以专注于编写业务逻辑代码而无需关心Web应用服务器内各模块连接之类的重复性工作,继而在Web应用服务器上产生了Web框架。一般Web框架的架构如下图所示,基于Python的Web框架如Django、tornado、flask、webpy等都在这个范围内进行不同的调整。


MVC模式

MVC是众所周知的Web框架设计模式,即将应用程序分解成model(模型)、view(视图)和 controller(控制器)三个组成部分。用户输入 URL,客户端发送请求,控制器(Controller)首先会拿到请求,然后用模型(Models)从数据库取出所有需要的数据进行必要的处理,将处理后的结果发送给视图(View),视图利用获取到的数据进行渲染生成 Html返回给客户端。MVC设计模式将业务逻辑、数据、界面显示分离,业务逻辑聚集到一个模块中,使得在更改界面时无需重新编写业务逻辑,提高网站的维护性。


Web.py框架

相较与大而全的Django框架来说非常轻量级的开源Python Web框架Web.py,它小巧灵活、简单并且强大,在使用时没有任何限制。目前Web.py被广泛运用于大型网站,如西班牙的社交网站Frinki、主页日平均访问量达7000万次的Yandex等。下面通过Get和Post实现例程来介绍下Web.py的应用。

1) web.py的安装

web.py下载地址:http://webpy.org/static/web.p...。解压并拷贝web.py-0.38文件夹到目录下运行:

python setup.py install(sudo python setup.py install)

2)Python例程——GET

在Web.py中URL的请求映射于urls元组中,元组结构第一部分为匹配URL的正则表达式,第二部分为接受请求的类名称。app= web.application(urls, globals())创建一个列举URL列表的应用,该应用会在文件的全局命名空间中查找对应类。如"/"完全匹配URLhttp://0.0.0.0:8080/;"/task/d"匹配"/task/"开头而后为任意1个数字的URL;"/(.*)"匹配"/"后任意内容作为参数返回,类中需有参数接收。

在Html代码中使用了Web.py支持的模板引擎Templetor,模板引擎的用途是使界面与数据分离,界面模板经过模板引擎的渲染后会生成最终的界面文件。如第一行$def with (name)定义了一个变量name;$name会用name的值来替换。

templates目录下存放.html模板文件,render = web.template.render("templates/") 生成render会从模板目录查找文件,render.hello(..)表示渲染 hello.html 模板。

当然Web.py也支持使用Jinja2模板引擎,由于Jinja2属于第三方库需要多带带安装,在py文件中执行render = render_jinja("templates",encoding = "utf-8")更换为Jinja2模板引擎,在html文件中可按照Jinja2支持的语法进行编写,这样就能使用jinja2模板引擎进行渲染。

Python代码:

import web 
render = web.template.render("templates/") 

urls = ( 
    "/",     "hello", #完全匹配
    "/task/d", "task", #模糊匹配
    "/(.*)",     "anyd"    #带组匹配 正则表达式(.*)匹配/后任意内容并作为参数返回,类中需有参数接收
) 

class anyd: 
    def GET(self,name): 
        i=web.input(name=None) 
        return render.index(name) 

class hello:
    def GET(self):
        return "Hello, world!"

class task:
    def GET(self):
        name="Bob"
        return render.index(name)

if __name__ == "__main__": 
    app = web.application(urls, globals()) 
    app.run()

html代码:

$def with (name)#定义了一个变量 name
$if name:
    I just wanted to say hello to $name.
$else:
    Hello, world!

将py文件保存为mywebpy.py,web.py内置了web服务器,运行后显示http://0.0.0.0:8080/即启动了服务器。在浏览器中输入http://127.0.0.1:8080会显示Hello,world!,在浏览器中输入http://127.0.0.1:8080/task/1会显示I just wanted to say hello to Bob, 在浏览器中输入http://127.0.0.1:8080/Tom显示I just wanted to say hello to Tom

注:在调试中ps查看web服务器进程ID,kill当前进程后才能重新启动服务器,否则会提示No socket could be created错误

3) Python例程——POST

Web.py中"web.form"模块支持表单的创建、校验和显示。该模块包含一个"Form"对象和各种输入框类如Textbox、Password 、Textarea 、Dropdown、Radio、Checkbox、Button等。 Form对象的validates方法可以验证Form对象中inputs是否有效。只有调用了validates方法,Form对象的各个inputs才会有相应的值,否则其值均为None。validates方法内部默认会使用web.input()来作为数据来源去验证,也可以使用source参数指定数据来源。同样可以使用Form对象中Validator来校验表单。以下例程中在填写表格Post提交后,如果password和password_again值相同,那么会显示"HAHA!",否则显示"Try again, Passwords didn"t match:"。

Python代码:

import web,os
from web import form
render = web.template.render("templates")
urls = (
    "/", "index",
)
app = web.application(urls, globals())

login = form.Form(
    form.Textbox("username"),
    form.Password("password"),
    form.Password("password_again"),
    form.Checkbox("YES"),
    form.Checkbox("NO"),
    form.Textarea("Moe"),
    form.Dropdown("SEX", ["man", "woman"]),
    form.Radio("time",["2012-01-01","20120101"]),        
    form.Button("Login"),
    validators = [form.Validator("Passwords didn"t match.", lambda i: i.password == i.password_again)]
)
   
class index:

    def GET(self):
        f=login()
        return render.formtest(f)
    def POST(self):
        f=login()
        if not f.validates():
            return render.formtest(f)

        else:
            return "HAHA!"

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

html代码:

$def with (form)
$if not form.valid:

Try again,Passwords didn"t match:

$:form.render()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41530.html

相关文章

  • tornado源码解析之IOLoop

    摘要:最大的特点就是其支持异步,所以它有着优异的性能。的代码结构可以在其官网了解,本文着重分析的实现。事件驱动模型的大致思路的方法用于启动事件循环。行文比较草率,如有错误和不足之处,敬请指正。 0. 简介 tornado是一个用Python语言写成的Web服务器兼Web应用框架,由FriendFeed公司在自己的网站FriendFeed中使用,被Facebook收购以后框架以开源软件形式开放...

    Lsnsh 评论0 收藏0
  • 献给正在学习python你,10个最受欢迎Python开源框架

    摘要:轻量级框架是一个轻量级框架,包含多维数据分析和浏览聚合数据等工具。创造矢量地图的轻量级框架是一个库,用来为生成地图。异步非阻塞的框架的全称是,传说中性能高高的框架。 如果你正在学习python,那么这10个开源框架,你可千万别错过,这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等。虽说不上是全都有,但也足够满足你了。 1.Django: Python Web应...

    Paul_King 评论0 收藏0
  • python借助web3py与以太坊区块链节点交互几种方式

    摘要:通信服务提供接口是如何与区块链交互的关键。这通常通过将请求提交给基于或套接字的服务器来完成。初始化时会发生自动检测有时,无法自动检测节点的位置。使用自动检测的示例一些节点提供超出标准的。是套接字的文件系统路径。 通信服务提供接口是web3如何与区块链交互的关键。接口接受JSON-RPC请求并返回响应。这通常通过将请求提交给基于HTTP或IPC套接字的服务器来完成。 如果你已经愉快地连接...

    booster 评论0 收藏0
  • python借助web3py与以太坊区块链节点交互几种方式

    摘要:通信服务提供接口是如何与区块链交互的关键。这通常通过将请求提交给基于或套接字的服务器来完成。初始化时会发生自动检测有时,无法自动检测节点的位置。使用自动检测的示例一些节点提供超出标准的。是套接字的文件系统路径。 通信服务提供接口是web3如何与区块链交互的关键。接口接受JSON-RPC请求并返回响应。这通常通过将请求提交给基于HTTP或IPC套接字的服务器来完成。 如果你已经愉快地连接...

    vboy1010 评论0 收藏0
  • 2018以太坊智能合约编程语言solidity最佳IDEs

    摘要:使用基于以太坊的智能合约的集成开发环境。以太坊教程,主要介绍智能合约与应用开发,适合入门。以太坊,主要是介绍使用进行智能合约开发交互,进行账号创建交易转账代币开发以及过滤器和事件等内容。 Solidity是一种以智能合约为导向的编程语言。这是一种只有四年的年轻语言,旨在帮助开发基于以太坊数字货币的智能合约。 理解它官方文档应该是学习Solidity的最佳来源:solidity.read...

    darkerXi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<