zoukankan      html  css  js  c++  java
  • 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即可启动程序。

  • 相关阅读:
    jupytr notebook远程登录Linux服务器,切换conda虚拟环境
    Linux 命令su 和 su -执行机制的区别
    Shell编程知识4-su详细
    Shell编程知识3
    Shell编程知识2
    Ubuntu # echo $PATH //查看当前用户的环境变量--》修改配置环境变量
    Util和Helper类
    Qt QBarSeries简易柱状图教程
    解决QIcon引用qrc不显示图片
    qt调用quit()后未结束线程解决方案
  • 原文地址:https://www.cnblogs.com/L-Test/p/9228439.html
Copyright © 2011-2022 走看看