Python学习之==>模块结构调整
一、为什么要进行模块结构调整
当一个脚本中有大量的配置、方法及接口时,脚本显得十分臃肿,可读性很差。为了提高代码的易读性,可以将一个繁杂的脚本根据不同的功能放在不同的目录下分类管理,这整个过程叫做模块结构调整。完成模块结构调整后的代码可读性强,修改起来也更简单,调整后的代码在任何服务器、操作系统都可以执行,不会报错。
二、模块结构调整实例
注册接口
(1)注册信息存入redis数据库
(2)redis的key用string类型的,密码使用md5加密
(3)注册时需要校验用户是否已经被注册
登录接口
(1)登录成功之后,返回seesionid、用户登录时间
(2)如果用户是第一次登录或者seesion已失效,需要在redis中存入session。sessionid计算规则:(用户名+当前的时间戳 )md5加密,失效时间是60分钟
(3)存入redis的session格式如下:
Key:session:niuniu
Value:{"seessionid":a5dfcb047721e02a6f8bff779c815165,"login_time":201805051820}
(4)如果已经登录且未失效,则直接返回session和用户登录时间
1、创建API主目录及其下面各子目录
(1)bin:存放启动服务的可执行脚本
(2)config:存放配置文件,如mysql, redis的配置信息
(3)data:存放sql语句,创建表格或者类似的东西
(4)lib:存放开发使用到的函数和开发好的接口
(5)logs:存放日志文件
(6)readme:简要介绍程序运行及参数修改的说明文档
2、将主目录(my_api)加入环境变量
各个模块(文件)放在不同的目录下相互引用,引用自己写的的Python文件做为模块时需要将路径加入环境变量,否则会报错。选中主目录右键→Mark Directory as→Sources Root后,Pycharm将整个api文件夹统一加入环境变量。但这种方式只对这台机器有效果,如果换一台机器或者把这个my_api项目放到服务器上执行,这种方式是不行的。所以一般使用这种方式加入环境变量是便于我们在Pycharm上编写和调试代码,另外一种加入环境变量的方式会在后面讲到。
3、将不同功能的Python文件放入对应的目录
a、将配置文件setting.py文件放入config目录下,存入要用到的配置参数,如:REDIS、MySQL配置信息以及服务端口等。
1 # redis配置信息 2 REDIS_INFO = { 3 'host':'127.0.0.1',#IP 4 'password':'', #密码 5 'db':1, #数据库 6 'port':6379, #端口号 7 } 8 9 # mysql配置信息 10 MYSQL_INFO = { 11 'host':'192.168.1.112',#IP 12 'user':'test', #用户名 13 'passwd':'123456', #密码 14 'db':'test', #数据库 15 'port':3306, #端口号 16 'charset':'utf8', #字符集 17 } 18 19 # 服务端口号 20 SERVER_PORT = 8888
b、tools.py文件放入lib目录下,存放操作REDIS、MySQL以及MD5加密函数
1 from config.setting import MYSQL_INFO,REDIS_INFO # 从config.setting文件导入REDIS和MYSQL连接参数 2 # 连接mysql 3 def my_db(sql): 4 import pymysql 5 conn = pymysql.connect(**MYSQL_INFO) 6 cur = conn.cursor() 7 cur.execute(sql) 8 if sql.strip().split()[0].upper() == 'SELECT': 9 res = cur.fetchall() 10 else: 11 conn.commit() 12 res = 'OK' 13 cur.close() 14 conn.close() 15 return res 16 17 # 操作redis 18 def op_redis(k,v=None,time=None): 19 import redis 20 r = redis.Redis(**REDIS_INFO) 21 if v: 22 r.set(k,v,time) 23 res = 'ok' 24 else: 25 res = r.get(k) 26 if res: 27 res = res.decode() 28 return res 29 30 # 加密函数 31 def my_md5(str): 32 import hashlib 33 new_str = str.encode() 34 m = hashlib.md5() 35 m.update(new_str) 36 return m.hexdigest()
c、interface.py文件放入lib目录下,存放注册及登录接口
1 import flask,json 2 server = flask.Flask(__name__) #把当前这个python文件当作一个服务 3 from lib.tools import my_md5,op_redis 4 @server.route('/reg',methods=['post']) #'reg'是接口路径,如果methods不写,则默认get请求 5 def reg(): 6 username =flask.request.values.get('username') 7 pwd = flask.request.values.get('pwd') 8 if username and pwd: 9 key = 'user:%s'%username 10 if op_redis(key): # 判断用户是否存在 11 res = {'msg':'用户已存在','msg_code':2001} 12 else: # 不存在则将用户名和密码写入redis数据库 13 value = my_md5(pwd) 14 op_redis(key,value) 15 res = {'msg':'注册成功','msg_code':0000} 16 else: 17 res = {'msg':'必填字段未填,请查看接口文档!','msg_code':1001} 18 return json.dumps(res,ensure_ascii=False) 19 20 @server.route('/login',methods= ['post']) 21 def login(): 22 import time 23 username =flask.request.values.get('username') 24 pwd = flask.request.values.get('pwd') 25 if username and pwd: 26 user_key = 'user:%s'%username # 存放用户信息的key 27 passed = op_redis(user_key) 28 session_key = 'session:%s'%username # 存放登录session的key 29 session = op_redis(session_key) 30 if passed: 31 if my_md5(pwd) == passed: 32 if session: # 判断之前有没有登录过 33 res = json.loads(session) 34 else: # 之前没有登录过则将session写入redis数据库 35 login_time = str(time.strftime('%Y%m%d%H%M%S')) 36 sessionid = my_md5(username + str(time.time())) # 计算sessionid 37 res = {'sessionid': sessionid, 'login_time': login_time} # 构造好字典 38 op_redis(session_key,json.dumps(res),600) # 将session存入redis并设置失效时间 39 else: 40 res = {'msg':'密码错误','msg_code':2001} 41 else: 42 res = {'msg':'用户不存在','msg_code':2001} 43 else: 44 res = {'msg':'用户名或密码必填','msg_code':1001} 45 return json.dumps(res,ensure_ascii=False)
d、start.py文件放入bin目录下,用来启动服务
1 # 手工加环境变量,这样项目在任何环境任何系统中执行都不会报错 2 import sys,os 3 BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 获取到当前程序的主目录 4 sys.path.insert(0,BASE_PATH) # 将程序主目录加入python环境变量 5 6 from lib.interface import server 7 from config.setting import SERVER_PORT 8 server.run(host='0.0.0.0',port=SERVER_PORT,debug=True)
至此,模块结构调整完成,运行start.py即可启动程序。