python16_day10【SelectWeb、SelectWget、paramiko、pymysql】
一、select实现Web框架(自定义WEB框架)
浏览器输入:http://127.0.0.1:8888/index.html
import select
import socket class Flask(object):
def __init__(self, routers):
self.routers = routers def process_data(self, client):
data = bytes()
while True:
try:
trunk = client.recv(1024) # 没有数据会报错, 用户断开也会报错.
except BlockingIOError as e:
trunk = ""
if not trunk:
break
data += trunk
data_str = str(data, encoding='utf8')
header, body = data_str.split('\r\n\r\n', 1)
header_list = header.split('\r\n')
header_dict = {}
for line in header_list:
value = line.split(":", 1)
if len(value) == 2:
k, v = value
header_dict[k] = v
else:
header_dict['mothod'], header_dict['url'], header_dict['protocol'] = line.split(' ') return header_dict, body def run(self, host='127.0.0.1', port=8888):
sock = socket.socket()
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setblocking(False)
sock.bind((host, port))
sock.listen(5) inputs = [sock, ]
while True:
rList, wList, eList = select.select(inputs, [], [], 0.5)
for client in rList:
# 建立新的连接
if client == sock:
conn, addr = client.accept()
conn.setblocking(False)
inputs.append(conn)
else: # 用户发送数据
header_dict, body = self.process_data(client)
request_url = header_dict['url']
func_name = None
for item in self.routers:
if item[0] == request_url:
func_name = item[1]
break
if not func_name:
client.sendall(b"")
else:
result = func_name(header_dict, body)
client.sendall(result.encode('utf8'))
inputs.remove(client)
client.close()
flask.py
import flask def f1(header, body):
return "from f1" def f2(header, body):
return "from f2" routers = [
('/index.html', f1),
('/login.html', f2),
] obj = flask.Flask(routers)
obj.run()
二、自定义Wget(爬虫)
select使用基类的fileno进行,使用foo在中间封装一层,从而增加更多的功能。
#!/usr/bin/env python
# -*-coding:utf8-*-
# __author__ = "willian"
import socket
import select # 中间封装一层
class Foo(object):
def __init__(self, sock, callback, url, host):
self.sock = sock
self.callback = callback
self.url = url
self.host = host def fileno(self):
return self.sock.fileno() class NbIO(object):
def __init__(self):
self.fds = []
self.connections = [] def connect(self, url_list):
for item in url_list:
conn = socket.socket()
conn.setblocking(False)
# 1. 发送链接请求
try:
conn.connect((item['host'], 80))
except BlockingIOError as e:
pass
obj = Foo(conn, item['callback'], item['url'], item['host'])
self.fds.append(obj)
self.connections.append(obj) def send(self):
while True:
if len(self.fds) == 0:
break
# wList,有对象;当前socket已经创建链接
rList, wList, eList = select.select(self.fds, self.connections, self.fds, 0.5) for obj in rList:
# 4.有数据响应回来了
conn = obj.sock
data = bytes()
while True:
try:
d = conn.recv(1024)
data = data + d
except BlockingIOError as e:
d = None
if not d:
break
# print(data)
obj.callback(data) # 自定义操作 f1 f2
self.fds.remove(obj)
# print(len(self.fds),len(self.connections))
# 执行当前请求 函数:f1 f2
# 【1,2,3,】
for obj in wList:
# 2.已经连接上远程
conn = obj.sock
# 3. 发送数据
# HTTP/1.1\r\nHost: %s\r\n\r\n
template = "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n" % (obj.url, obj.host,)
# template = "POST %s HTTP/1.1\r\nHost: 127.0.0.1:8888\r\n\r\nk1=v1&k2=v2" %(obj.url,)
conn.sendall(template.encode('utf-8'))
self.connections.remove(obj)
基类
import spider def f1(data):
print("\033[31;1m{0}\033[0m".format(data)) def f2(data):
print("\033[32;1m{0}\033[0m".format(data)) url_list = [
{'host': "www.baidu.com", 'url': '/', 'callback': f1}, # socket
{'host': "www.bing.com", 'url': '/', 'callback': f2},
{'host': "www.cnblogs.com", 'url': '/wupeiqi', 'callback': f1},
{'host': "www.oldboyedu.com", 'url': '/', 'callback': f1},
]
obj = spider.NbIO()
obj.connect(url_list)
obj.send()
三、paramiko实现SSH登录
#!/usr/bin/env python
# -*-coding:utf8-*-
# __author__ = "willian" import paramiko class SshHelper(object):
def __init__(self, host, port, username, pwd):
self.host = host
self.port = port
self.username = username
self.pwd = pwd
self.transport = None def connect(self):
transport = paramiko.Transport((self.host, self.port,))
transport.connect(username=self.username, password=self.pwd)
self.transport = transport def put(self, local, target):
sftp = paramiko.SFTPClient.from_transport(self.transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put(local, target) def get(self, remote, local):
sftp = paramiko.SFTPClient.from_transport(self.transport)
sftp.get(remote, local) def cmd(self, cmd):
ssh = paramiko.SSHClient()
ssh._transport = self.transport
stdin, stdout, stderr = ssh.exec_command(cmd)
stdout.read() def close(self):
self.transport.close() if __name__ == '__main__':
obj = SshHelper('1.1.1.1')
obj.connect()
obj.close()
ssh封装类
四、MySQL
1.mysql认识和基本操作
http://www.cnblogs.com/wupeiqi/articles/5713315.html
http://www.cnblogs.com/wupeiqi/articles/5713323.html
a、条件
select * from 表 where id > 1 and name != 'alex' and num = 12; select * from 表 where id between 5 and 16; select * from 表 where id in (11,22,33)
select * from 表 where id not in (11,22,33)
select * from 表 where id in (select nid from 表) b、通配符
select * from 表 where name like 'ale%' - ale开头的所有(多个字符串)
select * from 表 where name like 'ale_' - ale开头的所有(一个字符) c、限制
select * from 表 limit 5; - 前5行
select * from 表 limit 4,5; - 从第4行开始的5行
select * from 表 limit 5 offset 4 - 从第4行开始的5行 d、排序
select * from 表 order by 列 asc - 根据 “列” 从小到大排列
select * from 表 order by 列 desc - 根据 “列” 从大到小排列
select * from 表 order by 列1 desc,列2 asc - 根据 “列1” 从大到小排列,如果相同则按列2从小到大排序 e、分组
select num from 表 group by num
select num,nid from 表 group by num,nid
select num,nid from 表 where nid > 10 group by num,nid order nid desc
select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid select num from 表 group by num having max(id) > 10 特别的:group by 必须在where之后,order by之前 f、连表
无对应关系则不显示
select A.num, A.name, B.name
from A,B
Where A.nid = B.nid 无对应关系则不显示
select A.num, A.name, B.name
from A inner join B
on A.nid = B.nid A表所有显示,如果B中无对应关系,则值为null
select A.num, A.name, B.name
from A left join B
on A.nid = B.nid B表所有显示,如果B中无对应关系,则值为null
select A.num, A.name, B.name
from A right join B
on A.nid = B.nid g、组合
组合,自动处理重合
select nickname
from A
union
select name
from B 组合,不处理重合
select nickname
from A
union all
select name
from B
复杂查询
2.python操作MySQL
对于Python操作MySQL主要使用两种方式:
- 原生pymysql
- ORM方式sqlAlchemy
安装:pip3 install pymysql
import pymysql # 创建连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
# 创建游标
cursor = conn.cursor() # 执行SQL,并返回收影响行数
effect_row = cursor.execute("update hosts set host = '1.1.1.2'") # 执行SQL,并返回受影响行数
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,)) # 执行SQL,并返回受影响行数
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)]) # 提交,不然无法保存新建或者修改的数据
conn.commit() # 关闭游标
cursor.close()
# 关闭连接
conn.close()
执行SQL
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
cursor = conn.cursor()
cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
conn.commit()
cursor.close()
conn.close() # 获取最新自增ID
new_id = cursor.lastrowid
获取自增ID
import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
cursor = conn.cursor()
cursor.execute("select * from hosts") # 获取第一行数据
row_1 = cursor.fetchone() # 获取前n行数据
# row_2 = cursor.fetchmany(3)
# 获取所有数据
# row_3 = cursor.fetchall() conn.commit()
cursor.close()
conn.close()
获取数据
注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
- cursor.scroll(1,mode='relative') # 相对当前位置移动
- cursor.scroll(2,mode='absolute') # 相对绝对位置移动
关于默认获取的数据是元祖类型,如果想要或者字典类型的数据,即:
import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1') # 游标设置为字典类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
r = cursor.execute("call p1()") result = cursor.fetchone() conn.commit()
cursor.close()
conn.close()
获取数据类型
MySQL练习:
http://www.cnblogs.com/wupeiqi/articles/5729934.html
http://www.cnblogs.com/wupeiqi/articles/5748496.html
python16_day10【SelectWeb、SelectWget、paramiko、pymysql】的更多相关文章
- PYDay10&11&12&13-常用模块:time|datetime|os|sys|pickle|json|xml|shutil|logging|paramiko、configparser、字符串格式化、py自动全局变量、生成器迭代器
1.py文件自动创建的全局变量 print(vars()) 返回值:{'__name__': '__main__', '__package__': None, '__loader__': <_f ...
- 【完全开源】知乎日报UWP版(下篇):商店APP、github源码、功能说明。Windows APP 良心出品。
目录 说明 功能 截图+视频 关于源码和声明 说明 陆陆续续大概花了一个月的时间,APP算是基本完成了.12月份一直在外出差,在出差期间进行了两次功能完善,然后断断续续修补了一些bug,到目前为止,我 ...
- 【Java EE 学习 21 下】【使用java实现邮件发送、邮件验证】
一.邮件发送 1.邮件发送使用SMTP协议或者IMAP协议,这里使用SMTP协议演示. SMTP协议使用的端口号:25 rfc821详细记载了该协议的相关信息 (1)使用telnet发送邮件(使用12 ...
- 纯JavaScripst的全选、全不选、反选 【转】
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)
[等待事件]序列等待事件总结(enq: SQ - contention.row cache lock.DFS lock handle和enq: SV - contention) 1 BLOG文档结 ...
- 【Fate/kaleid liner 魔法少女☆伊莉雅】系列中实践的、新世代的动画摄影工作流
通常的日本动画的摄影中,是以追加Cell(celluloid 赛璐珞)与背景的合成滤镜处理为主,而在[Fate/kaleid liner 魔法少女☆伊莉雅]系列的,加入了自己使用3DCG软 ...
- python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】
python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...
- 【¥200代金券、iPad等您来拿】 阿里云9大产品免费公测#10月9日-11月6日#
#10.09-11.06#200元代金券.iPad大奖, 9大产品评测活动! 亲爱的阿里云小伙伴们: 云产品的多样性(更多的云产品)也是让用户深度使用云计算的关键.今年阿里云产品线越来越丰富,小云搜罗 ...
- 【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨
原文:[高德地图API]从零开始学高德JS API(二)地图控件与插件——测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装 ...
随机推荐
- Unix系统编程()通用模型以外的操作ioctl
之前学习到的都是通用的IO模型,现在要学的是一个ioctl系统调用,ioctl为执行文件和设备提供了一种多用途机制. int ioctl(int fd, int request, - /*argp*/ ...
- IOS证书之Certificates,Devices, Identifiers & Profiles
做IOS开发的,在需要发布应用的时候,会接触到iOS Dev Center里面的证书制作,按照网上的资料操作,我们可以很容易的制作证书并且完成真机调试或者是产品发布,但是对于Certificates. ...
- hdu6059 Kanade's trio 字典树+容斥
转自:http://blog.csdn.net/dormousenone/article/details/76570172 /** 题目:hdu6059 Kanade's trio 链接:http:/ ...
- .net 编码常见问题
问题一: windows service 启动时需要用死循环来控制程序,如果不开启异步,死循环会导致windows sevice 程序无法启动,代码情况如下 protected override vo ...
- TaskTracker学习笔记
转自:http://blog.csdn.net/androidlushangderen/article/details/41477061 上次分析完JobTracker通过TaskScheduler如 ...
- Vector类与Enumeration接口
Vector类用于保存一组对象,由于java不支持动态数组,Vector可以用于实现跟动态数组差不多的功能.如果要将一组对象存放在某种数据结构中,但是不能确定对象的个数时,Vector是一个不错的选择 ...
- poj 3249(bfs+dp或者记忆化搜索)
题目链接:http://poj.org/problem?id=3249 思路:dp[i]表示到点i的最大收益,初始化为-inf,然后从入度为0点开始bfs就可以了,一开始一直TLE,然后优化了好久才4 ...
- 上传文件ie7
https://www.cnblogs.com/front-end-develop/p/6214818.html 第一步:html中引入jQuery-1.7.1.js和ajaxFileUpload.j ...
- 59、常规控件(2)TextInputLayout-让EditText提示更加人性化
提示语用在显示. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" andro ...
- [LintCode] 删除链表中倒数第n个节点
/** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(in ...