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. js 中 setInterval 的返回值问题

    var i = 0; var timer = setInterval(function() { i++ console.log(i); //alert(1); }, 2000); alert( typ ...

  2. SecureCRT下的串口无法输入

    用串口配置交换机的时候,出现的问题: 用secureCRT建了一个串口COM1后,连接上开发板后,可以正确接受和显示串口的输出,但是按键输入无效. 解决方法: Session Options -> ...

  3. Ubuntu 14.10 下awk命令详解

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  4. error C3163: “_vsnprintf”: 属性与以前的声明不一致

    这是在vs2008中遇到的错误,vs2008以前没有,vs2008以后的vs也没有. c:\program files\microsoft visual studio 9.0\vc\include\s ...

  5. 排版字号对应多少pt

    各字号对应多少pt?初号= 42pt: 小初号= 36pt: 一号= 26pt: 二号= 22pt: 小二号= 18pt: 三号= 16pt: 四号= 14pt: 小四号= 12pt: 五号= 10. ...

  6. Zipper_DP

    Description Given three strings, you are to determine whether the third string can be formed by comb ...

  7. CODEVS1073 家族 (并查集)

    一道裸的并查集,练练手不错. program CODEVS1073; var i,j,m,n,q,x,y,k1,k2,z:longint; f:..] of longint; function fin ...

  8. bold, big, blink

  9. 一个for列出横纵坐标

    h = i % * hCount; v = Math.floor(i / hCount);

  10. JAVA 遍历文件夹下的所有文件

    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...