一、为什么要进行模块结构调整

  当一个脚本中有大量的配置、方法及接口时,脚本显得十分臃肿,可读性很差。为了提高代码的易读性,可以将一个繁杂的脚本根据不同的功能放在不同的目录下分类管理,这整个过程叫做模块结构调整。完成模块结构调整后的代码可读性强,修改起来也更简单,调整后的代码在任何服务器、操作系统都可以执行,不会报错。

二、模块结构调整实例

注册接口

  (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':'', #密码
  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即可启动程序。

Python学习之==>模块结构调整的更多相关文章

  1. Python学习--Selenium模块

    1. Python学习--Selenium模块介绍(1) 2.Python学习--Selenium模块学习(2) 其他: 1. Python学习--打码平台

  2. Python学习--Selenium模块学习(2)

    Selenium的基本操作 获取浏览器驱动寻找方式 1. 通过手动指定浏览器驱动路径2. 通过 `$PATH`环境变量找寻浏览器驱动 可参考Python学习--Selenium模块简单介绍(1) 控制 ...

  3. Python学习---重点模块的学习【all】

    time     [时间模块] import time # print(help(time)) # time模块的帮助 print(time.time()) # 时间戳 print(time.cloc ...

  4. python学习——常用模块

    在学习常用模块时我们应该知道模块和包是什么,关于模块和包会单独写一篇随笔,下面先来了解有关在python中的几个常用模块. 一.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文 ...

  5. Python学习之模块进程函数详解

    今天在看<Beginning Linux Programming>中的进程相关部分,讲到Linux几个进程相关的系统函数: system , exec , fork ,wait . Pyt ...

  6. Python学习(22):模块

    转自 http://www.cnblogs.com/BeginMan/p/3183656.html 一.模块基础 1.模块 自我包含,且有组织的代码片段就是模块 模块是Pyhon最高级别的程序组织单元 ...

  7. Python学习之模块基础

    模块就是程序 编写以下简单代码 print('hello python') 并将py文件保存在c盘的python(假设新建)文件下,通过pycharm的Terminal 或者windom命令窗口调出p ...

  8. python学习之模块导入,操作邮件,redis

    python基础学习06 模块导入 导入模块的顺序 1.先从当前目录下找 2.当前目录下找不到,再从环境变量中找,如果在同时在当前目录和环境变量中建立相同的py文件,优先使用当前目录下的 导入模块的实 ...

  9. python学习笔记-模块和包

    模块导入方法 1.import 语句 import module1[,module2[,...moduleN]] 当我们使用import语句的时候,Python解释器是怎么找到对应对文件对呢?答案是解 ...

随机推荐

  1. linux ssh连接超时断连设置

    以下均针对redhat6.5系统进行说明. 一.设置ssh超时断连 使用root用户,编辑/etc/profile文件,在 HOSTNAME='/bin/hostname' HISTIZE=30 后增 ...

  2. 理解BurpSuit Intruder几种攻击方式

    Intruder标签下有四种攻击方式 Sniper Battering Ram Pitchfork Cluster Bomb 假设用户名密码词典分别如下: user1,user2,usre3 pass ...

  3. [SCOI2016]幸运数字(线性基,倍增)

    [SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...

  4. git每次更新都需要输入账号密码,如何解决?

    //如果https请求pull每次都需要输入账号密码,则 git config --global credential.helper store   那么,在下一次更新,需要输入账号密码,然后git就 ...

  5. 连接gitlab

    https://www.cnblogs.com/mengyu/p/7761340.html 一.PyCharm配置Git的环境 1.PyCharm 连接Git首先需要本机安装Git软件; 2.PyCh ...

  6. 洛谷P5055 可持久化文艺平衡树 (可持久化treap)

    题目链接 文艺平衡树的可持久化版,可以使用treap实现. 作为序列使用的treap相对splay的优点如下: 1.代码短 2.容易实现可持久化 3.边界处理方便(splay常常需要在左右两端加上保护 ...

  7. java 死锁演示

    java 死锁演示 java死锁 模拟死锁生成 死锁是由多个线程竞争同一个资源导致 package com.feshfans; /** * 1. 本代码为展示 java 中死锁的产生 * 2. 死锁的 ...

  8. Java 指令重排

    Java 指令重排 java 指令重排 package com.feshfans; /** * 用来演示指令重排 * 指令重排会发生在两个阶段: * 1. 编译期(jvm 加载字节码时) * 2. c ...

  9. curl检查访问网页返回的状态码

    urls=('www.baidu.com' 'mm.yellowurl.cn' 'm.yellowurl.cn' 'http://m.yellowurl.cn/product/a.html'); fo ...

  10. Css min-height max-height min-width max-height

    Css min-height应用地方解释我们有时设置一个对象盒子时候避免对象没有内容时候不能撑开,但内容多少不能确定所以又不能固定高度,这个时候我们就会需要css来设置min-height最小高度撑高 ...