上一次學習了os模塊,sys模塊,json模塊,random模塊,string模塊,time模塊,hashlib模塊,今天繼續學習以下的常用模塊:
1、datetime模塊
2、pymysql模塊(3.0以上版本)
3、Redis模塊
4、flask模塊
datetime模塊
datetime中包含三個類date ,time,datetime
datetime.date:表示日期的類。常用的屬性有year, month, day;
datetime.time:表示時間的類。常用的屬性有hour, minute, second, microsecond;
datetime.datetime:表示日期時間。
1、date對象由year年份、month月份及day日期三部分構成:
例如:
a=datetime.date.today()#返回當前日期
print(a)
b=datetime.date(2018,3,23)#傳入一個日期
print(b)
print(b.year)
print(b.month)
print(b.day)
差看執行結果:
2018-01-24
2018-03-23
2018
3
23
formattimestamp()傳入一個時間戳,返回一個date對象,例如:
c=time.time()#當前時間的時間戳
d=datetime.date.fromtimestamp(c)#formtimestamp傳入一個時間戳,返回一個date對象
print(d)
差看執行結果
2018-01-24
strftime格式化,例如:
e=datetime.date.today()
f=datetime.date.today().strftime('%Y%m%d')
print(e)
print(f)
查看執行結果:
20180124
timedelta加減相應的天數
print(datetime.date.today()+datetime.timedelta(3))
查看執行結果:
2018-01-27
2、time方法主要用於時間的操作,例如
print(datetime.time.max)#時間的最大值
print(datetime.time.min)#時間的最小值
print(datetime.time(12,00,59).strftime('%H:%M:%S'))#對傳入的時間格式化
差看執行結果:
23:59:59.999999
00:00:00
12:00:59
3、datetime 類其實是可以看做是date類和time類的合體,其大部分的方法和屬性都繼承於這二個類,
print(datetime.datetime.today())
print(datetime.datetime.now())
print(datetime.datetime.today().strftime('%Y-%m-%d %H:%M:%S'))
print(datetime.datetime(2018,1,12,12,59,59))
查看執行結果:
2018-01-24 16:49:43.875425
2018-01-24 16:49:43.875425
2018-01-24 16:49:43
2018-01-12 12:59:59
datetime也可以直接來加減天數,例如:
a=datetime.datetime.today()+datetime.timedelta(-4)
print(a.strftime('%Y-%m-%d %H:%M:%S'))
查看執行結果:
2018-01-20 16:54:39
pymysql 模塊
首先確認有沒有安裝pymysql模塊
先導入pymysql模塊。如果沒有報錯,則說明已經安裝了pymysql;
import pymysql #導入
如果沒有安裝可以使用pip命令進行安裝:
pip install pymysql
對數據庫進行操作,我們需要進行以下操作步驟:
1、鏈接上mysql,使用到:IP 端口號 賬號 密碼 數據庫名稱
2、建立游標
3、執行sql
4、獲取結果
實例:
import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
res=cur.fetchall()
print(res)
cur.close()#先關閉游標
conn.close()#在關閉鏈接
查看執行結果:
((5, '123', '202cb962ac59075b964b07152d234b70'), (8, '1234', '81dc9bdb52d04dc20036dbd8313ed055'), (7, '222', 'bcbe3365e6ac95ea2c0343a2395834dd'), (6, '234', '289dff07669d7a23de0ef88d2f7129e7'), (2, 'liwang', 'd123dasd8192738127398sd123'), (3, 'lwwang', 'd1ww23dasd8192738127398sd123'))
可以看到取出的數據為一個二維元組類型。
1、創建游標時,默認查詢數據為元組類型,可以指定類型為字典類型,如下:
import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor(cursor=pymysql.cursors.DictCursor)
#執行sql
cur.execute('select * from users')
# #獲取數據
res=cur.fetchall()
print(res)
print(res[2]['id'])
cur.close()#先關閉游標
conn.close()#在關閉鏈接
執行查看結果:
[{'id': 5, 'username': '123', 'passwd': '202cb962ac59075b964b07152d234b70'}, {'id': 8, 'username': '1234', 'passwd': '81dc9bdb52d04dc20036dbd8313ed055'}, {'id': 7, 'username': '222', 'passwd': 'bcbe3365e6ac95ea2c0343a2395834dd'}, {'id': 6, 'username': '234', 'passwd': '289dff07669d7a23de0ef88d2f7129e7'}, {'id': 2, 'username': 'liwang', 'passwd': 'd123dasd8192738127398sd123'}, {'id': 3, 'username': 'lwwang', 'passwd': 'd1ww23dasd8192738127398sd123'}]
可以看到結果為一個list,list中是一個個字典表。如果要查看某一個字段的值,可以直接使用列表及字典的獲取數據的方式來獲取
2、fetch的數據類型
fetch數據類型有兩種,
fetchone 只獲取一條結果,他的結果放到一個一維數組中
fetchall 獲取所有結果,他把結果放到一個二維元組
import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
res=cur.fetchone()#只獲取一條結果,他的結果放到一個一維數組
res1=cur.fetchall()#獲取所有結果,是一個二維元祖,它把每一個值放到一個元祖里,每一條數據的每一個字段存到第二個元祖
print(res)
print(res1)
cur.close()#先關閉游標
conn.close()#在關閉鏈接
查看執行結果:
(5, '123', '202cb962ac59075b964b07152d234b70')
((8, '1234', '81dc9bdb52d04dc20036dbd8313ed055'), (7, '222', 'bcbe3365e6ac95ea2c0343a2395834dd'), (6, '234', '289dff07669d7a23de0ef88d2f7129e7'), (2, 'liwang', 'd123dasd8192738127398sd123'), (3, 'lwwang', 'd1ww23dasd8192738127398sd123'))
我們先執行fetchall,再執行fetchone看一下:
import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
tes=cur.fetchone()#指定游標類型,每一條取出的是一個字典,列名就是key值
res=cur.fetchall()#指定游標類型后,fetchall 取出的是一個list ,每個元素的值又是一個字典
print(res)
print(res1)
cur.close()#先關閉游標
conn.close()#在關閉鏈接
查看執行結果:
((5, '123', '202cb962ac59075b964b07152d234b70'), (8, '1234', '81dc9bdb52d04dc20036dbd8313ed055'), (7, '222', 'bcbe3365e6ac95ea2c0343a2395834dd'), (6, '234', '289dff07669d7a23de0ef88d2f7129e7'), (2, 'liwang', 'd123dasd8192738127398sd123'), (3, 'lwwang', 'd1ww23dasd8192738127398sd123'))
None
我們看到上邊的執行結果:
第二個fetchone的執行結果是空,這就與游標的位置有關了;
這就需要控制游標操作來讀取數據;
3、控制游標
實例:
import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
res=cur.fetchall()
cur.scroll(1,mode='absolute')
res1=cur.fetchone()
print(res)
print(res1)
cur.close()#先關閉游標
conn.close()#在關閉鏈接
查看執行結果:
((5, '123', '202cb962ac59075b964b07152d234b70'), (8, '1234', '81dc9bdb52d04dc20036dbd8313ed055'), (7, '222', 'bcbe3365e6ac95ea2c0343a2395834dd'), (6, '234', '289dff07669d7a23de0ef88d2f7129e7'), (2, 'liwang', 'd123dasd8192738127398sd123'), (3, 'lwwang', 'd1ww23dasd8192738127398sd123'))
(8, '1234', '81dc9bdb52d04dc20036dbd8313ed055')
可以看到設置的1,位下標為1的位置,如果想要從頭開始讀取,可以設置為0;
import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
res=cur.fetchall()
cur.scroll(-1,mode='relative')
res1=cur.fetchone()
print(res)
print(res1)
cur.close()#先關閉游標
conn.close()#在關閉鏈接
查看執行結果:
((5, '123', '202cb962ac59075b964b07152d234b70'), (8, '1234', '81dc9bdb52d04dc20036dbd8313ed055'), (7, '222', 'bcbe3365e6ac95ea2c0343a2395834dd'), (6, '234', '289dff07669d7a23de0ef88d2f7129e7'), (2, 'liwang', 'd123dasd8192738127398sd123'), (3, 'lwwang', 'd1ww23dasd8192738127398sd123'))
(3, 'lwwang', 'd1ww23dasd8192738127398sd123')
可以看到relative模式的相對路徑,設置為-1的時候,是向前移動了一個位置,如果relative模式設置為正,則是當前位置向后移動幾個位置;
import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
res=cur.fetchone()
res1=cur.fetchone()
print(res)
print(res1)
cur.close()#先關閉游標
conn.close()#在關閉鏈接
查看執行結果:
(5, '123', '202cb962ac59075b964b07152d234b70')
(8, '1234', '81dc9bdb52d04dc20036dbd8313ed055')
可以看到fetch數據的時候是依次讀取的,不是從頭讀取。讀一次取一行,運行兩次則是取第二條。
4、寫操作的時候,如insert、update、delete 語句需要commit提交操作
import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
sql="insert into users (username,passwd) VALUES ('lizhong','asdasd123q12aasdsd');"
cur.execute(sql)
conn.commit()
cur.execute("select * from users ;")
res=cur.fetchall()
print(res)
cur.close()#先關閉游標
conn.close()#在關閉鏈接
查看執行結果:
((5, '123', '202cb962ac59075b964b07152d234b70'), (8, '1234', '81dc9bdb52d04dc20036dbd8313ed055'), (7, '222', 'bcbe3365e6ac95ea2c0343a2395834dd'), (6, '234', '289dff07669d7a23de0ef88d2f7129e7'), (11, 'lifei', 'asdasd123q12aasdsd'), (9, 'lijing', 'asdasd123q12aasdsd'), (2, 'liwang', 'd123dasd8192738127398sd123'), (12, 'lizhong', 'asdasd123q12aasdsd'), (3, 'lwwang', 'd1ww23dasd8192738127398sd123'))
可以看到,插入了我們執行sql的數據;
Redis緩存數據庫
要使用Redis同樣需要先安裝,導入,與pymysql操作類似:
pip install redis
導入Redis
import redis
我們都知道,數據庫分為關系型數據庫和非關系型數據庫;
非關系型數據庫就是nosql類型,沒有庫表關系,比傳統的關系型數據庫快,常用的nosql型數據庫有:
memecache :數據存在內存里 key-value 形式
redis: 數據存在內存里,用來提高性能
MongoDB:數據存在磁盤上
對redis進行操作,可以在客戶端直接操作,也可以通過python鏈接redis進行操作。
1、客戶端操作
客戶端操作可以下載redis-desktop-manager軟件。
安裝成功后,建立鏈接(要鏈接redis 首先保證redis服務器是運行狀態。):
如果出現鏈接失敗,的情況,如下:
需要做下面的事:
在redis.conf配置文件中,進行如下配置,
注釋掉 bind 127.0.0.1
設置密碼:
requirepass xxxxxxx
設置密碼 為了安全一定要設,而且這里如果不綁定ip也不設密碼的話,redis是默認保護模式,只能本虛擬機訪問,不允許其他ip訪問
保存配置文件,重啟redis服務,查看虛擬機ip;
重新進行鏈接:鏈接成功
redis默認有16個DB,可以通過界面來添加相應數據:
2、python操作
通過腳本操作redis:
1、導入redis模塊
2、鏈接redis
3、操作redis
對於關閉redis的問題,不需要手動關閉redis,
參考原因:當我們用Redis和StrictRedis創建連接時,其實內部實現並沒有主動給我創建一個連接,我們獲得的連接是連接池提供的連接,這個連接由連接池管理,所以我們無需關注連接是否需要主動釋放的問題。另外連接池有自己的關閉連接的接口,一旦調用該接口,所有連接都將被關閉。
通過客戶端我們也可以看到,redis是一個key-value存儲系統,支持的value類型:string,list,set,zset(有序集合),hash(哈希類型)
我們先來創建一個redis鏈接:
實例:
import redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,passwd='123456',db=3)
string類型
對redis進行操作,我們可以使用set()添加數據,get()獲取數據,delete()刪除數據;
如下:
import redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
#添加數據
r.set('test','123456')
#獲取數據
res=r.get('test')
print(res)
#刪除數據
r.delete('test')
查看執行結果:
獲取數據的結果:
b'123456'
刪除數據結果:

我們看到上面獲取數據的時候返回的是一個b‘123456’,屬於bytes類型,在我們的日常操作中bytes類型很不方便,說以我們可以轉化成字符串類型方便操作。
decode方法是將bytes類型轉化成字符串類型
例如:
import redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
#添加數據
r.set('test','123456')
#獲取數據
res=r.get('test')
print(res.decode())
查看執行結果:
123456
添加數據后,我們在后台管理界面可以看到一個TTL的值是-1,這個字段是來控制失效時間的,默認的set的數據是永久有效的,如果要設置失效時間可以用setex來設置,如下:
import redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
#添加數據
r.setex('pei_session','abcdefghijk','20')
#獲取數據
res=r.get('pei_session')
print(res.decode())
查看執行結果:
abcdefghijk
查看客戶端:顯示TTL時間剩余9秒,超過20秒之后重新加載db3,已經找不到pei_session這條數據了:
20以后:

上面用到的set(),get(),delete(),setex()都是針對string類型的,K -V模式(redis里邊的string類型);
我們常用到的redis數據類型還有hash類型
hash類型
對於hash類型的操作要使用hset(),hget(),hgetall(),例如:
hset(name,key,value):存儲字典
- name:鍵
- key:字典的key
- value:字典的值
import redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
#添加數據
r.hset('user','wang','123456')
#獲取數據
res=r.hget('user','wang')
print(res.decode())
查看執行結果:123456
查看客戶端展示形式
當哈希表中有多條數據的時候獲取出來,展示的是一個字典表:
import redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
#獲取數據
res=r.hgetall('user')
print(res)
查看執行結果
{b'li': b'123456', b'zhao': b'123456', b'wang': b'123456', b'he': b'123456'}
如果要把每一個key 和 value 都轉換成字符串可以循環取值:
import redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
redis_data=r.hgetall('user')
all_dat={}
for k,v in redis_data.items():#取出k ,v
k=k.decode()
v=v.decode()
all_dat[k]=v
print(all_dat)
查看執行結果:
{'he': '123456', 'li': '123456', 'wang': '123456', 'zhao': '123456'}
如果要添加文件夾的話可以用:來控制,例如:
import redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
r.set('file:log','123456')
r.set('file:img:001','001')
查看執行結果:
對hash類型的也可以建多個文件夾:
r.hset('info:user:name','wang','123456')
查看執行結果:
keys()獲取所有的key值:
print(r.keys())#獲取所有的key,是一個list
查看執行結果:
[b'info:user:name', b'user', b'file:log', b'file:img:001', b'test', b'file:data:ok']
可以用*通配符進行模糊查詢:
print(r.keys('*user*'))
查看執行結果:
[b'info:user:name', b'user']
type()獲取key的類型:
print(r.type('user'))
print(r.type('file:data:ok'))
查看執行結果:
b'hash'
b'string'
下面來做一個小程序,實現redis的數據遷移:
分析:1、需要鏈接兩個redis
2、取出第一個redis的key,判斷key的類型
3、取出redis的值,然后set進第二個redis
4、如果是hash類型的,需要再循環一次取出值
實例:
import redis
r1=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
r2=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=4)
ex_listkey=r1.keys()
#print(ex_listkey)
for key in ex_listkey:
if r1.type(key)==b'string':
r1_v=r1.get(key)
r2.set(key,r1_v)
elif r1.type(key)==b'hash':
r1_hash=r1.hgetall(key)
for k,v in r1_hash.items():
r2.hset(key,k,v)
else:
print('類型不考慮')
查看執行結果:
db3中的數據已經遷移到了db4中;
4、flask模塊
在使用flask模塊之前我們先來了解一下mock技術,
mock測試就是在測試過程中,對於某些不容易構造或者不容易獲取的對象,用一個虛擬的對象來創建以便測試的測試方法。
什么情況下會使用mock技術:
1、被測代碼中需要依賴第三方接口返回值進行邏輯處理,可能因為網絡或者其他環境因素,調用第三方經常會中斷或者失敗,無法對被測單元進行測試,這個時候就可以使用mock技術來將被測單元和依賴模塊獨立開來,使得測試可以進行下去。
2、被測單元依賴的模塊尚未開發完成,而被測單元需要依賴模塊的返回值進行后續處理
3、 被測單元依賴的對象較難模擬或者構造比較復雜
下面我們就用flask模塊來實現。
要使用flask模塊首先要安裝,導入:
pip install flask
import flask#導入
Flask是一個使用 Python 編寫的輕量級 Web 應用框架。可以給web前台提供后台服務。
1、獲取一個類似句柄的東西app,所有的操作都要通過app來執行,通俗的說就是把當前的文件當做一個后台服務
2、設置一個簡單的URL :訪問路徑,這個URL是提供給web前台的接口,有了接口,我們也得提供接口內容。
3、在URL下設計一個函數 def func()
4、啟動整個程序 app.run(port=9999)
實例:
import pymysql
import redis
def op_mysql(host,user,passwd,db,sql,port=3306,charset='utf8'):
conn=pymysql.connect(host=host,user=user,passwd=passwd,port=port,db=db,charset=charset)
cur=conn.cursor(cursor=pymysql.cursors.DictCursor)
cur.execute(sql)
sql_start=sql[:6].upper()
if sql_start=='SELECT':#取sql的前6位,判斷它是什么類型的語句。
res=cur.fetchall()
else:
conn.commit()
res='ok'
cur.close()
conn.close()
return res
import flask
from tools import op_mysql#之前定的一個方法
import json
app=flask.Flask(__name__)
@app.route('/get_user',methods=['get','post'])
def get_alluser():
sql='select * from users'
res=op_mysql(host='192.168.1.105',user='root',passwd='123456',port=3306,db='test',sql=sql,charset='utf8')
response=json.dumps(res,ensure_ascii=False)
return response
app.run(port=8888,debug=True)
運行:

輸入地址,拼接路徑就可以獲取到數據:
http://127.0.0.1:8888/get_user

這樣就完成了一個接口的開發。
標准的程序框架設置,是下面這種形式:

說明:
為了使邏輯更清晰
一般readme文件會說明程序的使用規則,如下:
#這個程序是xxx接口
#依賴 flask pysmysql python3
#pip install flask
#pip install pymysql
#python bin/start.py
conf 文件夾下主要存放配置文件
lib 目錄用來寫主邏輯
bin 目錄存放啟動文件start.py
接下來就可以進入到程序開發階段了~
