FlaskRestful

flask 启动了但是无法访问_34. Flask 集成 flaskrestful 需求一般 Flask 框架默认写 api 的请求就是写一个函数视图,如下:@app.route('/add_list', methods=["POST"])def add_list(): ... @app.route('/get_list', methods=["GET"])def get_list(): ...这种方式当然可以开发 api, 但是当我们想要基于 restfu... 阅读详情

Flask RESTFul

Restful官方文档

  • 软件架构设计思想,主要用在客户端和服务器交互类的软件设计中

  • 可以帮助开发者快速实现API接口开发

  • CS,客户端和服务端这种架构模型中

  • 主要研究网络和软件的交叉点,得到一个功能强,性能好,适宜通信的网络框架

  • 表现层状态转换

    • 主语 (资源)任何一个网络实体,都是一个资源
    • URI 每个URI代表一种资源
    • 资源展现给我们的形式就叫做表现层
    • 通过HTTP的请求谓词来实现表现层转换
  • 重要概念

    • URI
    • HTTP请求谓词
    • RESTful API中的最大难点:对象转换为JSON,过程叫做序列化

基本写法

route.py

from flask_restful import Api

from Book.views import BooksResource
#实例化Api对象(添加前缀去分路由)
books_api = Api(prefix='/books')
#① 代表资源     ② 代表路由
books_api.add_resource(BooksResource, "/books/")

views.py

#将返回的结果进行模板格式化
#用模板映射数据,模板中声明的格式,如果数据中存在,直接获取,不存在使用默认值填充,模板中声明的数据格式,如果数据中数据过多,会自动优化
book_fields = {
    "b_name": fields.String,
    "b_price": fields.Float,
    "id": fields.Integer,
    "b_author": fields.String
}

#模板级联写法
return_fields = {
    "status": fields.Integer,
    "msg": fields.String,
    # "data": fields.Nested(student_fields)
    "data": fields.List(fields.Nested(student_fields))
    #Nested级联别的字段
}

class BooksResource(Resource):

    def get(self):
        books = Book.query.all()
        data = {
            "status": 200,
            "msg": "ok",
            #调用对象的to_dict方法将对象转换为字典
            "data": [book.to_dict() for book in books]
        }
        return data
    
    ##序列化输出的三种方式:1。 @marshal_with(book_fields)
    2."data": marshal(book, book_fields)
    3.return marshal(book, book_fields)


    # @marshal_with(book_fields)
    def post(self):

        b_name = request.form.get("b_name")
        b_price = request.form.get("b_price")

        book = Book(b_name=b_name, b_price=b_price)

        if not book.save():

            data = {
                "msg": "save fail",
                "status": 400
            }

            return data

        data = {
            "msg": "save success",
            "status": 201,
            # 格式化数据     ①数据 ②模板
            # "data": marshal(book, book_fields)
            "data": book
        }

        # return data
        return marshal(book, book_fields)

项目工程里的views

from Book.route import books_api

def init_api(app):
    books_api.init_app(app)
    

__ init__

'''  # 初始化路由
    init_api(app)'''

中级写法

输入

views.py(token的用法)
# 先声明请求转换器
parse = reqparse.RequestParser()
# 添加请求参数规则
#要求一个值传递的参数,只需要添加 required=True 来调用 add_argument()。
#如果你要接受一个键有多个值的话,你可以传入 action='append'
#如果由于某种原因,你想要以不同的名称存储你的参数一旦它被解析的时候,你可以使用 dest kwarg。
#默认下,RequestParser 试着从 flask.Request.values,以及 flask.Request.json 解析值。在 add_argument() 中使用 location 参数可以指定解析参数的位置。flask.Request 中任何变量都能被使用。('form','args','headers','cookies')
#通过传入一个列表到 location 中可以指定 多个 参数位置:

parse.add_argument("username", required=True, type=str, help="username can't be blank")
parse.add_argument("password", required=True, type=str, help="password can't be blank")
parse.add_argument("action", required=True, type=str, help="please supply action")
#
parse.add_argument("hobby", dest="aihao",action="append")
parse.add_argument("csrftoken", location=["cookies", "args"], action="append")




class UsersResource(Resource):
    def post(self):
        # 转换参数    根据规则去过滤
        args = parse.parse_args()
        # form 获取html中form表单中的数据,如果客户端不是html  也同样可以提交表单数据
        action =args.get("action")

        if action == "register":
            return self.do_register()
        elif action == "login":
            return self.do_login()

    def do_register(self):
        args = parse.parse_args()
        username = args.get("username")
        password = args.get("password")

        # if not username:
        #     # return {"msg": "username can't be blank"}
        #     abort(400, message="username can't be blank")

        user = User(username=username, password=password)
        if not user.save():
            data = {
                "msg": "register fail",
                "status": 400
            }

            return data

        data = {
            "msg": "register success",
            "status": 201
        }

        return data

    def do_login(self):

        username = request.form.get("username")
        password = request.form.get("password")

        users = User.query.filter(User.username.__eq__(username)).all()

        if not users:

            data = {
                "msg": "user doesn't exist",
                "status": 401
            }

            return data

        user = users[0]

        if not user.check_password(password):

            data = {
                "msg": "password error",
                "status": 401
            }

            return data
        # 生成令牌    唯一
        token = uuid.uuid4().hex
        # 服务器记录令牌
        cache.set(token, user.id, timeout=60*60*24*7)

        # 令牌返回给客户端
        data = {
            "msg": "login sucess",
            "status": 200,
            "data": {
                "token": token
            }
        }
        return data
装饰器实现用户验证
def login_required(fun):
    def wrapper(*args, **kwargs):
        token = request.form.get("token")
        #获取token
        if not token:
            abort(400, message="autn fail")
        user_id = cache.get(token)
      #才缓存里用token获取u_id
        if not user_id:
            abort(400, message="token error")
        user = User.query.get(user_id)
        #获取用户
        if not user:
            abort(401, message="user doesn't exist")
        g.user = user
        return fun(*args, **kwargs)
    return wrapper

综合用法

blog_fields = {
    "id": fields.Integer,
    "title": fields.String,
    "content": fields.String
}

return_fields = {
    "msg": fields.String,
    "status": fields.Integer,
    "data": fields.Nested(blog_fields)
}

parse = reqparse.RequestParser()
parse.add_argument("title", required=True, help="请填写标题")
parse.add_argument("content", required=True, help="请填写内容")


class BlogsResource(Resource):

    @marshal_with(return_fields)
    def get(self):
        blogs = Blog.query.all()

        data = {
            "msg": "ok",
            "status": 200,
            "data": blogs
        }

        return data

    @login_required
    def post(self):
        user = g.user

        args = parse.parse_args()

        title = args.get("title")

        content = args.get("content")

        blog = Blog(title=title, content=content, b_owner=user.id)

        if not blog.save():
            data = {
                "msg": "create fail",
                "status": 400
            }
            return data

        data = {
            "msg": "ok",
            "status": 200,
            "data": blog
        }

        return marshal(data, return_fields)


class BlogResource(Resource):

    def get(self, pk):
        blog = Blog.query.get(pk)

        if not blog:
            abort(404, message="blog has been deteled")

        data = {
            "msg": "ok",
            "status": 200,
            "data": blog
        }

        return marshal(data, return_fields)

    @login_required
    def patch(self, pk):

        blog = Blog.query.get(pk)

        if not blog:
            abort(404, message="blog has been deteled")

        user = g.user

        if blog.b_owner != user.id:
            abort(403, message="can't modify others")

        title = request.form.get("title")

        content = request.form.get("content")

        # if title:
        #     blog.title = title
        #
        # if content:
        #     blog.content = content

        blog.title = title or blog.title

        blog.content = content or blog.content

        if not blog.save():
            data = {
                "msg": "modify fail",
                "status": 400
            }
            return data

        data = {
            "msg": "ok",
            "status": 200,
            "data": blog
        }

        return marshal(data, return_fields)

拓展:自带密码加密和校验

class User(db.Model):

id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(32), unique=True, nullable=False)
_password = db.Column(db.String(256))

@property
def password(self):
    return self._password

@password.setter
def password(self, password):
    # self._password = hashlib.new("md5", password.encode("utf-8")).hexdigest()
    self._password = generate_password_hash(password)

def check_password(self, password):
    # return self._password == hashlib.new("md5", password.encode("utf-8")).hexdigest()
    return check_password_hash(self._password, password)
使用Python编写的API自动化测试工具FlaSKRESTful扩展教程 作者:禅与计算机程序设计艺术 1.简介   API(Application Programming Interface)即应用编程接口,是一种定义应用程序与开发者之间交互的协议。它允许不同的软件模块之间进行信息交流,让开发者在各自领域内更方便地实现自己所需功能。   REST(Repres 阅读详情

相关推荐

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

本次安装实验基于苹果m2芯片的mac系统,使用vmware fusion搭建三台ubuntu24分布式虚拟机,确保在三台机器上安装了Java jdk8,并配置了免密码登录,网络互通,防火墙关闭,授时服务器已经同步。访问apche官网源,下载3.3.4版本,我们用二进制通用版即可,因为hadoop运行在java环境,跨平台性使得无需编译arm架构版本。至此,Hadoop的安装完成,包括hdfs文件存储系统,mapreduce计算框架,yarn资源管理系统均能正常、稳定使用。

qq_31412425的博客 2161

SlickFast:无浏览器环境下的确定性图表渲染,JSON直出SVG/PNG

在自动化报表、CI/CD流水线等批量出图场景中,传统方案常依赖无头浏览器截图,存在体积大、稳定性差、输出难以复现等痛点。而服务端图表渲染技术通过纯计算方式将JSON配置直接转换为SVG或PNG,无需浏览器内核,既降低了部署复杂度,又保证了同一输入每次输出完全一致。这种确定性输出特性使其非常适合测试快照对比、文档配图以及批量图片服务。SlickFast正是基于这一思路的工具,它把JSON进、SVG/PNG出的链路收敛为轻量级渲染器,让自动化日报生成、回归测试基线建立等任务变得更加高效可控。本文即围绕该项目的核

weixin_30753873的博客 594

【星火】海思HI3516C开发板实战:基于LVGL与MPP库的行车记录仪/电子显微镜方案

本文详细介绍了基于海思HI3516CV500开发板,结合LVGL图形库与海思MPP媒体处理平台,实现行车记录仪与电子显微镜方案的完整实战过程。内容涵盖从系统环境搭建、驱动配置到应用开发的全流程,重点解析了MPP视频流处理管道与LVGUI界面协同工作的核心机制,为嵌入式音视频开发提供了可复用的参考方案。

weixin_42126677的博客 160

Flask-RESTful的使用

Flask-RESTful是一个功能丰富、易用高效的REST API开发框架,在实现Web服务的时候,可以大大减少开发者对底层细节的关注,从而更加专注于业务逻辑的实现。

积跬步,至千里。 1969

FANUC机器人电弧跟踪功能深度解析:从电流采样原理到ROBOGUIDE仿真避坑指南

本文深度解析FANUC机器人电弧跟踪技术,从电流采样原理到ROBOGUIDE仿真避坑指南,详细介绍了电流波形分析、实时补偿机制及现场调试技巧。针对工业焊接中的常见问题,提供从底层原理到高阶应用的解决方案,帮助工程师优化自动化焊接质量。

weixin_31785177的博客 552

STM32F103C8T6与OV7670摄像头在TFT屏上的实时数字识别系统实现

本文详细介绍了基于STM32F103C8T6单片机和OV7670摄像头实现实时数字识别系统的全过程。系统通过图像采集、预处理、二值化和模板匹配算法,在TFT屏上实时显示识别结果,并针对资源受限的单片机环境提供了内存与性能优化策略,适用于智能家居、工业仪表读数等低成本嵌入式视觉应用场景。

open4的博客 278

Flask框架中蓝图的使用

Flask框架中蓝图的使用 1.基本使用 蓝图的作用: 实现Flask项目 模块化 项目模块化主要是 将业务以功能模块进行划分, 每个功能模块对应一个包, 用于存放和其有关的视图/工具/模型文件等, 如home, user 对于大型项目, 一般 每个功能模块对应创建一个蓝图, 由多个蓝图代替应用来分别管理各模块的视图 --------- project # 工程目录 |------ main.py # 启动文件 |------ user # 用户模块 | |--- __init__.py

li944254211的博客 718

大模型产品Deepseek(七)、可视化本地知识库搭建详细教程(Cherry Studio)

Cherry Studio 为智能体的开发提供了一个强大的可视化平台,结合大模型和嵌入式知识库,它可以在多个应用场景中提供智能化的支持。如果你有进一步的需求或问题,可以继续在 Cherry Studio 中进行更多自定义配置,或者通过 API 调用集成到你的应用中。现在,知识库已经搭建并与 DeepSeek 模型连接好,接下来,我们将使用 Cherry Studio 提供的可视化界面进行智能提问。为了让智能体能够通过大模型查询到知识库中的信息,你需要为知识库配置索引和匹配模型。

xiaoqi270620903的专栏 1333

flask_restful编写API

爱上了大家按实际林科大

徳 854

动手在 SAP BTP Cloud Foundry 开发和部署 SAP UI5 应用的前置条件 - 订阅 SAP Build Work Zone Standard Version

摘要:本文介绍了SAP BTP Cloud Foundry环境中HTML5应用的概念,区分了web应用、HTML5应用和SAP UI5应用的关系。重点说明了在Cloud Foundry环境部署HTML5应用的方法是通过订阅SAP Build Work Zone standard edition服务,并详细描述了订阅过程中可能遇到的"OIDC trust missing"错误。该错误是由于业务用户认证需要配置SAP Cloud Identity Services的OpenID Connec

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 312

芒果YOLO11改进59:分类损失函数Loss篇FocalLoss:即插即用|最新改进FocalLoss损失函数,提高处理不平衡数据分类场景下的任务性能,提升YOLO11检测精度

即插即用|最新改进FocalLoss损失函数,提高处理不平衡数据分类场景下的任务性能,提升YOLO11检测精度

包括YOLOv5、YOLOv7、YOLOv8等模型改进 550

【Flask框架】—— 30 Flask-RESTful

RESTful是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTful适用于移动互联网厂商作为业务使能接口的场景。

Python全栈系列 2478

Prompt提示优化工具

在大模型使用过程中,Prompt尤为重要。一个好的Prompt可以解决很多的问题。那么如何撰写一个完美的Prompt?下面汇总了一些Prompt工具,可以辅助日常Prompt的编写。

HJ_blog 3108

FlaskRESTful之请求处理(RequestParser)

RequestParser请求处理 使用步骤: 1. 导包 from flask_restful.reqparse import RequestParser 2. 创建requestparser对象 # 1. 创建RequestParser实例 parser = RequestParser() 3. 添加数据验证逻辑 add_argument()方法的参数: 第一个参数:验证的参数的名称, 第二个参数(location):传递验证数据的方式, 第三个参

liuwkk的博客 3005

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

FlaskRESTful之入门

安装模块 pip install flask_restful 入门使用 使用步骤: 1. 导包 # 1. 导包 from flask_restful import Api, Resource 2. 创建api对象并接管app # 2. 创建API对象并接管app api = Api(app) 3. 创建类视图 # 3. 定义类视图 class IndexResource(Resou...

qq_46016042的博客 59

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

FlaskRESTful之SQLAlchemy入门

使用步骤: 1. 编写数据库配置,并加载 # 创建数据库配置类 class Config(object): # 数据库链接地址 SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@127.0.0.1:3306/test' # 禁用追踪 SQLALCHEMY_TRACK_MODIFICATIONS = False # 加...

qq_46016042的博客 57

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python的Web服务开发与FlaskRESTful实战

1.背景介绍 1. 背景介绍 Python是一种强大的编程语言,它的简洁性、易用性和强大的生态系统使得它在各种领域得到了广泛应用。在Web服务开发领域,Python的一个流行框架是Flask。Flask-RESTful是Flask的一个扩展库,它使得开发者可以轻松地构建RESTful API。在本文中,我们将深入探讨Python的Web服务开发与Flask-RESTful实战,涵盖了其核心概念...

AI天才研究院 984

FlaskRESTful之响应处理

将模型数据序列化成JSON数据 使用步骤 1. 导包 # 导包 from flask_restful import Api, Resource from flask_restful import marshal_with, fields from flask_restful import marshal 2. 创建JSON数据样式(序列化样式) # 定义JSON数据格式 json_data...

qq_46016042的博客 57

flask post json_34. Flask 集成 flaskrestful

需求一般 Flask 框架默认写 api 的请求就是写一个函数视图,如下:@app.route('/add_list', methods=["POST"])def add_list(): ... @app.route('/get_list', methods=["GET"])def get_list(): ...这种方式当然可以开发 api, 但是当我们想要基于 restfu...

weixin_39863008的博客 113

datetime格式_FlaskRestful 中 fileds.DateTime 不支持 strftime 格式

求关注求转发前言通常情况下,我们会使用Flask来开发网站,但是也有的时候我们只是想用 Flask 来简单的创建 RestFul 的 Api,这个时候可能会使用其他的 Flask 拓展来帮助完成这一切,我前段时间就使用 Flask-Restful 这个库去实现简单的接口了。既然是接口必然是提供给别人的使用的,这个时候就涉及到序列化的问题,Flask-Restful 这个库提供了一个 fi...

weixin_39851918的博客 386

(一)想使用flaskrestful 开发一个测试用例管理平台

用flaskrestful 写一个测试用例后台管理、边学编写阶段。

cyq的博客 499

(二)想使用flaskrestful 开发一个测试用例管理平台

flask restful 添加了分页与序列化

cyq的博客 292

python中的os abort_忽略CORS选项的FlaskRestful中的abort方法

我有一个Flask Restful API配置了一些CORS选项:api = Api()api.decorators=[cors.crossdomain(origin='*', headers=['accept', 'Content-Type'])]...api.init_app(app)我的API接受POST请求,如果请求中的数据无效,则可能会失败:^{pr2}$当我向API发出成功的POST请...

weixin_39616003的博客 178
上一篇: Flak项目拆分
下一篇: 节流控制
Are you ready
博客等级 码龄8年 312粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值