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

转载于:https://www.cnblogs.com/L-Test/p/9228439.html

pip install --upgrade langchain Requirement already satisfied: langchain in d:\leranapp\anaconda3\envs\spyder\lib\site-packages (1.0.7)Note: you may need to restart the kernel to use updated packages. Requirement already satisfied: langchain-core<2.0.0,>=1.0.4 in d:\leranapp\anaconda3\envs\spyder\lib\site-packages (from langchain) (1.0.5) Requirement already satisfied: langgraph<1.1.0,>=1.0.2 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langchain) (1.0.3) Requirement already satisfied: pydantic<3.0.0,>=2.7.4 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langchain) (2.12.4) Requirement already satisfied: jsonpatch<2.0.0,>=1.33.0 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langchain-core<2.0.0,>=1.0.4->langchain) (1.33) Requirement already satisfied: langsmith<1.0.0,>=0.3.45 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langchain-core<2.0.0,>=1.0.4->langchain) (0.4.43) Requirement already satisfied: packaging<26.0.0,>=23.2.0 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langchain-core<2.0.0,>=1.0.4->langchain) (25.0) Requirement already satisfied: pyyaml<7.0.0,>=5.3.0 in d:\leranapp\anaconda3\envs\spyder\lib\site-packages (from langchain-core<2.0.0,>=1.0.4->langchain) (6.0.2) Requirement already satisfied: tenacity!=8.4.0,<10.0.0,>=8.1.0 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langchain-core<2.0.0,>=1.0.4->langchain) (9.1.2) Requirement already satisfied: typing-extensions<5.0.0,>=4.7.0 in d:\leranapp\anaconda3\envs\spyder\lib\site-packages (from langchain-core<2.0.0,>=1.0.4->langchain) (4.15.0) Requirement already satisfied: jsonpointer>=1.9 in c:\users\15180\appdata\roaming\python\python313\site-packages (from jsonpatch<2.0.0,>=1.33.0->langchain-core<2.0.0,>=1.0.4->langchain) (3.0.0) Requirement already satisfied: langgraph-checkpoint<4.0.0,>=2.1.0 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langgraph<1.1.0,>=1.0.2->langchain) (3.0.1) Requirement already satisfied: langgraph-prebuilt<1.1.0,>=1.0.2 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langgraph<1.1.0,>=1.0.2->langchain) (1.0.4) Requirement already satisfied: langgraph-sdk<0.3.0,>=0.2.2 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langgraph<1.1.0,>=1.0.2->langchain) (0.2.9) Requirement already satisfied: xxhash>=3.5.0 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langgraph<1.1.0,>=1.0.2->langchain) (3.6.0) Requirement already satisfied: ormsgpack>=1.12.0 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langgraph-checkpoint<4.0.0,>=2.1.0->langgraph<1.1.0,>=1.0.2->langchain) (1.12.0) Requirement already satisfied: httpx>=0.25.2 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langgraph-sdk<0.3.0,>=0.2.2->langgraph<1.1.0,>=1.0.2->langchain) (0.28.1) Requirement already satisfied: orjson>=3.10.1 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langgraph-sdk<0.3.0,>=0.2.2->langgraph<1.1.0,>=1.0.2->langchain) (3.11.4) Requirement already satisfied: requests-toolbelt>=1.0.0 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langsmith<1.0.0,>=0.3.45->langchain-core<2.0.0,>=1.0.4->langchain) (1.0.0) Requirement already satisfied: requests>=2.0.0 in d:\leranapp\anaconda3\envs\spyder\lib\site-packages (from langsmith<1.0.0,>=0.3.45->langchain-core<2.0.0,>=1.0.4->langchain) (2.32.5) Requirement already satisfied: zstandard>=0.23.0 in c:\users\15180\appdata\roaming\python\python313\site-packages (from langsmith<1.0.0,>=0.3.45->langchain-core<2.0.0,>=1.0.4->langchain) (0.25.0) Requirement already satisfied: anyio in c:\users\15180\appdata\roaming\python\python313\site-packages (from httpx>=0.25.2->langgraph-sdk<0.3.0,>=0.2.2->langgraph<1.1.0,>=1.0.2->langchain) (4.11.0) Requirement already satisfied: certifi in d:\leranapp\anaconda3\envs\spyder\lib\site-packages (from httpx>=0.25.2->langgraph-sdk<0.3.0,>=0.2.2->langgraph<1.1.0,>=1.0.2->langchain) (2025.11.12) Requirement already satisfied: httpcore==1.* in c:\users\15180\appdata\roaming\python\python313\site-packages (from httpx>=0.25.2->langgraph-sdk<0.3.0,>=0.2.2->langgraph<1.1.0,>=1.0.2->langchain) (1.0.9) Requirement already satisfied: idna in d:\leranapp\anaconda3\envs\spyder\lib\site-packages (from httpx>=0.25.2->langgraph-sdk<0.3.0,>=0.2.2->langgraph<1.1.0,>=1.0.2->langchain) (3.11) Requirement already satisfied: h11>=0.16 in c:\users\15180\appdata\roaming\python\python313\site-packages (from httpcore==1.*->httpx>=0.25.2->langgraph-sdk<0.3.0,>=0.2.2->langgraph<1.1.0,>=1.0.2->langchain) (0.16.0) Requirement already satisfied: annotated-types>=0.6.0 in c:\users\15180\appdata\roaming\python\python313\site-packages (from pydantic<3.0.0,>=2.7.4->langchain) (0.7.0) Requirement already satisfied: pydantic-core==2.41.5 in c:\users\15180\appdata\roaming\python\python313\site-packages (from pydantic<3.0.0,>=2.7.4->langchain) (2.41.5) Requirement already satisfied: typing-inspection>=0.4.2 in c:\users\15180\appdata\roaming\python\python313\site-packages (from pydantic<3.0.0,>=2.7.4->langchain) (0.4.2) Requirement already satisfied: charset_normalizer<4,>=2 in d:\leranapp\anaconda3\envs\spyder\lib\site-packages (from requests>=2.0.0->langsmith<1.0.0,>=0.3.45->langchain-core<2.0.0,>=1.0.4->langchain) (3.4.4) Requirement already satisfied: urllib3<3,>=1.21.1 in d:\leranapp\anaconda3\envs\spyder\lib\site-packages (from requests>=2.0.0->langsmith<1.0.0,>=0.3.45->langchain-core<2.0.0,>=1.0.4->langchain) (2.3.0) Requirement already satisfied: sniffio>=1.1 in c:\users\15180\appdata\roaming\python\python313\site-packages (from anyio->httpx>=0.25.2->langgraph-sdk<0.3.0,>=0.2.2->langgraph<1.1.0,>=1.0.2->langchain) (1.3.1) WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/langchain/ WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/langchain/
最新发布
11-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值