tornado api 简单模板

# 安装

pip insatll tornado

# 主文件 web_server.py

#!/usr/bin/env python
# encoding: utf-8

import tornado.httpserver
import tornado.options
import tornado.web
from tornado.options import define,options
import sys,os,re
from apicode import Apicode

reload(sys)
sys.setdefaultencoding(‘utf-8‘)

# 定义默认调用端口为8088
define("port",default=8088,help="run on the given port",type=int)

# 验证码演示demo
class VcodeHandler(tornado.web.RequestHandler):
    # get 请求
    def get(self):
        result = self.get_argument("result",{})
        city = self.get_argument(‘city‘, u‘重庆‘)
        self.render("input_code.html", city=city, result=result)

    # post 请求
    def post(self):

        result = {‘code‘:0 , ‘msg‘: ‘success‘, ‘result‘: ‘‘}

        # 获取参数
        city = self.get_argument(‘city‘, ‘CQ‘)
        method = self.get_argument(‘method‘, ‘LR‘)
        detail = eval(self.get_argument(‘detail‘, False))
        imgUrl = self.get_argument(‘imgUrl‘, ‘‘)
        imgFile = self.request.files.get(‘imgfile‘, [])
        fname = ‘‘

        # url 方式
        if imgUrl and re.search(‘.+\.(jpg|png|bmp|gif)‘, imgUrl):
            fname = ‘./static/uploads/%s‘ % imgUrl.split(‘/‘)[-1]
            result[‘result‘]= vcode.predict_url(city, imgUrl, detail, method)

        # 上传文件方式
        elif imgFile:
            for img in imgFile:
                with open(‘./static/uploads/‘ + img[‘filename‘], ‘wb‘) as fw:
                    fw.write(img[‘body‘])
                fname = ‘./static/uploads/‘ + img[‘filename‘]
                result[‘result‘] = vcode.predict(city, fname, detail, method)
        else:
            errorMsg = "上传验证码图片文件错误或url图片格式不正确"
            result[‘code‘] = ‘-1‘
            result[‘msg‘] = errorMsg

        self.render("output_code.html", city=city, source=fname, detail=detail, method=method, result=result)

# 验证码调用api
class VcodeApiHandler(tornado.web.RequestHandler):

    def get(self):
        result = {‘code‘: 1000 , ‘msg‘: ‘调用参数错误, 请用post方式请求, city & imgfile 参数‘, ‘result‘: ‘使用说明: http://gitlab.tangees.com/miaoweihong/verify-code‘}
        json_result = tornado.escape.json_encode(result)
        self.write(json_result)

    def post(self):

        result = {‘code‘: 0 , ‘msg‘: ‘success‘, ‘result‘: ‘‘}
        city = self.get_argument(‘city‘, ‘CQ‘)
        method = self.get_argument(‘method‘, ‘LR‘)
        detail = eval(self.get_argument(‘detail‘, False))

        imgFile = self.request.files.get(‘imgfile‘, [])
        if imgFile:
            for img in imgFile:
                with open(‘./static/uploads/‘ + img[‘filename‘], ‘wb‘) as fw:
                    fw.write(img[‘body‘])
                fname = ‘./static/uploads/‘ + img[‘filename‘]
                try:
                    result[‘result‘] = vcode.predict(city, fname, detail, method)
                except Exception as e:
                    result[‘code‘] = 1001
                    result[‘msg‘] = ‘上传文件内容有误‘ + str(e)
        else:
            result[‘code‘] = 1002
            result[‘msg‘] = ‘没有文件内容‘
        # 返回json结果
        json_result = tornado.escape.json_encode(result)
        self.write(json_result)

class TestHandler(tornado.web.RequestHandler):
    def get(self):
        self.write(‘hello, jkmiao‘)

if __name__ == "__main__":

    # 引入自行定义的模块
    vcode = Apicode()
    tornado.options.parse_command_line()

    app = tornado.web.Application(
        handlers = [(r‘/vcode‘,VcodeHandler), (r‘/vcodeapi‘, VcodeApiHandler)], # url匹配
        template_path = os.path.join(os.path.dirname(__file__),"templates"),  # 定义视图页面地址,放 html文件
        static_path = os.path.join(os.path.dirname(__file__), "static"),   # 定义静态模板,放 css,js等文件
        debug=True,   # 是否为debug模式
        autoescape=None, # 不设置转义字符
        )
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    print "starting tornado at port http://127.0.0.1:%d" % options.port
    tornado.ioloop.IOLoop.instance().start()

搞定!

时间: 2024-10-24 21:16:55

tornado api 简单模板的相关文章

Web API 简单示例

原文:Web API 简单示例 一.RESTful和Web API Representational State Transfer (REST) is a software architecture style consisting of guidelines and best practices for creating scalable web services. REST is a coordinated set of constraints applied to the design o

vB SendMessage API 简单用法

vB SendMessage API 简单用法 1. 在Windows编程中,向文本框控件.列表控件.按钮控件等是我们最常接触的控件了.但是在VB中这些控件有时无法实现我们的需要.在这时,我们只要简单的利用Windows API函数就可以扩充这些控件的功能了.顾名思义,SendMessage函数就是向窗口(这里的窗口指的是向按钮.列表框.编辑框等具有hWnd属性的控件)发送消息的函数,该函数的定义如下:Declare Function SendMessage Lib "user32"

Spring Boot基础-RESTfull API简单项目的快速搭建

Spring Boot基础教程1-Spring Tool Suite工具的安装 Spring Boot基础教程2-RESTfull API简单项目的快速搭建 Spring Boot基础教程3-配置文件详解:Properties和YAML Spring Boot基础教程4-配置文件-多环境配置 Spring Boot基础教程5-日志配置-logback和log4j2 源码地址:https://github.com/roncoo/spring-boot-demo 一.搭建一个简单的RESTfull

PHP自写简单模板引擎,供新手学习

今天要写点小东西,突然想到要用模板引擎.就"随手"写了一个,发上来供新手学习.搞了这么久PHP,想想也真是感慨,当年研究了几天的东西现在一两个小时就弄完了,当年一起完耍的女神现在已经不知所踪了...咳咳,下面是代码: <?php /**************** * @author: 一曲忧伤 * @email: [email protected] * @discription: 简单模板引擎 */ class view { var $tpl_dir = 'template';

Berkeley DB的常见API简单分析

1.用来存储类信息的数据库不要求能够存储重复的关键字    例:    dbConfig.setSortedDuplicates(false);2.DatabaseEntrt能够支持任何能够转化为bytes数组形式的基本数据.包括java基本类型和可序列化的对象(getBytes转换为UTF-8编码,可以不转)    例:    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8")); Berkeley DB的常

基于C语言libvirt API简单小程序

libvirt API简单小程序 1.程序代码如下 #include<stdio.h> #include<libvirt/libvirt.h> int getDomainInfo(int id) { virConnectPtr conn = NULL; virDomainPtr dom = NULL; virDomainInfo info; conn = virConnectOpenReadOnly(NULL); if (conn == NULL) { fprintf(stderr

salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)

Streaming API参考链接: https://trailhead.salesforce.com/en/modules/api_basics/units/api_basics_streaming https://resources.docs.salesforce.com/210/latest/en-us/sfdc/pdf/api_streaming.pdf 背景:工作中我们有可能会有这样相关的需求:某些数据很重要,需要实时监控是否有变化,或者某些数据在其他的平台有集成.如果有变化,不刷新页

常用函数式接口与Stream API简单讲解

常用函数式接口与Stream API简单讲解 Stream简直不要太好使啊!!! 常用函数式接口 Supplier<T>,主要方法:T get(),这是一个生产者,可以提供一个T对象. Consumer<T>,主要方法:void accept(T),这是一个消费者,默认方法:andthen(),稍后执行. Predicate<T>,主要方法:boolean test(T t),这是一个判断者,默认方法:and():且,or():或,negate():非. Functio

敌兵布阵 (线段树简单模板题)

https://vjudge.net/contest/318019#problem C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视. 中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向