Python 电商API 开发最佳实践
一、简介
当你打卡了一家北京最具有地中海特色的餐厅,当我们在餐厅点餐时,服务员会给我们一份菜单,菜单上列出了所有可供选择的菜品和饮料。我们可以在菜单上选择我们想要的食物和饮料,然后告诉服务员我们的选择。服务员会根据我们的选择来准备和提供食物和饮料。这就像是应用程序使用接口来与其他应用程序进行交互。在计算机编程中,接口就像是一份菜单,上面列出了不同的功能或服务。应用程序可以使用接口来获取需要的数据或执行所需的操作。就像在餐厅点餐时,我们选择想要的食物和饮料一样,应用程序也可以从接口中选择所需的服务或功能,并执行相应的操作。
当我们使用微信小程序时,我们实际上是在使用微信小程序的接口来获取所需的数据和执行所需的操作。例如,当我们在微信小程序中查看天气预报时,小程序会使用天气预报API来获取最新的天气信息,并将其显示在小程序中。
1.什么是API
API,全称为Application Programming Interface,即应用程序编程接口。它是一组定义软件组件之间交互的协议、接口和工具集,它允许软件系统之间的相互通信和交互,使得开发者可以在自己的应用程序中使用其他应用程序的功能和数据,从而提高开发效率和增加程序功能。通俗来说,API就是两个软件之间交互的桥梁。
2.为什么需要API
更好地管理和控制数据:API可以实现访问控制,只允许授权的用户或APP访问。数据加密,使用HTTPS协议来加密数据传输,以防止第三方窃取数据或进行恶意攻击。监控数据访问次数和审计访问情况来防止滥用。这些安全功能可以帮助开发者和企业保护数据免受潜在的威胁和攻击,并提高数据的完整性和保密性。
更快速地开发和部署应用程序:通过使用API,开发者可以利用现有的代码和工具来加速应用程序的开发和部署过程。这可以让开发者专注于应用程序的核心业务逻辑,而不必花费大量时间来实现常规功能。比如支付宝和微信支付的API,商家可以通过这些API将支付宝和微信支付集成到他们的电子商务网站中。这使得商家能够直接使用支付功能而不需要去考虑该功能实现的细节。
更好地满足客户需求:通过使用API,开发者可以快速地响应客户需求,并提供更好的用户体验。API可以为客户提供更多的功能和数据,从而满足他们的需求。
3.API开发基本步骤
确定电商API的需求和功能:输入、输出、请求类型等。
选择编程语言和框架:根据需求选择适当的编程语言和框架。常用的语言有Python、Java、C#等,常用的框架有Flask、Django、Express等。
数据结构:包括JSON格式、XML格式等。
业务逻辑:根据需求编写对应的业务逻辑代码。
路由和请求处理逻辑:根据请求类型和请求路径编写路由和请求处理逻辑。
安全和身份验证:key,acces_id
编写API的文档和测试:编写API的文档和测试用例,确保API的正确性和可用性。
部署API:部署到云端或服务器上,供其他应用程序使用。
4.命名规范
需要注意的是,API的设计和实现需要遵循一些最佳实践,如良好的命名规范。API的命名规范可以根据具体的项目和开发团队的约定而有所不同,但以下是一些通用的命名规范:
使用有意义的URI命名:API的URI应该描述API提供的资源或功能。例如,/api/users可以用于获取所有用户,而/api/users/123可以用于获取ID为123的特定用户。这样的URI命名可以提高API的可读性和可维护性。
使用HTTP方法命名:API的HTTP方法应该与执行的操作相关联。例如,使用GET方法获取资源,使用POST方法创建资源,使用PUT方法更新资源,使用DELETE方法删除资源。这样的方法命名可以使API更易于理解和使用。
遵循命名惯例:API应该使用一致的命名惯例,以提高可读性和可维护性。例如,使用小写字母和连字符分隔单词作为URI的组成部分,并使用下划线分隔单词作为请求参数和响应体的键名。
避免使用动词:API的URI应该描述资源或功能,而不是操作。例如,/api/users可以用于获取用户,而不是/api/get_users。
遵循RESTful设计风格:RESTful是一种常用的API设计风格,它将API建模为资源的集合,并使用标准HTTP方法执行操作。遵循RESTful设计风格可以使API更易于理解和使用。
总之,API的命名应该是简单、有意义、易于理解和维护的。遵循上述命名规范可以帮助开发人员创建高质量、易于使用和维护的API。
5.API 错误处理机制
在 API 开发中,错误处理是非常重要的一环。合理的错误处理机制可以让 API 更加健壮、可靠、易用。下面是常见的 API 错误处理机制:
HTTP 状态码:
from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/users/<int:user_id>', methods=['GET'])def get_user(user_id):# 根据 user_id 获取用户信息user = get_user_by_id(user_id)if user:# 返回用户信息return jsonify(user), 200else:# 返回错误信息和 404 状态码return jsonify({'error': 'User not found'}), 404
错误信息:
from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/users', methods=['POST'])def create_user():# 获取 POST 请求中的数据data = request.get_json()if not data or 'name' not in data or 'age' not in data:# 返回错误信息和 400 状态码return jsonify({'error': 'Name and age are required'}), 400else:# 创建用户,并返回用户信息和 201 状态码user = create_new_user(data['name'], data['age'])return jsonify(user), 201
日志记录:
import loggingapp = Flask(__name__)logging.basicConfig(level=logging.INFO)@app.route('/users', methods=['GET'])def get_users():try:# 获取所有用户信息users = get_all_users()# 返回用户信息return jsonify(users), 200except Exception as e:# 记录错误日志,并返回错误信息和 500 状态码logging.error('Error occurred: {}'.format(str(e)))return jsonify({'error': 'Internal server error'}), 500
API 鉴权:
from flask import Flask, jsonify, requestfrom functools import wrapsapp = Flask(__name__)def authenticate(func):@wraps(func)def wrapper(*args, **kwargs):# 验证客户端身份auth = request.authorizationif not auth or not check_auth(auth.username, auth.password):# 返回错误信息和 401 状态码return jsonify({'error': 'Unauthorized access'}), 401else:# 客户端身份验证通过,执行原始函数return func(*args, **kwargs)return wrapper@app.route('/users', methods=['GET'])@authenticatedef get_users():# 获取所有用户信息users = get_all_users()# 返回用户信息return jsonify(users), 200
限流:
from flask import Flask, jsonify, requestfrom flask_limiter import Limiterfrom flask_limiter.util import get_remote_addressapp = Flask(__name__)limiter = Limiter(app, key_func=get_remote_address, default_limits=["10 per minute"])@app.route('/users', methods=['GET'])@limiter.limit("5 per minute")def get_users():# 获取所有用户信息users = get_all_users()# 返回用户信息return jsonify(users), 200
5. 实战
我们用Python写一个读取MySQL数据库的API:
import mysql.connectorfrom mysql.connector import errorcode# 连接MySQL数据库try:cnx = mysql.connector.connect(user='username', password='password',host='localhost', database='database_name')except mysql.connector.Error as err:if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:print("用户名或密码错误")elif err.errno == errorcode.ER_BAD_DB_ERROR:print("数据库不存在")else:print(err)# 创建光标cursor = cnx.cursor()# 编写SQL查询语句query = "SELECT * FROM table_name"# 执行查询语句cursor.execute(query)# 获取查询结果result = cursor.fetchall()# 遍历结果并打印for row in result:print(row)# 关闭光标和连接,这步很重要,实际操作中一定要记得关闭光标,确保安全关闭数据库连接cursor.close()cnx.close()
6. 推荐资料
以上只是简单笼统的介绍,如果想全面的了解一下API开发,推荐一些python常用的API:
> NumPy:用于数值计算的Python库。 Pandas:用于数据分析和数据操作。 Matplotlib:用于数据可视化的Python库。
> Scikit-learn:Python库,用于机器学习和数据挖掘。 TensorFlow:用于机器学习和深度学习的Python库。
> Keras:Python库,用于快速构建深度学习模型。 SQLAlchemy:Python库,用于操作和管理关系型数据库。
> Beautiful Soup:Python库,用于网页解析和数据抓取。 Requests:Python库,用于HTTP请求和数据获取。
> Jupyter Notebook:交互式编程环境,用于数据分析和可视化。
以及相关的教程:
Flask Web 开发入门:https://www.ibm.com/developerworks/cn/opensource/os-cn-flask/index.html
使用 Flask 开发 RESTful API:https://www.ibm.com/developerworks/cn/opensource/os-cn-flask-restful-api/
Django REST framework 官方文档:https://www.django-rest-framework.org/
Python API 开发实战指南:https://zhuanlan.zhihu.com/p/76577882
Python 中的 API 开发:https://zhuanlan.zhihu.com/p/38466244
如何使用 Python 开发 Web API:https://www.twilio.com/blog/how-to-build-a-web-api-with-python
Python 中的 API 设计指南:https://cloud.google.com/apis/design/
使用 Flask 和 SQLAlchemy 开发 RESTful API:https://realpython.com/flask-connexion-rest-api/
Python REST API 开发指南:https://www.codementor.io/@sagaragarwal94/building-a-basic-restful-api-in-python-58k02xsiq
这些文章涵盖了 Python API 开发的各个方面,包括 Web 开发框架的选择、RESTful API 的设计和实现、API 的安全性、性能优化等方面的内容。可以根据自己的需要选择相应的文章进行学习和实践。祝宝子们学有所得!
相关文章:
Python 电商API 开发最佳实践
一、简介 当你打卡了一家北京最具有地中海特色的餐厅,当我们在餐厅点餐时,服务员会给我们一份菜单,菜单上列出了所有可供选择的菜品和饮料。我们可以在菜单上选择我们想要的食物和饮料,然后告诉服务员我们的选择。服务员会根据我…...
JAVA基础-集合(List与Map)
目录 引言 一,Collection集合 1.1,List接口 1.1.1,ArrayList 1.1.1.1,ArrayList的add()添加方法 1.1.1.2,ArrayList的remove()删除方法 1.1.1.3,ArrayList的contai…...
19 QListWidget控件
Tips: 对于列表式数据可以使用QStringList进行左移一块输入。 代码: //listWidget使用 // QListWidgetItem * item new QListWidgetItem("锄禾日当午"); // QListWidgetItem * item2 new QListWidgetItem("汗滴禾下土"); // ui->…...
手动安装docsify
安装docsify详见:docsify 1、下载 wget https://codeload.github.com/docsifyjs/docsify/zip/refs/heads/master -o docsify-master.zip 2、解压 unzip docsify-master.zip 3、移动文件到nginx的html所在目录【略】 4、配置nginx,示例如下 locati…...
yaml语法详解
#kv #对空格的严格要求十分高 #注入到我们的配置类中 #普通的keyvalue name: qinjiang#对象 student:name: qingjiangage: 3#行内写法 student1: {name: qinjiang,age: 3}#数组 pets:- cat- dog- pigpet: [cat,dog,pig]yaml可以给实体类赋值 person:name: kuangshenage: 19happ…...
ubuntu下tmux安装
目录 0. 前言1. Tmux介绍2. 安装3. 验证安装 0. 前言 本节安装tmux终端复用工具,在Ubuntu中运行一些服务或脚本的时候往往不能退出终端,需要一直挂着。在有图形界面的linux中你还可以新开一个终端去做别的事,但是在无界面linux中,…...
ssh打开远程vscode
如果想要远程打开其他终端的vscode,首先要知道远程终端的ip地址和用户名称以及用户密码 1、打开本地vscode 2、点击左下角蓝色区域 3、页面上部出现如下图,点击ssh,我这里已经连接,所以是connect to host 4、选择Add New SSH Host…...
Socket发送数据---winsock库和boost库
一个是通过winsock库提供的api实现,一个是boost库实现,两个方法都可以,因为项目是vc++6.0实现的,不支持boost库,只能使用winsock库,vc++6.0太老,局限性大。 通过Winsock库提供的API 通过UDP #include<winsock2.h> #include<vector> #include<WS2tcpip.h…...
Qt Core学习日记——第七天QMetaObject(上)
每一个声明Q_OBJECT的类都具有QMetaObject对象 Q_OBJECT宏源代码: #define Q_OBJECT \ public: \ QT_WARNING_PUSH \ Q_OBJECT_NO_OVERRIDE_WARNING \ static const QMetaObject staticMetaObject; \ virtual const QMetaObject *metaObject() const; \ vir…...
100、用简洁的语言描述一下:TCP的三次握手和四次挥手(不需要长篇大论)
TCP的三次握手和四次挥手 TCP协议是7层网络协议中的传输层协议,负责数据的可靠传输。 1、三次握手 在建立TCP连接时,需要通过三次握手来建立,过程是: 客户端向服务端发送一个SYN服务端接收到SYN后,给客户端发送一个SYN_ACK客户…...
中南大学硕士论文latex版本全指导
要毕业了,闲下点时间写的东西。之前一直收益与师兄师姐流传下来的latex版本,用起来很舒服,希望后面的学弟学妹也能完美用上。latex功能很强大,不需要自己排版,只管内容即可,但是安装流程会多一丢丢。 目录 …...
RFC8470在HTTP中使用早期数据
摘要 使用TLS早期数据会暴露出重放攻击的可能性。本文定义了允许客户端与服务器就早期数据中发送的HTTP请求进行通信的机制。描述了使用这些机制来减轻重放风险的技术。 1. 介绍 TLS 1.3[TLS13]引入了早期数据(也称为零往返时间(0-RTT)数…...
macOS Big Sur 11.7.9 (20G1426) 正式版 ISO、PKG、DMG、IPSW 下载
macOS Big Sur 11.7.9 (20G1426) 正式版 ISO、PKG、DMG、IPSW 下载 本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Window…...
【LeetCode】62.不同路径
题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? …...
使用序列化和反序列化函数archivedDataWithRootObject和unarchivedObjectOfClasses的使用和遇到问题及解决方案
为何archiveRootObject和unarchiveObjectWithFile正常,而archivedDataWithRootObject和unarchivedObjectOfClasses一直报错。 [NSKeyedArchiver archiveRootObject:account toFile:path];和c PPAccountModel *account [NSKeyedUnarchiver unarchiveObjectWithFile:…...
python获取鼠标出颜色
import pyautogui as pg import keyboarddef rgb2hex(r, g, b):return #{:02x}{:02x}{:02x}.format(r, g, b)try:width, height pg.size()print(f"Display resolution: {width} * {height}\n") # 打印屏幕分辨率print(按下shift键打印出鼠标所指位置的颜色......)w…...
Github Flow工作流简单介绍(以部署为中心的开发模式)
前言 这篇文章主要介绍Github Flow的理念,以下内容来源于《Github入门与实践》。 Github Flow是以部署为中心的开发模式,通过简单的规则,持续高速且安全地进行部署。而Gitflow则是以发布为中心的分支管理模型,它提供了一种更灵活…...
selenium浏览器驱动下载
Chrome谷歌浏览器 下载地址:http://chromedriver.storage.googleapis.com/index.html 不同的Chrome的版本对应的chromedriver.exe 版本也不一样,下载时不要搞错了。 如果是最新的Chrome, 下载最新的chromedriver.exe 就可以了。 Firefox火狐浏览器 驱…...
go学习 模块与包 - Init函数 - 如何导入第三方包 - 切片与数组的数据传递方式 - go中文件的读写
目录 包(package)是组织和复用代码的基本单元。 包的种类: 包的导入 包的组成 如下两个文件中定义了A变量和 sc_num变量,他们的首字母开头分别为大写和小写,因此可以说明A变量是公有变量,而sc_num是私…...
2023第五届全国生物资源提取与应用创新论坛即将举办
01、会议背景 为进一步加强生物资源提取行业交流与合作,促进业“产学研用”融合,提升行业科技创新水平,增强行业国际竞争力,中国生物发酵产业协会、浙江科技学院、浙江工业职业技术学院、浙江省农业生物资源生化制造协同创新中心&…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
python打卡第47天
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...
