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

这篇具有很好参考价值的文章主要介绍了探索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状态码来表示请求的结果:

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

app = 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,说明没有登录,进行重定向,重定向到路由函数login
        return redirect(url_for('login'))
    else:
        return "hello " + name


if __name__ == '__main__':
    # host=0.0.0.0可以让其他电脑也能访问到该网站,port指定访问的端口。默认的host是127.0.0.1,port为5000
    app.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"
        }),208
    except Exception as e:
    	return jsonify({"status": "fail","content":e})500
    return '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"}), 200
    if result == θ:
    	return jsonify(
    {"status": "fail", "content": "Failed to update user data", "function": "update_user_by_id"}), 408
    except 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"}), 200
    except 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的过程中取得巨大成功!文章来源地址https://www.toymoban.com/news/detail-812081.html

到了这里,关于探索Flask中的RESTful API设计与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 使用 Python 和 Flask 构建简单的 Restful API 第 1 部分

    使用 Python 和 Flask 构建简单的 Restful API 第 1 部分

            我将把这个系列分成 3 或 4 篇文章。在本系列的最后,您将了解使用flask构建 restful API 是多么容易。在本文中,我们将设置环境并创建将显示“Hello World”的终结点。         我假设你的电脑上安装了python 2.7和pip。我已经在python 2.7上测试了本文中介绍的代码,

    2024年02月13日
    浏览(11)
  • flask-restful 和 blueprint

    flask-restful 使用 flask-restful第三方库 from flask_restful import Resource, Api app = Flask(__name__) api = Api(app) class HelloWorldResource(Resource):     def get(self):            return {\\\'hello\\\':\\\'world\\\'}     def post(self):            return {\\\'msg\\\':‘post hello wolrd’} api.add_resource(HelloworldResource,\\\'/\\\') 方式完成restf

    2023年04月23日
    浏览(10)
  • Python flask-restful 框架讲解

    Django 和 Flask 一直都是 Python 开发 Web 的首选,而 Flask 的微内核更适用于现在的云原生微服务框架。但是 Flask 只是一个微型的 Web 引擎,所以我们需要扩展 Flask 使其发挥出更强悍的功能。 python flask框架详解:https://blog.csdn.net/shifengboy/article/details/114274271 Flask-RESTful Flask-RESTful 就

    2024年02月13日
    浏览(13)
  • flask restful项目开发结尾必看!!!

     为了实现restful风格的一些增删查改需要安装的第三方库太繁杂了所以:                                           建议放弃flask框架 这个框架自带的功能太少了,实现一些简单的功能都要自主安装很多第三方库,而且不同版本的第三方库还有兼容问题 啧啧啧! 后续也不在

    2024年02月06日
    浏览(8)
  • 使用Flask-Restful后handle_error干扰无法正常捕获全局异常的解决

    使用Flask-Restful后handle_error干扰无法正常捕获全局异常的解决

    1、发现问题 1.1、追踪Api源码,vscode举例,右键点击Api,选择转到定义,确定flask_restful包的位置 1.2、vscode 打开flask_restful包作为一个项目 1.3、之前的问题是,抛出的HTTPException,会变成这个形状: 所以全局搜索message 很明显就是这里,点进去 1.4、打印一下 1.5、简单调试一下,

    2024年02月09日
    浏览(13)
  • 探索开源创新:Gorb - Go语言构建的高效RESTful API框架

    项目地址:https://gitcode.com/kobolog/gorb Gorb 是一个为Go语言开发者设计的轻量级、高性能的RESTful API框架。它旨在简化API开发流程,提高代码可读性和可维护性,同时也提供了一套强大的工具来帮助开发者创建健壮的Web服务。 Gorb的核心特性包括: 路由控制 :Gorb使用了直观且灵活

    2024年04月25日
    浏览(18)
  • RESTful API 设计指南

    RESTful API 是目前比较成熟的一套互联网应用程序的API设计理论 API与用户的通信协议,总是使用HTTPs协议。 应用层协议 应该尽量将API部署在专用域名之下。并SSL 加密 应该将API的版本号放入URL。  另一种做法是,将版本号放在HTTP头信息中,但不如放入URL方便和直观。Github采用

    2024年02月07日
    浏览(11)
  • RESTful API 中的 HTTP 方法有哪些?

    RESTful API 中的 HTTP 方法有哪些?

    RESTful API 是一种基于 HTTP 协议的 API 设计风格,它使用 HTTP 协议中的方法来定义对资源的操作。在 RESTful API 中,HTTP 方法主要用于表示对资源的操作,例如获取、创建、更新和删除资源。本文将介绍 RESTful API 中常用的 HTTP 方法以及它们的用途。 HTTP 方法是 HTTP 协议中定义的一

    2024年02月10日
    浏览(11)
  • 【最佳实践】如何设计 RESTful API ?

    良好的 API 设计是一个经常被提及的话题,特别是对于那些试图完善其 API 策略的团队来说。一个设计良好的 API 的好处包括:改进开发者体验、更快速地编写文档以及更高效地推广你的 API。但是,到底什么才构成了良好 API 设计呢?在这篇博客文章中,我将详细介绍几个为

    2024年02月07日
    浏览(14)
  • 如何使用Python Flask和MySQL创建管理用户的REST API

    如何使用Python Flask和MySQL创建管理用户的REST API

    部分数据来源: ChatGPT  引言         在现代化的应用开发中,数据库是一个非常重要的组成部分。关系型数据库(例如:MySQL、PostgreSQL)在这方面尤其是很流行。Flask是一个Python的web框架,非常适合实现REST API。在这篇文章中,我们将介绍如何使用Python Flask和MySQL创建一个

    2024年02月08日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包