5分钟构建API接口服务 | python小知识

简介: Flask是python中轻量的web框架,Flask的两个核心模块除了模板渲染之外就是请求响应处理,其中请求响应处理是由 Werkzeug(WSGI 工具库)完成,而模板渲染是由Jinja(模板渲染库)完成。Flask因为轻量灵活,用来构建API接口十分合适

5分钟构建API接口服务 | python小知识

1. 什么是API

我们经常会使用一些API接口来完成特定的功能,比如查询天气的数据,下载股票的数据,亦或是调用ChatGPT模型的结构等等。

API全称是Application Programming Interface,即应用程序接口,它通常提供了一个功能函数,而这个功能函数的输入和输出是和调用方相互约定的。

从架构上来讲,API通常从客户端和服务端模型;客户端以数据形式向服务器发送请求,服务器使用该客户端输入来开始执行内部函数,并将输出数据返回到客户端。

所以我们要开发一个API接口,从设计上就需要明确:

  • 你要提供什么样的功能
  • 功能的输入是什么
  • 功能的输出返回是什么

从技术上,要提供一个服务来接收请求和返回结果,通常是一个满足HTTP协议的HTTP接口,也可以是RPC接口。我们这里要讲的是HTTP接口

这也是API的本质。

2. 用Flask构建API

要实现一个API,我们要构建一个HTTP服务。HTTP(超文本传输协议)是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范,是一个典型的请求/响应模式的协议。

Flask是python中轻量的web框架,Flask的两个核心模块除了模板渲染之外就是请求响应处理,其中请求响应处理是由 Werkzeug(WSGI 工具库)完成,而模板渲染是由Jinja(模板渲染库)完成。

Flask因为轻量灵活,用来构建API接口十分合适。

2.1 Flask入门

安装Flask

pip install flask

我们看一个简单的例子:

from flask import Flask

app = Flask(__name__)

@app.route('/hello')
def hello():
    return 'hello world'

if __name__ == '__main__':
    app.run("0.0.0.0", debug=True, port=6006)

调用(假设上面的文件为hello.py):

python hello.py

yyq-2023-03-20-23-16-58.png

此时,你调用http://127.0.0.1:6006/hello就会返回hello world

上面是最简单的一个接口了,从上面我们可知Flask的工作机制:

  • Flask(__name__)申明了一个服务app
  • app.run来启动这个服务,包括服务的地址ip和端口
  • @app.route装饰器定义了接口访问的URL地址和方法(GET/POST)
  • hello的函数就是具体接收请求响应的函数功能模块,由@app.route装饰

2.2 实用的FlaskAPI

上面的例子显然是不能满足一个完整的API的功能,首先我们要接收请求的数据,Flask是通过request来接收请求数据,HTTP请求通常由两个方式GET和POST。

from flask import Flask
from flask import request
import json
import traceback

app = Flask(__name__)

@app.route('/hello')
def hello():
    return 'hello world'

@app.route('/v1/task', methods=['GET', 'POST'])
def do_task():
    try:
        print(request.method)
        if request.method == "GET":
            content = request.args.get("content")
            # comment = request.values.get("content")
            res = int(content) + 10
            print(res, type(content))

        elif request.method == "POST":
            print("========", request.headers)
            content_type = request.headers.get('Content-Type')
            if "multipart/form-data" in content_type:
                form_data = dict(request.form)
                # files_data = dict(request.files)
                # print(form_data)

                res = int(form_data.get('content')) + 14
                
            elif "application/json" in content_type:
                # request.get_data() # 原始的数据
                input_dict = request.get_json()
                res = input_dict.get('content') + 12

            elif "application/x-www-form-urlencoded" in content_type:
                input_dict = request.form
                # request.values.get("content")
            else:
                print(request.get_data())

        print('url: %s , script_root: %s , path: %s , base_url: %s , url_root : %s' % (
            request.url, request.script_root, request.path, request.base_url, request.url_root))
            
        return json.dumps({"code": 0, "msg":"success", "data": res})
    except:
        err_msg = 'url: %s, err_msg: %s' % (request.url, (str(traceback.format_exc())))
        print(err_msg)
        return json.dumps({"code": -1, "msg":"failed", "data": 0})
    

if __name__ == '__main__':
    app.run("0.0.0.0", debug=True, port=6006)

以GET方式请求

http://127.0.0.1:6006/v1/task?content=3
# {"code": 0, "msg": "success", "data": 13}
# 127.0.0.1 - - [20/Mar/2023 23:53:28] "GET /v1/task?content=3 HTTP/1.1" 200 -

以POST方式请求

POST是通过表单form的方式来传递数据,数据可以使用不同的Content-Type来发送。比如:

  • application/json 的方式 ,请求body体的内容就是{"a": "b", "c": "d"}
  • application/x-www-form-urlencoded 的方式,则body体的内容就是 a=b&c=d
  • multipart/form-data 通常是要上传文件

POST请求调用如下:

import requests
import json
url = 'http://127.0.0.1:6006/v1/task'
headers = {'content-type': "application/json", 'Authorization': 'APP appid = 4abf1a,token = 9480295ab2e2eddb8'}
s = json.dumps({'content': 1, 'key2': 'value2'})
r = requests.post(url, data=s, headers=headers)
print(r.text)


url = 'http://127.0.0.1:6006/v1/task'
files = {'file': open('lena.jpg', 'rb')}
s = {'content': 1, 'key2': 'value2'}
r = requests.post(url, files=files, data=s)
print(r.text)

除此之外,从上面的例子可知:

  • GET方式是通过request.args获取数据
  • POST方式是通过request.get_json() request.get_data() request.form获取数据
  • request.method获取请求方式
  • request.headers获取HTTP头信息

3. 总结

今天分享了用Flask构建API接口,总结如下:

  • API的本质是客户端访问服务端的函数,访问的方式是一个HTTP请求(HTTP接口)
  • HTTP请求有GET和POST
  • Flask用request接收客户端请求
  • POST请求有不同的类型,json或者x-www-form-urlencoded或者multipart/form-data,不同的方式有不同的接收方式
  • API接口返回通常以json形式返回
目录
相关文章
|
24天前
|
JSON 数据可视化 API
Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
本教程详细介绍了如何使用 Python 调用 DeepSeek 的 R1 大模型 API,适合编程新手。首先登录 DeepSeek 控制台获取 API Key,安装 Python 和 requests 库后,编写基础调用代码并运行。文末包含常见问题解答和更简单的可视化调用方法,建议收藏备用。 原文链接:[如何使用 Python 调用 DeepSeek-R1 API?](https://apifox.com/apiskills/how-to-call-the-deepseek-r1-api-using-python/)
|
1天前
|
JSON API 数据格式
Python 请求微店商品详情数据 API 接口
微店开放平台允许开发者通过API获取商品详情数据。使用Python请求微店商品详情API的主要步骤包括:1. 注册并申请API权限,获得app_key和app_secret;2. 确定API接口地址与请求参数,如商品ID;3. 生成签名确保请求安全合法;4. 使用requests库发送HTTP请求获取数据;5. 处理返回的JSON格式响应数据。开发时需严格遵循微店API文档要求。
|
1天前
|
人工智能 Serverless API
一键服务化:从魔搭开源模型到OpenAI API服务
一键服务化:从魔搭开源模型到OpenAI API服务
|
3天前
|
Cloud Native 安全 Serverless
云原生应用实战:基于阿里云Serverless的API服务开发与部署
随着云计算的发展,Serverless架构日益流行。阿里云函数计算(Function Compute)作为Serverless服务,让开发者无需管理服务器即可运行代码,按需付费,简化开发运维流程。本文从零开始,介绍如何使用阿里云函数计算开发简单的API服务,并探讨其核心优势与最佳实践。通过Python示例,演示创建、部署及优化API的过程,涵盖环境准备、代码实现、性能优化和安全管理等内容,帮助读者快速上手Serverless开发。
|
5天前
|
人工智能 自然语言处理 API
解锁 DeepSeek API 接口:构建智能应用的技术密钥
在数字化时代,智能应用蓬勃发展,DeepSeek API 作为关键技术之一,提供了强大的自然语言处理能力。本文详细介绍 DeepSeek API,并通过 Python 请求示例帮助开发者快速上手。DeepSeek API 支持文本生成、问答系统、情感分析和文本分类等功能,具备高度灵活性和可扩展性,适用于多种场景。示例展示了如何使用 Python 调用 API 生成关于“人工智能在医疗领域的应用”的短文。供稿者:Taobaoapi2014。
|
13天前
|
存储 人工智能 程序员
通义灵码AI程序员实战:从零构建Python记账本应用的开发全解析
本文通过开发Python记账本应用的真实案例,展示通义灵码AI程序员2.0的代码生成能力。从需求分析到功能实现、界面升级及测试覆盖,AI程序员展现了需求转化、技术选型、测试驱动和代码可维护性等核心价值。文中详细解析了如何使用Python标准库和tkinter库实现命令行及图形化界面,并生成单元测试用例,确保应用的稳定性和可维护性。尽管AI工具显著提升开发效率,但用户仍需具备编程基础以进行调试和优化。
166 9
|
6天前
|
数据采集 供应链 API
实战指南:通过1688开放平台API获取商品详情数据(附Python代码及避坑指南)
1688作为国内最大的B2B供应链平台,其API为企业提供合法合规的JSON数据源,直接获取批发价、SKU库存等核心数据。相比爬虫方案,官方API避免了反爬严格、数据缺失和法律风险等问题。企业接入1688商品API需完成资质认证、创建应用、签名机制解析及调用接口四步。应用场景包括智能采购系统、供应商评估模型和跨境选品分析。提供高频问题解决方案及安全合规实践,确保数据安全与合法使用。立即访问1688开放平台,解锁B2B数据宝藏!
|
2月前
|
人工智能 开发者 Python
Chainlit:一个开源的异步Python框架,快速构建生产级对话式 AI 应用
Chainlit 是一个开源的异步 Python 框架,帮助开发者在几分钟内构建可扩展的对话式 AI 或代理应用,支持多种工具和服务集成。
210 9
|
2月前
|
Shell 程序员 开发者
轻松搞定在Python中构建虚拟环境
本教程教你如何使用业界公认的最佳实践,创建一个完全工作的Python开发环境。虚拟环境通过隔离依赖项,避免项目间的冲突,并允许你轻松管理包版本。我们将使用Python 3的内置`venv`模块来创建和激活虚拟环境,确保不同项目能独立运行,不会相互干扰。此外,还将介绍如何检查Python版本、激活和停用虚拟环境,以及使用`requirements.txt`文件共享依赖项。 通过本教程,你将学会: - 创建和管理虚拟环境 - 避免依赖性冲突 - 部署Python应用到服务器 适合新手和希望提升开发环境管理能力的开发者。
139 2
|
2月前
|
数据采集 供应链 API
Python爬虫与1688图片搜索API接口:深度解析与显著收益
在电子商务领域,数据是驱动业务决策的核心。阿里巴巴旗下的1688平台作为全球领先的B2B市场,提供了丰富的API接口,特别是图片搜索API(`item_search_img`),允许开发者通过上传图片搜索相似商品。本文介绍如何结合Python爬虫技术高效利用该接口,提升搜索效率和用户体验,助力企业实现自动化商品搜索、库存管理优化、竞品监控与定价策略调整等,显著提高运营效率和市场竞争力。
104 3

热门文章

最新文章