一、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】的更多相关文章

  1. 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 ...

  2. 【完全开源】知乎日报UWP版(下篇):商店APP、github源码、功能说明。Windows APP 良心出品。

    目录 说明 功能 截图+视频 关于源码和声明 说明 陆陆续续大概花了一个月的时间,APP算是基本完成了.12月份一直在外出差,在出差期间进行了两次功能完善,然后断断续续修补了一些bug,到目前为止,我 ...

  3. 【Java EE 学习 21 下】【使用java实现邮件发送、邮件验证】

    一.邮件发送 1.邮件发送使用SMTP协议或者IMAP协议,这里使用SMTP协议演示. SMTP协议使用的端口号:25 rfc821详细记载了该协议的相关信息 (1)使用telnet发送邮件(使用12 ...

  4. 纯JavaScripst的全选、全不选、反选 【转】

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 【等待事件】序列等待事件总结(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文档结 ...

  6. 【Fate/kaleid liner 魔法少女☆伊莉雅】系列中实践的、新世代的动画摄影工作流

          通常的日本动画的摄影中,是以追加Cell(celluloid 赛璐珞)与背景的合成滤镜处理为主,而在[Fate/kaleid liner 魔法少女☆伊莉雅]系列的,加入了自己使用3DCG软 ...

  7. python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】

    python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...

  8. 【¥200代金券、iPad等您来拿】 阿里云9大产品免费公测#10月9日-11月6日#

    #10.09-11.06#200元代金券.iPad大奖, 9大产品评测活动! 亲爱的阿里云小伙伴们: 云产品的多样性(更多的云产品)也是让用户深度使用云计算的关键.今年阿里云产品线越来越丰富,小云搜罗 ...

  9. 【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨

    原文:[高德地图API]从零开始学高德JS API(二)地图控件与插件——测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装 ...

随机推荐

  1. C#非常规调试场景总结

    场景1:类库独立调试.          方法:可以将类库项目修改成控制台程序,然后增加一个静态的main函数的方式来调试 场景2:程序需要连接数据库,本机调试的时候因为权限问题无法连接上数据库,只能 ...

  2. DpQuery.js

    (function (window) { //添加事件的方法通用所有 function addevent(evetname, fn, obj) { if (document.attachEvent) ...

  3. VIM配置入门

    原文链接: http://www.ruanyifeng.com/blog/2018/09/vimrc.html 个人增加了两张收集来的图.

  4. 使用NPOI导入Excel注意日期格式和数字格式

    //使用NPOI导入Excel public static DataTable importExcelToDataSetUsingNPOI(string FilePath, string fileNa ...

  5. 安装ChemOffice 15.1就是这么简单

    化学绘图软件ChemDraw出了最新版ChemOffice 15.1了,其下有三个不同组件,其中ChemDraw15.1 Pro使用范围最广.当我们下载完软件后就需要对其进行安装,一般按照流程来就没有 ...

  6. convolutional neural network 课程笔记

    一.CNN基础 (1)CNN在CV方面的应用 image classification(图像识别).object detection(目标检测).neural style transfer(风格迁移) ...

  7. Java中带包的类的编译与执行

    http://blog.csdn.net/wbrs13/article/details/4859880

  8. java三大框架SSH(Struts2 Spring Hibernate)

    http://www.cnblogs.com/qiuzhongyang/p/3874149.html

  9. django用户认证系统——重置密码7

    当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...

  10. HTML-HTML链接JavaScript的几种方法

    把JavaScript文件放在head中 标准方法是把JavaScript文件放到head标签内. <head> <script type="text/javascript ...