【python网络编程项目实践】1.用fastapi编写一个随机动漫图片的api

发布于 2023-02-26  333 次阅读


先放演示地址:pic.eriktse.com:25588/image

搭建开发环境

我用的服务器是腾讯云的一台Ubuntu20.04服务器,计划用Python语言编写,用Anaconda配置环境,然后安装fastapi,uvicorn等库进行api开发。

搭建环境这块就不多说了,可以看以前的文章《Anaconda入门学习笔记(1):在windows下安装Anaconda》和《Anaconda学习笔记(2):在Ubuntu下安装和使用Anaconda》。

选择一个喜欢的文件夹进行开发,我选择的是"/home/picapi",尽量在home目录下写自己的东西。

编写python代码

代码只要一个主文件就够了,毕竟是一个很简单的项目。

主要的想法就是,接收到get请求,就返回一张图片就好了,这里不做复杂的分析,不做图片分类的功能,仅仅是随机返回一张图片。

先把下面这一坨模板写上:

from fastapi import FastAPI
from fastapi import Response
from fastapi.responses import RedirectResponse
import uvicorn
from starlette.middleware.cors import CORSMiddleware

app = FastAPI(title="ERIKTSE_PICAPI", version="1.0.0")

# 添加跨域中间件
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"], # 访问来源
    allow_credentials=True, # 用户凭据
    allow_methods=["*"], # 允许请求方法
    allow_headers=['*'], # 允许请求头
)


if __name__ == '__main__' :
    uvicorn.run(app, host="0.0.0.0", port=25588)

接下来完善get_image()这个函数,我们会得到一个图片地址然后重定向过去,这需要我们有一个地址库。

我这里准备了5张图片的网络地址,为了方便演示,直接存入一个数组中,我的想法是调用到api后就重定向到一个随机的图片地址去。

list = ['https://img.xjh.me/img/61324334_p0.jpg',
        'https://img.xjh.me/img/63105666_p0.jpg',
        'https://img.xjh.me/img/65081874_p0.jpg',
        'https://img.xjh.me/img/63866864_p0.jpg',
        'https://img.xjh.me/img/58995100_p0.jpg']

当数据量较大时,应该用文本存储或数据库存储。

可以利用python的random库中的randint函数,生成一个随机数,用于选取数组中的元素。

于是可以有这一段:

@app.get("/image")
async def get_image():
    k = random.randint(0, len(list) - 1)
    return RedirectResponse(list[k])

当然你也可以直接返回图片的地址,用PlainTextResponse可以避免出现字符串两边的引号:

@app.get("/path")
async def getpath():
    k = random.randint(0, len(list) - 1)
    return PlainTextResponse(list[k])

测试

下面两个链接分别可以得到图片和地址:

pic.eriktse.com:25588/image

pic.eriktse.com:25588/path

最后

用fastapi搭建api的方式,与主流的php搭建api的方式不同,php搭建更轻便且无需运行python,虚拟主机即可实现,这个仅做学习。