探索Flask中的RESTful API设计与实现

Restful API

基础介绍:

​ RESTful API(Representational State Transfer)是一种基于HTTP协议设计的应用程序编程接口(API)风格,用于在客户端和服务器之间进行通信。它提供了一组规范和约束,用于创建可伸缩、可靠和可维护的网络服务。

  1. 路径(URI)设计:

    • 使用有意义的路径来表示资源,例如 /users 表示用户资源。
    • 遵循路径层次结构,使用斜杠 / 分隔不同的资源和子资源,例如 /users/{id}/orders 表示特定用户的订单资源。
    • 避免在路径中使用动词,使用HTTP方法来表示操作类型。
    • url链接中,不能有动词,只能有名词。并且对于一些名词,如果出现复数,那么应该在后面加s。
  2. HTTP方法(Verbs):

    • 使用适当的HTTP方法来表示对资源的操作:

      • GET:从服务器上获取资源。
      • POST:在服务器上新创建一个资源。
      • PUT:在服务器上更新资源。(客户端提供所有改变后的数据)
      • PATCH:在服务器上更新资源。(客户端只提供需要改变的属性)
      • DELETE:从服务器上删除资源。
    • 合理使用HTTP状态码来表示请求的结果:

      • 200OK服务器成功响应客户端的请求。
        400INVALID REQUEST用户发出的请求有错误,服务器没有进行新建或修改数据的操作
        401Unauthorized用户没有权限访问这个请求
        403Forbidden因为某些原因禁止访问这个请求
        404NOT FOUND用户发送的请求的url不存在
        406NOT Acceptable用户请求不被服务器接收(比如服务器期望客户端发送某个字段,但是没有发送)。
        500Internal server error服务器内部错误,比如出现了bug

3.参数传递

在 RESTful API 中,参数传递可以使用不同的方式,包括查询参数(Query Parameters)、路径参数(Path Parameters)、请求体(Request Body)和请求头(Request Headers)。这些不同的方式可以根据具体的需求和语义选择使用。

以下是对每种参数传递方式的简要说明:

  1. 查询参数(Query Parameters):
    • 查询参数是附加在URL末尾的键值对,以?开头,多个参数使用&分隔,例如:/users?name=john&age=25
    • 查询参数常用于过滤、排序、分页等操作。
    • 在服务器端,可以通过解析URL中的查询参数来获取传递的值。
  2. 路径参数(Path Parameters):
    • 路径参数是包含在URL路径中的变量,由花括号{}表示,例如:/users/{id}
    • 路径参数用于标识特定的资源,如获取特定用户的信息。
    • 在服务器端,可以通过解析URL路径来提取路径参数的值。
  3. 请求体(Request Body):
    • 请求体是在HTTP请求中包含的数据,通常使用POST、PUT等方法发送。
    • 请求体可以包含结构化数据,如JSON、XML等格式,用于传递更复杂的参数。
    • 在服务器端,可以通过解析请求体来获取传递的值。
  4. 请求头(Request Headers):
    • 请求头是包含在HTTP请求头部中的键值对,用于传递元数据和其他信息。
    • 请求头可以用于身份验证、内容类型指定等目的。
    • 在服务器端,可以通过解析请求头来获取传递的值。

4.错误处理

  • 使用适当的HTTP状态码来指示错误,如400表示请求错误、401表示未授权、500表示服务器内部错误等。
  • 提供有用的错误信息,帮助客户端识别和解决问题。

案例:

现在给出代码,展示Restful APi 在Flask中的使用:

from flask import Flask, url_for, redirect, requestapp = Flask(__name__)
app.debug = True@app.route('/article/<id>/')
def article(id):return '%s article detail' % id@app.route('/login/', methods=['GET', 'POST'])
def login():return 'login page'@app.route('/profile/', methods=['GET', 'POST'])
def profile():name = request.args.get('name') # get请求使用request.args获取参数if not name:# 如果没有name,说明没有登录,进行重定向,重定向到路由函数loginreturn redirect(url_for('login'))else:return "hello " + nameif __name__ == '__main__':# host=0.0.0.0可以让其他电脑也能访问到该网站,port指定访问的端口。默认的host是127.0.0.1,port为5000app.run(host='0.0.0.0', port=9000)

改进:

class User(Base):# 定义表名为users__tablename__ = 'users'# 将id设置为主键,并且默认是自增长的id = Column(Integer, primary_key=True, autoincrement=True)# name字段,字符类型,最大的长度是50个字符name = Column(String(50))fullname = Column(String(50))password = Column(String(100))# 修改内置方法def __str__(self):return "<User(id='%s',name='%s',fullname='%s',password='%s')>" % (self.id, self.name, self.fullname, self.password)def to_json(self): # 封装一个可以转化为json格式的函数方法return {"id": self.id, "name": self.name, "fullname": self.fullname, "password": self.password}@app.route('/users/<id>/', methods=['GET'])
def users_get_by_id(id):result = get_user_by_id(id) return jsonify(result.to_json())# 这里的result应该是python的字典类型,最后使用Flask中的jsonify函数修饰一下
@app.route('/users/', methods=['GET'])
def users_get():result = get_user_list()
return jsonify([x.to_json() for x in result]) # 使用列表生成式,对列表中的每一个元素都是用 to_json()def get_user_by_id(user_id):Session = sessionmaker(bind=engine)session = Session()return session.query(User).filter(User.id == user_id).all()[0]# 返回一个对象def get_user_list():Session = sessionmaker(bind=engine)session = Session()return session.query(User).order_by(User.id).all()

这样改进后,我们发现每一个路由函数的返回结果都是一个json对象,这样也可以作为Ajax请求的地址来实现动态加载数据了。

增删改查:

增加:
def put_user(name, fullname, password):Session = sessionmaker(bind=engine) # 导入引擎session = Session() # 实例化一个session对象 add_user = User(name=name, fullname=fullname, password=password)session.add(add_user)session.commit()return "ok"

结合一下:

@app.route('/users/' methods=['PUT·]]
def users_put():name = request.args.get('name′)fullname = request.args.get('fullname')	password = request.args.get('password')try:result = put_user(name, fullname, password)if result == "ok":return jsonify({"status": "successful", "content":"add user Successful" ,"function":"put_user"}),208except Exception as e:return jsonify({"status": "fail","content":e})500return 'users page'
修改:
def update_user_by_id(id, name, fullname,password):Session = sessionmaker(bind=engine)session = Session()result =θif name:result = session.query(User).filter(User.id == id).update({"name": name})if fullname:result = session.query(User).filter(User.id == id).update({"fullname": fullname})if password:result  = session.query(User) .filter(User.id == id).update({"password": password})session.commit()session.close()return result

在上面的操作中,如果更新成功,result会被置为1.

@app.route(/users/<id>/*, methods=['PATCH'])
def users_patch(id):fullname = request.args.get('fullname')name = request.args.get('name*)password = request.args.get('password')result = update_user_by_id(id, name, fullname, password)if result == 1:return jsonify({"status": "successful", "content":"update user successful", "function": "update_user_by_id"}), 200if result == θ:return jsonify({"status": "fail", "content": "Failed to update user data", "function": "update_user_by_id"}), 408except Exception as e:return jsonify(f"status": "fail", "Error Name": e.--class-- "content": eb), 500
删除:
def delete_user_by_id(user_id):Session = sessionmaker(bind=engine)session = Session()session.query(User).filter(User.id == user_id).delete()session.commit()session.close()return "ok"
@app.route('/users/<id>/" methods=['DELETE'])
def users_delete_by_id(id):try:result = delete_user_by_id(id)if result == "ok":return jsonify({"status": "successful", "content": "delete user successful", "function": "put_user"}), 200except Exception as e:return jsonify({"status": "fail","content": e})500

总结:

​ 在本篇博客中,我们深入探索了RESTful API的基础知识,并了解了如何在Flask框架中使用它来构建强大的API。我们学习了RESTful原则、路径设计、HTTP方法、参数传递等关键概念,并通过示例代码演示了它们的实际应用。

​ 通过使用Flask框架,我们可以轻松地创建和管理RESTful API,从而使我们的应用程序更加灵活、可扩展和易于维护。Flask提供了强大的路由和视图函数机制,使我们能够以简洁的方式定义API的端点和动作。

​ 同时,我们还探讨了RESTful API的设计原则,如良好的路径命名、合适的HTTP状态码和错误处理等,这些原则帮助我们设计出易于理解和使用的API接口,提供良好的开发者体验。

​ 通过学习和实践RESTful API的基础知识,我们可以构建出符合标准的API,并为前端开发人员、移动应用程序开发人员和其他客户端提供一致、可靠的接口。这不仅有助于提高开发效率,还能促进团队间的协作和集成,为构建现代化、高性能的应用奠定坚实基础。

​ 无论是构建简单的API还是复杂的分布式系统,掌握RESTful API的基础知识都是非常重要的。希望本篇博客对您在理解和应用RESTful API方面起到了指导作用,并能为您的API开发之旅提供一些有价值的见解。

​ 祝您在使用Flask和构建RESTful API的过程中取得巨大成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/638394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习从0到1 day7 Python判断语句

路远殊途&#xff0c;祝你得偿所愿 ——24.1.21 前言 进行逻辑判断&#xff0c;是生活中常见的行为&#xff0c;同样&#xff0c;在程序中&#xff0c;进行逻辑判断也是最为基础的功能 一、布尔类型和比较运算符 1.布尔类型 进行判断&#xff0c;有两个结果&#xff0c;True、…

C 练习实例37 - 排序

题目&#xff1a;对10个数进行排序。 从小到大排序题目分析&#xff1a; 1 6 3 4 8 9 0 2 5 7&#xff08;假设10个数据&#xff09; 第一个和第二个比&#xff0c;把大的那个数放在右边 第二个和第三个比&#xff0c;把大的那个数放在右边 以此类推...... 从而把最大的那…

springboot集成COS对象存储

1.申请腾讯云存储桶 新建密钥&#xff08;后面配置要用到&#xff09; 2.编写工具类 此处使用工具类进行基本属性配置&#xff0c;也可选择在yml中配置 package com.sfy.util;import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.a…

基于xgboost-LGBM-SVM的病人哮喘病识别检测 数据+代码

基于xgboost-LGBM-SVM的病人哮喘病识别检测-完整代码可直接运行_哔哩哔哩_bilibili 代码: from sklearn import preprocessing import random from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler from sklearn import pr…

声明式注解对XXL-JOB的定时任务代码生效吗?

说明&#xff1a;源于博主的思考&#xff0c;本文验证一下声明式注解&#xff0c;即Transactional注解&#xff0c;对XXL-JOB的定时任务是否生效。 准备 首先&#xff0c;创建一个需要事务的场景。有两张表&#xff0c;一张部门表&#xff0c;一张用户表&#xff0c;用户隶属…

字符串经典基础面试题(算法村第十二关白银挑战)

反转问题 反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须**原地修改输入数组**、使用 O(1) 的额外…

基于YOLOv8的目标识别、计数、电子围栏的项目开发过程

0 前言 用于生产环境中物体检测、识别、跟踪&#xff0c;人、车流量统计&#xff0c;越界安全识别 1 YOLOv8概述 YOLOv8 是Ultralytics的YOLO的最新版本。作为一种前沿、最先进(SOTA)的模型&#xff0c;YOLOv8在之前版本的成功基础上引入了新功能和改进&#xff0c;以提高性…

cupy,一个超级实用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超级实用的 Python 库 - cupy。 Github地址&#xff1a;https://github.com/cupy/cupy 深度学习和科学计算需要处理大规模的数据和复杂的计算任务&#xff0c;而Python是一…

spring boot 常用的 Cron 表达式

在使用定时调度任务的时候&#xff0c;我们最常用的&#xff0c;就是cron表达式了。通过cron表达式来指定任务在某个时间点或者周期性的执行。cron表达式配置起来简洁方便&#xff0c;无论是Spring的Scheduled还是用Quartz框架&#xff0c;都支持cron表达式。 cron表达式含义常…

C语言易忘操作符全集

位操作符 1.按位与(&) 这个操作符对两个整数的每一位进行比较&#xff0c;如果两个相应的位都为1&#xff0c;则结果为1&#xff0c;否则为0。 int a 60; // 60 0010 1100 in binary int b 13; // 13 0000 1101 in binary int c a & b; // c 0000 110…

tag 标签

tag 标签 在使用 Git 版本控制的过程中&#xff0c;会产生大量的版本。如果我们想对某些重要版本进行记录&#xff0c;就可以给仓库历史中的某一个commit 打上标签&#xff0c;用于标识。 在本章中&#xff0c;我们将会学习如何列出已有的标签、如何创建和删除新的标签、以及…

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息 2024/1/16 17:55 百度&#xff1a;RK3399 ALC5640 RK3399 RT5640 BING&#xff1a;RK3399 ALC5640 LINE-IN接麦克风不会有声音的。 耳机只有右边有声音&#xff0c;但是偏小&#xff0c;可以通过音量…

计算机安全学习笔记(VI):9道关于网络安全的练习题

1.哪个 UDP 字段用于检测数据报损坏&#xff1f; a. 总长度b. 目的端口c. 校验和d. 源端口 正确答案是&#xff1a; c. 校验和(Checksum) 在UDP&#xff08;用户数据报协议&#xff09;中&#xff0c;校验和&#xff08;Checksum&#xff09;字段用于检测数据报文的完整性。…

C++ memmove 学习

memmove&#xff0c;将num字节的值从源指向的位置复制到目标指向的内存块。 允许目标和源有重叠。 当目标区域与源区域没有重叠则和memcpy函数功能相同。 宽字符版本是wmemmove&#xff0c;安全版本加_s&#xff1b; #include "stdafx.h" #include<iostream&g…

如何为不同品牌的笔记本电脑设置充电限制,这里提供详细步骤

笔记本电脑的电池健康状况至关重要。延长电池寿命可以帮你省下不少钱。对于长时间充电的Windows 11笔记本电脑用户来说,将电池电量限制在80%是很重要的。 虽然操作系统没有提供设置自定义电池充电限制的内置方法,但仍有一些方法可以在Windows 11中配置电池设置,并将其限制在…

华南理工大学数字信号处理实验实验一(薛y老师版本)matlab源码

一、实验目的 1、加深对离散信号频谱分析的理解&#xff1b; 2、分析不同加窗长度对信号频谱的影响&#xff1b; 3、理解频率分辨率的概念&#xff0c;并分析其对频谱的 影响&#xff1b; 4、窗长和补零对DFT的影响 实验源码&#xff1a; 第一题&#xff1a; % 定义离散信…

面试题-MySQL如何定位慢查询

慢查询出现的情况就这些&#xff1a;聚合查询、多表查询、表数据量过大查询、深度分页查询。 表象&#xff1a;页面加载过慢、接口压测响应时间过长&#xff08;超过1S&#xff09;。 假如你的业务接口就是比较慢&#xff0c;你怎么知道是SQL的问题呢&#xff1f;就算是SQL的…

【多线程的安全问题】synchronized 和 volatile——你必须知道的妙用!

&#x1f4c4;前言&#xff1a;本文的主要内容是讨论个人在多线程编程带来的安全问题的表现、原因以及对应的解决方法。 文章目录 一. 了解多线程安全问题二. 线程不安全的现象及原因&#x1f346;1. 修改共享的数据&#xff08;根本原因&#xff09;&#x1f345;2. 原子性&am…

2023美赛各题分析,2024美赛数学建模思路解析2.2日第一时间更新

目录 2024美赛数学建模各题思路模型代码&#xff1a;开赛后第一时间更新&#xff0c;更新见文末 一、2023题目重述 拟解决的问题 我们的工作&#xff1a; 二、模型和计算 1.数据预处理 2.报告数量区间预测模型 3.猜词结果分布预测模型 2024美赛数学建模交流&#xff0…

MicroPython核心(1):源码获取、编译构建

本文介绍了MicroPython在主要平台进行构建的基本方法&#xff0c;包括如何进行版本控制、获取和构建移植的源代码、构建文档、运行测试&#xff0c;以及MicroPython代码库的目录结构。 使用git进行源码管理 MicroPython托管在GitHub上&#xff0c;并使用Git进行源码管理。在进…