Python学习笔记十六_模块结构调整

Posted 忻冉然

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习笔记十六_模块结构调整相关的知识,希望对你有一定的参考价值。

一、什么是模块结构调整

  当一个脚本中有大量的配置、方法及接口时,脚本往往显得十分臃肿。为了代码更易读,可以将一个繁杂的脚本根据不同的功能放在不同的文件夹中分类管理,即模块结构调整。

二、模块结构调整实例

下面根据一个具体的例子来看一下如何拆分调整代码

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

 

以上是关于Python学习笔记十六_模块结构调整的主要内容,如果未能解决你的问题,请参考以下文章

python学习第四十六天dir( )函数用法

Python学习笔记十_模块第三方模块安装模块导入

学习python课程第十六天

python学习笔记:常用模块

python学习笔记:常用模块

python基础学习笔记——Python基础教程(第2版 修订版)第十章(充电时刻)