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即可启动程序。

posted on 2018-06-26 14:27  破解孤独  阅读(284)  评论(0编辑  收藏  举报

导航