当前位置: 首页 > 工具软件 > web.py > 使用案例 >

webpy —— 简单直接的 python web 框架

鲁华灿
2023-12-01

初学笔记

webpy是python基础的web框架,上手简单,基本上有15分钟左右就可以初步了解并写一些简单的demo。但是使用中会发现有一些不够完善的地方。本文作为学习笔记,对其简单介绍。

1.安装
一般安装了pip的话可以直接pip安装

$ sudo pip install web.py
$ sudo pip install flask

ubuntu可以使用apt安装

 $ sudo apt install python-webpy

2.简介

## ==========================================================================
## 主函数部分:
## ==========================================================================
if __name__ == "__main__":
## 1.设置 Hander
urls = (
  '/cmd/(.*)', 'CmdHander'     ##当报文头为http://x.x.x.x:xxx/cmd/*(all)时,调用CmdHander类中的函数
)
app = web.application(urls, globals())

## 2.设置监听
# ========================================================================
# webpy默认使用8080端口,如果需要改端口需要在执行.py文件时加参数
# 例如:python xxxx.py 8888
# 下面的做法,相当于将参数在代码中写入
#=========================================================================
sys.argv.append("8888")
app.run()

## ==========================================================================
## 实现请求处理部分
## ==========================================================================
## 定义处理cmd命令的类
class CmdHander: 
  ## 定义 get 方法
  def GET(self, name):
    ## name 是cmd/命令后的子命令 例如x.x.x.x:8080/cmd/test  ---->  name = 'test'
    ## return 将结果直接返回调用方
    return xxx
  ## 定义 post 方法
  def POST(self,name):
    print name      #同样 name 是cmd/命令后的子命令,如果x.x.x.x:8080/cmd/test/123  ---->  name = 'test/123'
    print web.data()    ## web.data()是接收到的post的参数 
    print type(web.data())  ## 类型是字符串
    #--------------------------------------------------------------------------------------
    # 1.使用 requests 方式调用 (import requests)
    #       r = requests.post('http://127.0.0.1:8888/cmd/test',{"aaa":123,"BBB":112})
    #   调用方获取返回值:
    #   r.status_code ----> 执行状态码(成功:200,失败:404/500/......)
    #   r.headers     ----> 返回头 例如:{'Transfer-Encoding': 'chunked', 'Date': 'Mon, 09 Jul 2018 08:25:25 GMT', 'Server': 'localhost'}
    #   r.text        ----> get/post 方法返回的值
    # 2.使用 urllib2 
    #   url='http://127.0.0.1:8888/cmd/test'
    #   headers = {'Content-Type': 'application/json'}
    #   request = urllib2.Request(url, headers=headers, data=json.dumps(data))
    #   response.code    ----> 执行状态码(成功:200,失败:404/500/......)
    #   response.headers ----> 返回头 
    #   response.read()  ----> get/post 方法返回的值
    #   更多可以通过dir(response)查看
    #________________________________________________________________________________________
    #   编码方式:
    # * 未编码,(直接使用curl 或 requests.post/request(url,data) = urllib2.Request(url, headers, data)的:
    #       web.data() = aaa=123&BBB=112  
    #     转换字典方式:dict(urlparse.parse_qsl(web.data()))
    # * 使用json编码的 :
    #     使用json.dumps 对 {"aaa":123,"BBB":112} 进行编码
    #     例如:requests.post/request(url,json.dumps(data)) 或 request = urllib2.Request(url, headers=headers, data=json.dumps(data))
    #       web.data() = "{"age": 13, "name": "mac"}" (json字符串)
    #     转换字典方式: dic =  json.loads(web.data())
    #---------------------------------------------------------------------------------------
    ## return 将结果直接返回调用方
    return "get"

3.关于并发
webpy 可以并发,也就是说当同时多次调get/post方法时,不会因为之前的请求耗时,未执行完而导致新的请求阻塞。
同步阻塞问题在 python tornado 框架中再继续学习。

4. demo

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# @ // sudo apt install python-webpy
# @ // sudo pip install web.py
# @ // sudo pip install flask
import web
import sys
import json
reload(sys)
sys.setdefaultencoding('utf-8')
import urlparse
import time

urls = (
  '/cmd/(.*)', 'hello'
)

app = web.application(urls, globals())

class hello:
  def GET(self, name):
    i = web.input(times=1)
    print " i: ",i
    if not name:
      name = 'world'
    print "int(i.times): ",int(i.times)
    for c in xrange(int(i.times)):
      print 'Hello,', name+'!'
    ret = 'Hello, ' + name + '!'
    time.sleep(10)
    return ret.encode("utf-8")

  def POST(self,name):
    print "============="
    print name
    print web.data()
    print type(web.data())
    if "=" in web.data():
      #print dict(urlparse.parse_qsl(web.data()))
      print urlparse.parse_qsl(web.data())
      dic = dict(urlparse.parse_qsl(web.data()))
      for key in dic:
        print "[",key,"] : ",dic[key]
    else:
      dic =  json.loads(web.data())
      for key in dic:
        print "[",key,"] : ",dic[key]
    return "get"


if __name__ == "__main__":
  sys.argv.append("8888")    # @ // 其实是在运行python文件的时候 加参数。
  app.run()
## 此测试,可通过浏览器打开http://127.0.0.1:8888/cmd/world检测
 类似资料: