一、什么是模块结构调整
当一个脚本中有大量的配置、方法及接口时,脚本往往显得十分臃肿。为了代码更易读,可以将一个繁杂的脚本根据不同的功能放在不同的文件夹中分类管理,即模块结构调整。
二、模块结构调整实例
下面根据一个具体的例子来看一下如何拆分调整代码
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() return res 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即可启动程序。