aiohttp web服务端(server)样例 (非client)
python版本 python3.6 (其他版本需要小改,版本>python3.4)
参考网址:https://www.cnblogs.com/ameile/p/5589808.html asyncio创建协程解析——分析廖雪峰的Python教程之创建WEB服务
本实例接收 字符串类型值 ;
客户端发送过来的数据类型都是字符串,不能为二进制流(折衷方式可base64编码成字符串)。
import os
import re
import sys
import time
import json
import socket
import base64
import logging
import asyncio
import aiohttp
import datetime
from config import *
from aiohttp import web
from urllib.request import urlopen
from mlogging import TimedRotatingFileHandler_MP ip = str(sys.argv[2])
conn = aiohttp.TCPConnector(limit=1000)
session = aiohttp.ClientSession(connector=conn) log_name = os.path.join('./log','log_http.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh = TimedRotatingFileHandler_MP('./log/log_http.log', 'D', 1, CYCLE_TIME)
fh.setFormatter(formatter)
log = logging.getLogger('http_recv')
log.setLevel(logging.DEBUG)
log.addHandler(fh) def b2base(b):
b = base64.b64encode(b)
b = str(b)
b = b[2:len(b)-1]
return b
async def downloadurl(dic):
try:
Prior = str(dic['Prior'])
FileId = str(dic['FileId'])
AppId = str(dic['AppID'])
except:
return 400
if len(Prior.strip()) == 0 or len(FileId.strip()) == 0 or len(AppId.strip()) == 0:
return 401
try:
if len(dic['FileUrl'].strip()) > 0 and len(dic['File'].strip()) > 0:
return 402
except:
pass
try:
if len(dic['FileUrl'].strip()) > 0:
try:
Resp = urlopen(dic['FileUrl'],timeout=5)
File = Resp.read()
except socket.timeout as e:
return 404
except:
return 403
except:
return 400
AppId = AppId + str(datetime.datetime.now().strftime('%Y-%m-%d'))
FileName = FileId + '_' + AppId + '_'
return FileName + b2base(File) async def deal_error(code):
if code == 400:
return json.dumps({ "code":400,"errMessage":"请求参数不正确." }, ensure_ascii=False).encode('utf-8')
elif code == 401:
return json.dumps({ "code":404,"errMessage":"图片下载超时." }, ensure_ascii=False).encode('utf-8')
elif code == 402:
return json.dumps({ "code":402,"errMessage":"同时传入了要求是二选一或者多选一的参数." }, ensure_ascii=False).encode('utf-8')
elif code == 403:
return json.dumps({ "code":403,"errMessage":"无法从指定的FileUrl下载图片,图片URL错误或者无效." }, ensure_ascii=False).encode('utf-8')
elif code == 404:
return json.dumps({ "code":404,"errMessage":"图片下载超时." }, ensure_ascii=False).encode('utf-8')
else:
return json.dumps({ "code":500,"errMessage":"其他错误." }, ensure_ascii=False).encode('utf-8') async def FileDealPost(request):
info = request.message
log.info("info_post = %s",info)
try:
info = await request.text()
log.info("info = %s",info)
reg = 'name="([a-zA-Z]*)".*?\r\n\r\n\W*(\S*)-*'
li = re.findall(reg,info,re.S)
dic = dict(li)
data_base64 = await downloadurl(dic)
except Exception as e:
log.info("error_post = %s",e)
if data_base64 in [400,401,402,403,404]:
result = await deal_error(data_base64)
return web.Response(body = result)
#async with session.post('http://'+ip+':1218/?name=ocr_image_indb&opt=put',data=data_base64,timeout = 0) as resp:
async with session.post('http://'+ip+':1218/?name=image&opt=put',data=data_base64,timeout = 0) as resp:
result = await resp.text()
if result == 'HTTPSQS_PUT_OK':
return web.Response(body = json.dumps({ "code":0,"errMessage":"成功" }, ensure_ascii=False).encode('utf-8'))
elif result == 'HTTPSQS_PUT_END':
return web.Response(body = json.dumps({ "code":-1,"errMessage":"请求已达上限,稍微再试." }, ensure_ascii=False).encode('utf-8'))
else:
return web.Response(body = json.dumps({ "code":-2,"errMessage":"入消息队列失败." }, ensure_ascii=False).encode('utf-8')) async def FileDealGet(request):
info = request.message
log.info("info_get = %s",info)
try:
info = request.message.path
reg = '[?&]([a-zA-Z]*)=([^&]*)'
li = re.findall(reg,info)
dic = dict(li)
data_base64 = await downloadurl(dic)
except Exception as e:
log.info("error_get = %s",e)
if data_base64 in [400,401,402,403,404]:
result = await deal_error(data_base64)
return web.Response(body = result)
#async with session.post('http://'+ip+':1218/?name=ocr_image_indb&opt=put',data=data_base64,timeout = 0) as resp:
async with session.post('http://'+ip+':1218/?name=image&opt=put',data=data_base64,timeout = 0) as resp:
result = await resp.text()
if result == 'HTTPSQS_PUT_OK':
return web.Response(body = json.dumps({ "code":0,"errMessage":"成功" }, ensure_ascii=False).encode('utf-8'))
elif result == 'HTTPSQS_PUT_END':
return web.Response(body = json.dumps({ "code":-1,"errMessage":"请求已达上限,稍微再试." }, ensure_ascii=False).encode('utf-8'))
else:
return web.Response(body = json.dumps({ "code":-2,"errMessage":"入消息队列失败." }, ensure_ascii=False).encode('utf-8')) async def init(loop):
app = web.Application(loop=loop)
app.router.add_route('POST', '/file', FileDealPost)
app.router.add_route('GET', '/file', FileDealGet)
srv = await loop.create_server(app.make_handler(),'10.10.11.32', int(sys.argv[1]))
return srv loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()
aiohttp web服务端(server)样例 (非client)的更多相关文章
- Oracle Tuxedo工作站客户端与服务端的样例程序
服务端代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <cty ...
- 关于如何提高Web服务端并发效率的异步编程技术
最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...
- 如何提高Web服务端并发效率的异步编程技术
作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...
- Web服务端性能提升实践
随着互联网的不断发展,日常生活中越来越多的需求通过网络来实现,从衣食住行到金融教育,从口袋到身份,人们无时无刻不依赖着网络,而且越来越多的人通过网络来完成自己的需求. 作为直接面对来自客户请求的Web ...
- Delphi XE5通过WebService开发Web服务端和手机客户端
Delphi XE5通过WebService开发Web服务端和手机客户端介绍 我们开发一个三层的android程序 建立一个webservices stand-alone vcl applicati ...
- wsgiref手写一个web服务端
''' 通过wsgiref写一个web服务端先讲讲wsgiref吧,基于网络通信其根本就是基于socket,所以wsgiref同样也是通过对socket进行封装,避免写过多的代码,将一系列的操作封装成 ...
- winform客户端利用webClient实现与Web服务端的数据传输
由于项目需要,最近研究了下WebClient的数据传输.关于WebClient介绍网上有很多详细介绍,大概就是利用WebClient可以实现对Internet资源的访问.无外乎客户端发送请求,服务端处 ...
- web服务端的架构演变
此文已由作者肖凡授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 最近Lofter项目碰到很多性能上的问题,特别是数据库相关的,每次推送后,告警就会第一时间到来.这些问题随着产 ...
- Rsync同步部署web服务端配置
Rsync同步部署web服务端配置 1,参数详解: -v, --verbose 详细模式输出. -q, --quiet 精简输出模式. -c, --checksum 打开校验开关,强制对文件传输进行校 ...
随机推荐
- 【剑指Offer】面试题22. 链表中倒数第k个节点
题目 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5.6. ...
- 20 - CommonJS - 规范的具体内容
- python 奇淫技巧之自动登录 哔哩哔哩
前言 嘿,各位小伙伴好呀,今天要带来点什么干货呢,就从我的实际开发中来给大家带来一个案例吧,如何自动登录 哔哩哔哩 接到老大通知,让我自动写一个自动登录 哔哩哔哩 的脚本,我当然是二话不说直接开怼,咱 ...
- 并发与高并发(十三)J.U.C之AQS
前言 什么是AQS,是AbstractQueuedSynchronizer类的简称.J.U.C大大提高了并发的性能,而AQS又是J.U.S的核心. 主体概要 J.U.C之AQS介绍 J.U.C之AQS ...
- 题解P4201: [NOI2008]设计路线
发现给出了一棵树, 不是树的情况直接输出-1 考虑进行DP, 设f[i][0/1/2]为i的子树中选小于等于0/1/2条边修路的方案数, 不妨对于一个节点, 先考虑正好相等的情况, 假设当前扫到了一个 ...
- JAVA多线程的基础
线程与进程的区别 1.线程与进程 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所 ...
- Servlet过滤器基础及使用场景
Servlet过滤器详解 一.过滤器基础 1.Servlet过滤器是Servlet的一种特殊用法,主要用来完成一些通用的操作.比如编码的过滤,判断用户的登陆状态等等.Servlet过滤器的适用场合: ...
- MySQL高负载优化
MySQL配置文件优化 [client] port = #客户端端口号为3306 socket = /data//mysql.sock # default-character-set = utf8 # ...
- nodejs(13)模块加载机制
模块加载机制 优先从缓存中加载 当一个模块初次被 require 的时候,会执行模块中的代码,当第二次加载相同模块的时候,会优先从缓存中查找,看有没有这样的一个模块! 好处:提高模块的加载速度:不需要 ...
- 直击JDD | 京东技术全景图首次展示 四大重磅智能技术驱动产业未来!
11月19日,主题为"突破与裂变"的2019京东全球科技探索者大会(JDDiscovery)在京盛大开幕,京东集团展示了完整的技术布局与先进而丰富的对外技术服务,对外明确诠释了&q ...