Python學習筆記十六_模塊結構調整
一、什麽是模塊結構調整
當一個腳本中有大量的配置、方法及接口時,腳本往往顯得十分臃腫。為了代碼更易讀,可以將一個繁雜的腳本根據不同的功能放在不同的文件夾中分類管理,即模塊結構調整。
二、模塊結構調整實例
下面根據一個具體的例子來看一下如何拆分調整代碼
1、根據正常人的思維寫代碼完成功能
代碼需求:
(1) 註冊接口:
(a) 寫一個註冊接口,密碼存成密文
(b) 數據存到redis,redis的key用string類型
(c) Amy 7869d295e566295b51eec5d6bed67c14
(d) 註冊時校驗用戶是否存在 user:Amy
(2) 登錄接口
(a) 登錄成功之後,返回seesionid,用戶登錄時間
(b) sessionid: (用戶名+當前的時間戳 )md5加密,seesion失效時間是60分鐘 sessionid:Amy
{"seessionid":a5dfcb047721e02a6f8bff779c815165,"login_time":201805051820}
(c) 如果用戶已經登錄,那麽返回他的seesionid及登錄時間
import flask,json,time,redis,hashlib server= flask.Flask(__name__)#實例化server def my_redis(k,v = None,time = None):#操作redis的函數 r = redis.Redis(host = ‘127.0.0.1‘,password = ‘123456‘,db=1) if v: r.set(k,v,time) res = ‘ok‘ else: res = r.get(k) if r.get(k): res = r.get(k).decode() returnres def my_md5(s):#MD5加密函數 md = hashlib.md5() md.update(s.encode()) return md.hexdigest() @server.route(‘/reg‘,methods=[‘post‘])#註冊接口 def reg(): username = flask.request.values.get(‘username‘) pwd = flask.request.values.get(‘passwd‘) if username and pwd: if my_redis(‘dr_user:%s‘%username): res = {‘msg‘: ‘用戶已存在‘, ‘msg_code‘: 2001} else: my_redis(‘dr_user:%s‘%username,my_md5(pwd)) res= {‘msg‘: ‘註冊成功!‘, ‘msg_code‘: 0} else: res = {‘msg‘:‘必填字段未填,請查看接口文檔!‘,‘msg_code‘:1001} return json.dumps(res,ensure_ascii=False) @server.route(‘/login‘,methods=[‘post‘])#登錄接口 def login(): username = flask.request.values.get(‘username‘) pwd = flask.request.values.get(‘passwd‘) if username and pwd: if my_redis(‘dr_user:%s‘%username): if my_redis(‘dr_user:%s‘%username)== my_md5(pwd): if my_redis(‘dr_sessionid:%s‘%username):#判斷是否已經登錄 res = json.loads(my_redis(‘dr_sessionid:%s‘%username)) print(‘已經登錄過了走這裏‘)#服務端打印日誌 else: print(‘第一次登錄走這裏。。。‘)#服務端打印日誌 sessionid = my_md5(‘dr_user:%s‘%username + str(int(time.time())))#計算seesionid login_time = time.strftime(‘%Y%m%d%H%M%S‘) res = {"sessiond": sessionid, "login_time": login_time} #構造好字典 my_redis(‘dr_sessionid:%s‘%username,json.dumps(res,ensure_ascii=False),3600)#res轉為json寫入redis else: res = {‘msg‘: ‘密碼錯誤‘, ‘msg_code‘: 2001} else: res = {‘msg‘: ‘用戶不存在‘, ‘msg_code‘: 2001} else: res = {‘msg‘: ‘必填字段未填,請查看接口文檔!‘, ‘msg_code‘: 1001} return json.dumps(res,ensure_ascii=False) server.run(port=6688,debug=True,host = ‘0.0.0.0‘)#啟動服務
2、創建api目錄,及不同作用的子文件夾
(1) 創建api目錄,目錄如下
根據linux下文件夾的分類來劃分:
bin 目錄存放啟動服務的可執行腳本
config或etc存放配置文件,如mysql, redis
data存放sql語句,創建表格或者類似的東西
lib 目錄存放開發使用到的函數,即工具,還有開發好的接口也放在這裏
logs 目錄存放日誌文件
readme簡要介紹程序運行及參數修改的說明文檔
(2)將api目錄標記為Sources Root
因為後面將各個模塊放在不同的文件夾中相互引用,引用自己的python文件做為模塊時需要將路徑加入環境變量,否則會報錯。右鍵文件夾,Mark Directory as Sources Root後,pycharm將整個api文件夾統一加入環境變量。
3、將不同功能的代碼放入固定目錄
(1)在 config 下創建一個 setting.py文件,存入要用到的配置參數,都是常量
REDIS_INFO={ ‘host‘:‘127.0.01‘, ‘password‘ : ‘123456‘, ‘db‘:1, ‘port‘: 6379 }#redis的配置信息 SERVER_PORT = 6688 #服務的端口號
(2)在lib下創建一個tools.py文件,存入操作redis、MD5加密函數
import redis,hashlib,time from etc.setting import REDIS_INFO #from config import setting#變量很多時導入文件夾一級 #setting.REDIS_INFO def my_redis(k,v = None,time = None):#操作redis的函數 r = redis.Redis(**REDIS_INFO) # **REDIS_INFO將字典轉為:host = ‘127.0.0.1‘,passwd=123456,port = 6379,db =1 if v: r.set(k,v,time) res = ‘ok‘ else: res = r.get(k) if r.get(k):#防止None decode報錯 res = r.get(k).decode() return res def my_md5(s):#MD5加密函數 md = hashlib.md5() md.update(s.encode()) return md.hexdigest()
(3) 在lib下創建一個interface.py文件,存入註冊及登錄接口
import flask,json,time,datetime #寫的接口邏輯 server = flask.Flask(__name__) from lib.tools import my_redis,my_md5 @server.route(‘/reg‘,methods=[‘post‘])#註冊接口 def reg(): username = flask.request.values.get(‘username‘)#username是接口調用的key,即入參 pwd = flask.request.values.get(‘passwd‘)#passwd是接口調用的key,即入參 if username and pwd: if my_redis(‘dr_user:%s‘%username): res = {‘msg‘: ‘用戶已存在‘, ‘msg_code‘: 2001} else: my_redis(‘dr_user:%s‘%username,my_md5(pwd)) res= {‘msg‘: ‘註冊成功!‘, ‘msg_code‘: 0} else: res = {‘msg‘:‘必填字段未填,請查看接口文檔!‘,‘msg_code‘:1001} return json.dumps(res,ensure_ascii=False) @server.route(‘/login‘,methods=[‘post‘])#登錄接口 def login(): username = flask.request.values.get(‘username‘) pwd = flask.request.values.get(‘passwd‘) if username and pwd: if my_redis(‘dr_user:%s‘%username): if my_redis(‘dr_user:%s‘%username)== my_md5(pwd): if my_redis(‘dr_sessionid:%s‘%username):#判斷是否已經登錄 res = json.loads(my_redis(‘dr_sessionid:%s‘%username)) print(‘已經登錄過了走這裏‘) else: print(‘第一次登錄走這裏。。。‘) sessionid = my_md5(‘dr_user:%s‘%username + str(int(time.time())))#計算seesionid login_time = time.strftime(‘%Y%m%d%H%M%S‘) res = {"sessiond": sessionid, "login_time": login_time} #構造好字典 my_redis(‘dr_sessionid:%s‘%username,json.dumps(res,ensure_ascii=False),3600)#res轉為json寫入redis else: res = {‘msg‘: ‘密碼錯誤‘, ‘msg_code‘: 2001} else: res = {‘msg‘: ‘用戶不存在‘, ‘msg_code‘: 2001} else: res = {‘msg‘: ‘必填字段未填,請查看接口文檔!‘, ‘msg_code‘: 1001} return json.dumps(res,ensure_ascii=False)
(4)在bin下創建一個start.py文件,用來啟動服務
from lib.interface import server from etc.setting import SERVER_PORT server.run(host = ‘0.0.0.0‘,port=SERVER_PORT,debug=True)
至此,模塊結構調整完成,運行start.py即可啟動程序。
Python學習筆記十六_模塊結構調整