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配置信息以及服务端口等。
# redis配置信息
REDIS_INFO = {
'host':'127.0.0.1',#IP
'password':'', #密码
'db':1, #数据库
'port':6379, #端口号
} # mysql配置信息
MYSQL_INFO = {
'host':'192.168.1.112',#IP
'user':'test', #用户名
'passwd':'', #密码
'db':'test', #数据库
'port':3306, #端口号
'charset':'utf8', #字符集
} # 服务端口号
SERVER_PORT = 8888
b、tools.py文件放入lib目录下,存放操作REDIS、MySQL以及MD5加密函数
from config.setting import MYSQL_INFO,REDIS_INFO # 从config.setting文件导入REDIS和MYSQL连接参数
# 连接mysql
def my_db(sql):
import pymysql
conn = pymysql.connect(**MYSQL_INFO)
cur = conn.cursor()
cur.execute(sql)
if sql.strip().split()[0].upper() == 'SELECT':
res = cur.fetchall()
else:
conn.commit()
res = 'OK'
cur.close()
conn.close()
return res # 操作redis
def op_redis(k,v=None,time=None):
import redis
r = redis.Redis(**REDIS_INFO)
if v:
r.set(k,v,time)
res = 'ok'
else:
res = r.get(k)
if res:
res = res.decode()
return res # 加密函数
def my_md5(str):
import hashlib
new_str = str.encode()
m = hashlib.md5()
m.update(new_str)
return m.hexdigest()
c、interface.py文件放入lib目录下,存放注册及登录接口
import flask,json
server = flask.Flask(__name__) #把当前这个python文件当作一个服务
from lib.tools import my_md5,op_redis
@server.route('/reg',methods=['post']) #'reg'是接口路径,如果methods不写,则默认get请求
def reg():
username =flask.request.values.get('username')
pwd = flask.request.values.get('pwd')
if username and pwd:
key = 'user:%s'%username
if op_redis(key): # 判断用户是否存在
res = {'msg':'用户已存在','msg_code':2001}
else: # 不存在则将用户名和密码写入redis数据库
value = my_md5(pwd)
op_redis(key,value)
res = {'msg':'注册成功','msg_code':0000}
else:
res = {'msg':'必填字段未填,请查看接口文档!','msg_code':1001}
return json.dumps(res,ensure_ascii=False) @server.route('/login',methods= ['post'])
def login():
import time
username =flask.request.values.get('username')
pwd = flask.request.values.get('pwd')
if username and pwd:
user_key = 'user:%s'%username # 存放用户信息的key
passed = op_redis(user_key)
session_key = 'session:%s'%username # 存放登录session的key
session = op_redis(session_key)
if passed:
if my_md5(pwd) == passed:
if session: # 判断之前有没有登录过
res = json.loads(session)
else: # 之前没有登录过则将session写入redis数据库
login_time = str(time.strftime('%Y%m%d%H%M%S'))
sessionid = my_md5(username + str(time.time())) # 计算sessionid
res = {'sessionid': sessionid, 'login_time': login_time} # 构造好字典
op_redis(session_key,json.dumps(res),600) # 将session存入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)
d、start.py文件放入bin目录下,用来启动服务
# 手工加环境变量,这样项目在任何环境任何系统中执行都不会报错
import sys,os
BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 获取到当前程序的主目录
sys.path.insert(0,BASE_PATH) # 将程序主目录加入python环境变量 from lib.interface import server
from config.setting import SERVER_PORT
server.run(host='0.0.0.0',port=SERVER_PORT,debug=True)
至此,模块结构调整完成,运行start.py即可启动程序。
Python学习之==>模块结构调整的更多相关文章
- Python学习--Selenium模块
1. Python学习--Selenium模块介绍(1) 2.Python学习--Selenium模块学习(2) 其他: 1. Python学习--打码平台
- Python学习--Selenium模块学习(2)
Selenium的基本操作 获取浏览器驱动寻找方式 1. 通过手动指定浏览器驱动路径2. 通过 `$PATH`环境变量找寻浏览器驱动 可参考Python学习--Selenium模块简单介绍(1) 控制 ...
- Python学习---重点模块的学习【all】
time [时间模块] import time # print(help(time)) # time模块的帮助 print(time.time()) # 时间戳 print(time.cloc ...
- python学习——常用模块
在学习常用模块时我们应该知道模块和包是什么,关于模块和包会单独写一篇随笔,下面先来了解有关在python中的几个常用模块. 一.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文 ...
- Python学习之模块进程函数详解
今天在看<Beginning Linux Programming>中的进程相关部分,讲到Linux几个进程相关的系统函数: system , exec , fork ,wait . Pyt ...
- Python学习(22):模块
转自 http://www.cnblogs.com/BeginMan/p/3183656.html 一.模块基础 1.模块 自我包含,且有组织的代码片段就是模块 模块是Pyhon最高级别的程序组织单元 ...
- Python学习之模块基础
模块就是程序 编写以下简单代码 print('hello python') 并将py文件保存在c盘的python(假设新建)文件下,通过pycharm的Terminal 或者windom命令窗口调出p ...
- python学习之模块导入,操作邮件,redis
python基础学习06 模块导入 导入模块的顺序 1.先从当前目录下找 2.当前目录下找不到,再从环境变量中找,如果在同时在当前目录和环境变量中建立相同的py文件,优先使用当前目录下的 导入模块的实 ...
- python学习笔记-模块和包
模块导入方法 1.import 语句 import module1[,module2[,...moduleN]] 当我们使用import语句的时候,Python解释器是怎么找到对应对文件对呢?答案是解 ...
随机推荐
- bcdedit删除uefi多余项
1.检查是否有多余的启动项:用管理员权限的cmd运行Bcdedit /enum firmware 2.保存现在的所有引导项Bcdedit /export savebcdsavebcd是导出的文件名 3 ...
- 【ESXI6.0】 ESXI6.0安装时无法安装网卡驱动的解决方法及将网卡驱动加载进ISO
http://blog.163.com/xifanliang@yeah/blog/static/115078488201571584321787/ 若安装时提示如下图所示 之后安装无法完成,会提示没有 ...
- django笔记三之admin的管理
django笔记三之admin的管理 设置自动admin应用 vim todos/settings.py INSTALLED_APPS = ( 'django.contrib.admin', 新版本已 ...
- java数据结构复习01
1.数组 package javaDataStruct.array01; public class MyArray { private int[] arr; // 表示有效数据的长度 private ...
- react-native启动时红屏报错:Unable to load script.Make sure you're either running a metro server or that ....
一.报错信息内容 我是在Android Studio中运行启动react-native项目时报的这个错误 1.报错提示:Unable to load script.Make sure you're e ...
- element 表单校验失败自动聚焦到失败的input框
1.在对应的input框上添加ref属性,直接根据ref就可精确地获取到元素 <el-form-item label="课程名称" :label-width="fo ...
- 动态添加+动态绑定(vue数据驱动思路)
先上案例 首先来分析一下,勾选科目的时候,下面同时增加科目的满分值设置. 以前写jquery的思路:当勾选的时候创建dom节点,然后把dom节点append到父节点上,项目采用前后分离的方式进行交互, ...
- IPython的简单介绍
量化投资与Python 目录: 一.量化投资第三方相关模块 NumPy:数组批量计算 Pandas:表计算与数据分析 Matplotlib:图表绘制 二.IPython的介绍 IPython:和Pyt ...
- ZROI 19.08.02 杂题选讲
给出\(n\)个数,用最少的\(2^k\)或\(-2^{k}\),使得能拼出所有数,输出方案.\(n,|a_i|\leq 10^5\). 显然一个绝对值最多选一次.这个性质非常强. 如果所有都是偶数, ...
- 3828. 三角形计数 3829. ZCC loves Isaac 3830. 字符消除
3828 给定n个点的坐标(0<=xi,yi<=10000)求选出任意三个点能组成的三角形的总面积. 题解 太naive了 枚举三角形的y最小的点,把剩余的点按角度排序 然后随便算,可以用 ...