python tornado框架实现CRUD
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>
<span id="dri_tools_edit">
<a href="#" style="width: 100px">修改</a>
</span>
<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的更多相关文章
- Python Tornado框架(TCP层)
Tornado在TCP层里的工作机制 上一节是关于应用层的协议 HTTP,它依赖于传输层协议 TCP,例如服务器是如何绑定端口的?HTTP 服务器的 handle_stream 是在什么时候被调用的呢 ...
- Python Tornado框架三(源码结构)
Tornado 是由 Facebook 开源的一个服务器“套装”,适合于做 python 的 web 或者使用其本身提供的可扩展的功能,完成了不完整的 wsgi 协议,可用于做快速的 web 开发,封 ...
- python tornado框架使用
处理方法 t_handler.py from tornado.web import RequestHandler class IndexHandler(RequestHandler): def get ...
- Python Tornado框架(ioloop对象分析)
网上都说nginx和lighthttpd是高性能web服务器,而tornado也是著名的高抗负载应用,它们间有什么相似处呢?上节提到的ioloop对象是如何循环的呢?往下看. 首先关于TCP服务器的开 ...
- Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...
- python web框架——扩展Django&tornado
一 Django自定义分页 目的:自定义分页功能,并把它写成模块(注意其中涉及到的python基础知识) models.py文件 # Create your models here. class Us ...
- python web框架——初识tornado
一 Tornado概述 Tornado是FriendFeed使用的可扩展的非阻塞式web框架及其相关工具的开源版本.这个Web框架看起来有些像web.py或者Google的 webapp,不过为了能有 ...
- 异步非阻塞IO的Python Web框架--Tornado
Tornado的全称是Torado Web Server,从名字上就可知它可用作Web服务器,但同时它也是一个Python Web的开发框架.最初是在FriendFeed公司的网站上使用,FaceBo ...
- Python自动化运维之31、Tornado框架
Tornado 官网:http://www.tornadoweb.org/en/stable/ Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本. ...
随机推荐
- C#基础--面向对象计算器
static void Main(string[] args) { //new个对象 Calculator cal = new Calculator(); //做事情 cal.Run(); } /// ...
- php源码编译常见错误解决方案
在CentOS编译PHP5的时候有时会遇到以下的一些错误信息,基本上都可以通过yum安装相应的库来解决.以下是具体的一些解决办法: checking for BZip2 support… yes ch ...
- linux命令:rm
1.介绍: rm用来删除文件或者目录,对于链接文件,只删除了链接,不删除源文件.rm是一个非常危险的命令,像rm -rf /这个命令运行后,后果不堪设想. 2.命令格式: rm [选项] 文件/目录 ...
- Android获取图片资源的4种方式
1. 图片放在sdcard中 Bitmap imageBitmap = BitmapFactory.decodeFile(path) (path 是图片的路径,跟目录是/sdcard) 2. 图片在项 ...
- C#指针操作Marshal实例
static void Main(string[] args) { ,,,}; ,,,}; IntPtr pt = Marshal.AllocHGlobal(a.Length); //从source数 ...
- PHP CI框架email类发送邮件
用CI框架发送邮件类 在中文标题太长的情况下会出现乱码,搜索后说是发送邮件的时候有标题长度的限制,按说的方法修改后,还是没能得到解决,后来发现需要转换邮件标题的编码,解决方法如下: 打开 librar ...
- javascript:;与javascript:void(0)使用介绍
有时候我们在编写js过程中,需要触发事件而不需要返回值,那么就可能需要这样的写法 href=”#”,包含了一个位置信息.默认的锚是#top,也就是网页的上端,当连续快速点击此链接时会导致浏览器巨慢甚至 ...
- magento memcache缓存配置
在app/etc/local.xml <global>配置段中添加 cache段配置 <config> <global> <install> <d ...
- CSS 实现:文字水平垂直居中
☊ [实现要求]: <div class="demo1"> 标题1111 </div> √ [实现]: 方案一:普通布局 .demo1 { text-ali ...
- 一步一步理解word2Vec
一.概述 关于word2vec,首先需要弄清楚它并不是一个模型或者DL算法,而是描述从自然语言到词向量转换的技术.词向量化的方法有很多种,最简单的是one-hot编码,但是one-hot会有维度灾难的 ...