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

原文地址:https://www.cnblogs.com/dongrui624/p/9052652.html

时间: 2024-09-30 00:55:46

Python学习笔记十六_模块结构调整的相关文章

python学习笔记十六 django深入学习一

django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), #精确匹配 url(r'^articles/([0-9]{4})/$', views.year_archive), #动态路由 url(r'^articles/([0-9]{4})/([0-9]{2

python学习笔记(十六) - ORM框架(SQLAlchemy)

所谓的ORM就是Object-Relational Mapping,把关系数据库的表结果映射到对象上. 1. 安装SQLAlchemy: easy_install sqlalchemy 2. 导入SQLAlchemy,并初始化DBSession: # 导入: from sqlalchemy import Column, String, create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declara

Python学习笔记十五_开发接口

1.mock接口,模拟一些接口,在别的接口没有开发好的时候,你需要用它 假的支付接口,模拟支付成功 2. 3.查看数据,避免直接操作数据库flask web开发框架 实例化server 装饰器,下面的函数变为一个接口 启动服务 import flask,json #__name__代表当前这个python文件 server = flask.Flask(__name__)#实例化server,把当前这个python文件,当做一个服务 def my_db(sql): import pymysql c

Python学习系列(六)(模块)

一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块. 引入模块的几种方式: i)引入模块:import   moduleName ii)引入模块下的函数:from moduleName import function1,function2,-- iii)引入模块下的所有函数:from moduleName import * 使用模块里的函数的方法: moduleName.function(agrs) 示例: >>> import math >

python学习笔记十——异常处理

1.try: command except 错误类型,记录错误信息变量: command finally: command try...finally的用处是无论是否发生异常都要确保资源释放代码的执行.一般来说,如果没有发生错误,执行过try语句块之后执行finally语句块,完成整个流程.如果try语句块发生了异常,抛出了这个异常,此时就马上进入finally语句块进行资源释放处理.如下从几个细节讨论finally的特性. 1).try中的return: 当在try语句块中含有return语句

C++学习笔记十六-模板和泛型编程(二)

C++学习笔记十六-模板和泛型编程(二) 16.4 类模板成员 1.模板作用域中模板类型的引用: 通常,当使用类模板的名字的时候,必须指定模板形参.这一规则有个例外:在类本身的作用域内部,可以使用类模板的非限定名.例如,在默认构造函数和复制构造函数的声明中,名字 Queue 是 Queue<Type> 缩写表示.实质上,编译器推断,当我们引用类的名字时,引用的是同一版本.因此,复制构造函数定义其实等价于: Queue<Type>(const Queue<Type> &a

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

一.模块.包 1.模块 模块实质上就是一个python文件.它是用来组织代码的,意思就是把python代码写到里面,文件名就是模块的名称,test.py test就是模块的名称 2.包 包,package本质就是一个文件夹,和文件夹不一样的是它有一个__init__.py文件.包是从逻辑上来组织模块的,也就是说它是用来存放模块的,如果想到如其他目录下的模块,那么这个目录必须是一个包才可以导入. 二.模块分类 1.标准模块.标准包 python自带的这些模块,直接import就能用的 import

python学习笔记十五 web框架

python Web程序 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. Python的WEB框架分为两类: 自己写socket,自己处理请求 基于wsgi(Web Server Gateway Interface WEB服务网关接口,实现socket功能),自己处理请求 如图示: 自己写的web框架 #!/usr/bin/env python #coding:utf-8 import socket def handle_req

MYSQL进阶学习笔记十六:MySQL 监控!(视频序号:进阶_35)

知识点十六:MySQL监控(35) 一.为什么使用MySQL监控 随着软件后期的不断升级,myssql的服务器数量越来越多,软硬件故障的发生概率也越来越高.这个时候就需要一套监控系统,当主机发生异常时,此时通过监控系统发现和处理. 这个监控实际上是在我们的开发完成之后,这个时候软件就开始在运行,这个运行我们就需要去关注到mysql服务器是否正常,那么我们要观察它就需要给它提供一些监控,这监控就是当它发生故障之后, 那么我们这个监控就会告诉我们到底什么地方发生了一些异常或者一些错误,这个时候我们就