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>&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)删除

时间: 2024-10-15 14:43:04

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

Python Tornado框架(TCP层)

Tornado在TCP层里的工作机制 上一节是关于应用层的协议 HTTP,它依赖于传输层协议 TCP,例如服务器是如何绑定端口的?HTTP 服务器的 handle_stream 是在什么时候被调用的呢?本节聚焦在 TCP 层次的实现,以便和上节的程序流程衔接起来. 首先是关于 TCP 协议.这是一个面向连接的可靠交付的协议.由于是面向连接,所以在服务器端需要分配内存来记忆客户端连接,同样客户端也需要记录服务器.由于保证可靠交付,所以引入了很多保证可靠性的机制,比如定时重传机制,SYN/ACK 机

Python Tornado框架(ioloop对象分析)

网上都说nginx和lighthttpd是高性能web服务器,而tornado也是著名的高抗负载应用,它们间有什么相似处呢?上节提到的ioloop对象是如何循环的呢?往下看. 首先关于TCP服务器的开发上节已经提过,很明显那个三段式的示例是个效率很低的(因为只有一个连接被端开新连接才能被接受).要想开发高性能的服务器,就得在这accept上下功夫. 首先,新连接的到来一般是经典的三次握手,只有当服务器收到一个SYN时才说明有一个新连接(还没建立),这时监听fd是可读的可以调用accept,此前服

python tornado框架使用

处理方法 t_handler.py from tornado.web import RequestHandler class IndexHandler(RequestHandler): def get(self): name=self.get_argument('name','world') self.write('hello '+name) class AddHandler(RequestHandler): def get(self): val1=self.get_argument('val1

Python Tornado框架的初步使用-hello,world

Tornado的搭建很简单,使用pip,或者下载源码均可.   我们先看一个最简单的程序: import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("<h1>Hello World<h1>") application = tornado.web.Application([(r"/&q

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

Tornado的全称是Torado Web Server,从名字上就可知它可用作Web服务器,但同时它也是一个Python Web的开发框架.最初是在FriendFeed公司的网站上使用,FaceBook收购之后便进行了开源. 作为Web框架,是一个轻量级的Web框架,类似于另一个Python web 框架Web.py,其拥有异步非阻塞IO的处理方式. 作为Web服务器,Tornado有较为出色的抗负载能力,官方用nginx反向代理的方式部署Tornado和其它Python web应用框架进行对

[转载]知乎技术方案初探——基于Python的Tornado框架

原文出处:http://nonfu.me/p/5935.html 知乎的整个网站架构图如下: 知乎技术方案 知乎是国内很少的使用Python开发的一个网站,也很多值得我们学习的地方,从知乎让我们也可以了解到一些新的WEB技术. 一.Python框架 知乎目前使用的是Tornado 框架.Tornado 全称Tornado Web Server,是一个用Python 语言写成的Web 服务器兼Web 应用框架,由 FriendFeed 公司在自己的网站FriendFeed 中使用,被faceboo

Python Web框架Tornado的异步处理代码示例

1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与另一个流行的Python web框架Django相比,tornado不提供操作数据库的ORM接口及严格的MVC开发模式,但可以提供基本的web server功能,故它是轻量级的:它借助non-blocking and event-driven的I/O模型(epoll或kqueue)实现了一套异步网络库,故它是高性能的. Tornado的轻量级+高性能特性使得它特别适用于提供web api的场合,

Python Web框架Tornado的异步处理代码演示样例

1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口及严格的MVC开发模式,但能够提供主要的web server功能.故它是轻量级的:它借助non-blocking and event-driven的I/O模型(epoll或kqueue)实现了一套异步网络库,故它是高性能的. Tornado的轻量级+高性能特性使得它特别适用于提供web api的场合

python web框架之Tornado的简单使用

python web框架有很多,比如常用的有django,flask等.今天主要介绍Tornado ,Tornado是一个用Python写的相对简单的.不设障碍的Web服务器架构,用以处理上万的同时的连接口,让实时的Web服务通畅起来.虽然跟现在的一些用Python写的Web架构相似,比如Django,但Tornado更注重速度,能够处理海量的同时发生的流量.接下来,就开始撸起来吧. 1.首先需要安装Tornado库: pip install tornado 2.新建一个python文件(dem