1.本例采用postgresql数据库,创建数据表 user_tbl

create table user_tbl(name varchar(20),signup_date date);

2.webapi接口

(1)tornado框架配置 t_tornado.py

#-*- coding:UTF-8 -*-
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define,options
import t_url
import psycopg2
app=tornado.web.Application(t_url.url)
define("port",default=8000,help="run on port",type=int)
if __name__=="__main__":
tornado.options.parse_command_line()
app.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

(2)路径映射 t_url.py

from t_handler import *
url=[
(r'/',IndexHandler),
(r'/AddUser',AddHandler),
(r'/EditUser',EditHandler),
(r'/DelUser',DelHandler)
]

(3)处理类 t_handler.py

from tornado.web import RequestHandler
from tornado.escape import json_decode,json_encode
import psycopg2 #解决js跨域请求问题
class BaseHandler(RequestHandler):
def set_default_headers(self):
self.set_header('Access-Control-Allow-Origin', '*')
self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
self.set_header('Access-Control-Max-Age', 1000)
self.set_header('Access-Control-Allow-Headers', '*')
self.set_header('Content-type', 'application/json') #删除用户
class DelHandler(BaseHandler):
def post(self):
name=self.get_argument('name',None)
result={}
conn=psycopg2.connect(host='127.0.0.1',port=5432,user='leo',password='king',database='testdb')
cursor=conn.cursor()
try:
sqlstr="delete from user_tbl where name='%s'"%name
cursor.execute(sqlstr)
except(psycopg2.Warning,psycopg2.Error) as error:
result["result"]="DB Error:"+error.message
result["status"]="false"
result["code"]=300
self.write(json_encode(result))
conn.rollback()
cursor.close()
conn.close()
return
result["result"]="success"
result["status"]="true"
result["code"]=200
if(result["status"]=="true"):
conn.commit()
cursor.close()
conn.close()
self.write(json_encode(result)) #修改用户
class EditHandler(BaseHandler):
def post(self):
o_name=self.get_argument('o_name',None)
name=self.get_argument('name',None)
time=self.get_argument('time',None)
result={}
conn=psycopg2.connect(host='127.0.0.1',port=5432,user='leo',password='king',database='testdb')
cursor=conn.cursor()
try:
sqlstr="update user_tbl set name='%s',signup_date='%s' where name='%s'"%(name,time,o_name)
cursor.execute(sqlstr)
except(psycopg2.Warning,psycopg2.Error) as error:
result["result"]="DB Error:"+error.message
result["status"]="false"
result["code"]=300
self.write(json_encode(result))
conn.rollback()
cursor.close()
conn.close()
return
result["result"]="success"
result["status"]="true"
result["code"]=200
if(result["status"]=="true"):
conn.commit()
cursor.close()
conn.close()
self.write(json_encode(result)) #新增用户
class AddHandler(BaseHandler):
def post(self):
time=self.get_argument('time',None)
result={}
conn=psycopg2.connect(host='127.0.0.1',port=5432,user='leo',password='king',database='testdb')
cursor=conn.cursor()
try:
sqlstr="insert into user_tbl(name,signup_date) values('%s','%s')"%(name,time)
cursor.execute(sqlstr)
except(psycopg2.Warning,psycopg2.Error) as error:
result["result"]="DB Error:"+error.message
result["status"]="false"
result["code"]=300
self.write(json_encode(result))
conn.rollback()
cursor.close()
conn.close()
return
result["result"]="success"
result["status"]="true"
result["code"]=200
if(result["status"]=="true"):
conn.commit()
cursor.close()
conn.close()
self.write(json_encode(result)) class IndexHandler(BaseHandler):
def get(self):
conn=psycopg2.connect(host='127.0.0.1',port=5432,user='leo',password='king',database='testdb')
cursor=conn.cursor()
result={}
try:
sqlstr="select name,signup_date from user_tbl"
cursor.execute(sqlstr)
if(cursor.rowcount==0):
result["total"]=0
result["rows"]="no data."
result["status"]="false"
result["code"]=300
self.write(json_encode(result))
conn.close()
return
else:
res=cursor.fetchall()
content=[]
t=1
for item in res:
tempItem={}
tempItem["id"]=t
tempItem["name"]=item[0]
try:
tempItem["signup_date"]=item[1].strftime("%Y-%m-%d %H:%M:%S")
except:
tempItem["signup_date"]=''
t+=1
content.append(tempItem)
result["total"]=1000
result["rows"]=content
result["status"]="true"
result["code"]=200
except(psycopg2.Warning,psycopg2.Error) as error:
result["result"]="DB error:"+error.message
result["status"]="false"
result["code"]=300
self.write(json_encode(result))
conn.rollback()
conn.close()
return
if(result["status"]=="true"):
conn.commit()
conn.close()
print json_encode(result)
self.write(json_encode(result))

3.html请求

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<meta charset="utf-8" />
<script src="Scripts/jquery.min.js" type="text/javascript"></script>
<script src="Scripts/jquery.easyui.min.js" type="text/javascript"></script>
<link href="Css/easyui.css" rel="stylesheet" type="text/css" />
<script type="text/javascript">
var o_name;
var userUrl = "http://127.0.0.1:8000";
$(function () {
initUser();
$('#dri_grid').datagrid('load', userUrl);
$("#dri_tools_add").click(function() {
$("#n_name").val("");
$("#n_time").val("");
var a = document.getElementById('driver_add');
a.href = "javascript:driver_adddd()";
$("#adduser").show();
});
$("#dri_tools_edit").click(function() {
var row=$("#dri_grid").datagrid('getSelected');
if(row){
var name = row.name;
o_name = name;
var time = row.signup_date;
$("#n_name").val(name);
$("#n_time").val(time);
var a = document.getElementById('driver_add');
a.href = "javascript:driver_editdd()";
$("adduser").show();
}
else{
alert("please select");
}
$("#adduser").show();
});
$("#dri_tools_del").click(function() {
var row = $('#dri_grid').datagrid('getSelected');
if (row) {
if(confirm("really delete?")){
var t_name = row.name;
var datas = {
name: t_name
};
var driver_delurl="http://127.0.0.1:8000/DelUser";
$.post(driver_delurl, datas, function (v) {
if (v.status=="true") {
$("#dri_grid").datagrid("reload");
alert("success");
} else {
alert("error");
}
});
}
} else {
alert("please select");
}
});
});
function driver_adddd(){
var n_name = $("#n_name").val();
var n_time = $("#n_time").val();
var userdata = {
name: n_name,
time: n_time
};
var driver_addurl="http://127.0.0.1:8000/AddUser";
$.post(driver_addurl, userdata, function(s) {
if (s.status == "true") {
$("#dri_grid").datagrid("reload");
alert('新增成功');
} else {
alert(s.result);
}
});
}
function driver_editdd(){
var n_name = $("#n_name").val();
var n_time = $("#n_time").val();
var userdata = {
o_name:o_name,
name: n_name,
time: n_time
};
var driver_addurl="http://127.0.0.1:8000/EditUser";
$.post(driver_addurl, userdata, function(s) {
if (s.status == "true") {
$("#dri_grid").datagrid("reload");
alert('更新成功');
} else {
alert(s.result);
}
});
}
function initUser() {
$('#dri_grid').datagrid({
border: false,
fit: true,
singleSelect: true,
method: 'get',
pagination: true,
striped: true,
pageSize: 20,
onBeforeLoad: function() {
},
columns: [
[{
field: 'name',
title: 't_name',
width: '8%',
align: 'center'
}, {
field: 'signup_date',
title: 't_signup_date',
width: '14%',
align: 'center'
}
]
],
onLoadSuccess: function(data) {
}
});
}
</script>
</head>
<body>
<span id="dri_tools_add">
<a href="#" style="width: 100px">新增</a>
</span>&nbsp;&nbsp;
<span id="dri_tools_edit">
<a href="#" style="width: 100px">修改</a>
</span>&nbsp;&nbsp;
<span id="dri_tools_del">
<a href="#" style="width: 100px">删除</a>
</span>
<div id="adduser" style="display:none;">
<table style="padding-left: 4%; padding-right: 4%">
<tr>
<td>
<span style="color: red">*</span>
<label>姓名:</label>
</td>
<td style="padding-right: 80px; padding-bottom: 5px;">
<input id="n_name" style="width:100px;" type="text">
</td>
<td>
<label>注册时间:</label>
</td>
<td style="padding-bottom: 5px; width: 175px;">
<input id="n_time" style="width:100px;" type="text">
</td>
</tr>
</table>
<div><a id="driver_add" class="easyui-linkbutton" data-options="iconCls:'icon-ok'" href="javascript:void(0)" style="width: 120px">提交</a> </div>
</div>
<table id="dri_grid"></table>
</body> </html>

4.浏览器显示结果:

(1)查询

(2)新增

(3)修改

(4)删除

python tornado框架实现CRUD的更多相关文章

  1. Python Tornado框架(TCP层)

    Tornado在TCP层里的工作机制 上一节是关于应用层的协议 HTTP,它依赖于传输层协议 TCP,例如服务器是如何绑定端口的?HTTP 服务器的 handle_stream 是在什么时候被调用的呢 ...

  2. Python Tornado框架三(源码结构)

    Tornado 是由 Facebook 开源的一个服务器“套装”,适合于做 python 的 web 或者使用其本身提供的可扩展的功能,完成了不完整的 wsgi 协议,可用于做快速的 web 开发,封 ...

  3. python tornado框架使用

    处理方法 t_handler.py from tornado.web import RequestHandler class IndexHandler(RequestHandler): def get ...

  4. Python Tornado框架(ioloop对象分析)

    网上都说nginx和lighthttpd是高性能web服务器,而tornado也是著名的高抗负载应用,它们间有什么相似处呢?上节提到的ioloop对象是如何循环的呢?往下看. 首先关于TCP服务器的开 ...

  5. Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...

  6. python web框架——扩展Django&tornado

    一 Django自定义分页 目的:自定义分页功能,并把它写成模块(注意其中涉及到的python基础知识) models.py文件 # Create your models here. class Us ...

  7. python web框架——初识tornado

    一 Tornado概述 Tornado是FriendFeed使用的可扩展的非阻塞式web框架及其相关工具的开源版本.这个Web框架看起来有些像web.py或者Google的 webapp,不过为了能有 ...

  8. 异步非阻塞IO的Python Web框架--Tornado

    Tornado的全称是Torado Web Server,从名字上就可知它可用作Web服务器,但同时它也是一个Python Web的开发框架.最初是在FriendFeed公司的网站上使用,FaceBo ...

  9. Python自动化运维之31、Tornado框架

    Tornado 官网:http://www.tornadoweb.org/en/stable/ Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本. ...

随机推荐

  1. 从决策树学习谈到贝叶斯分类算法、EM、HMM --别人的,拷来看看

    从决策树学习谈到贝叶斯分类算法.EM.HMM     引言 最近在面试中,除了基础 &  算法 & 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法(当然,这完全 ...

  2. ubuntu 新系统需要做的事

    1 : 打开语言支持 开始补齐并且选择自己需要的语言包 . 2 : 搜索计算机 输入 update 找到软件更新器 更新软件库 . 然后打开ubuntu自带软件安装工具下载自己想要的软件(没有更新之前 ...

  3. PHP中的文件系统处理(一)

    PHP文件系统处理     所有文件处理都是使用系统函数完成的.     是基于Linux/Unix系统为模型        文件系统处理的作用:           1. 所有的项目离不开文件处理  ...

  4. C#泛型(二)

    <1>.泛型方法 以前文章说到用一个泛型类 SortHelper 来做一个冒泡排序的处理,下面回顾一下之前的代码: public class SortHelper<T> whe ...

  5. Unity3D ShaderLab 使用贴图对模型的高光进行遮罩

    Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的 ...

  6. WCF之多个协定

    多个协定”示例演示如何在一个服务上实现多个协定,以及如何配置终结点以便与实现的每个协定进行通信 1.服务端代码如下(服务实现了两个协定,增加了黄色所示代码): class Program { stat ...

  7. Java 反射 ParameterizedType 参数化类型

    /***************************************************************************************** * Java 反射 ...

  8. Qt5 QTableWidget设置列表自动适应列宽

    //设置自动适应列宽 ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

  9. TCP的分层结构

    TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂.开销不大的文件传输服务 ...

  10. UI学习笔记---第六天

    UIControl及其子类 UISegmentedControl的用法 UISegmentedControl是iOS中得分段控件,每个segment都能被点击,相当于集成了若干个button.通常我们 ...