当前位置: 首页 > news >正文

Python开发:使用FastAPI创建后端服务

业务场景

API接收的参数是一个下载链接,服务端拿到这个链接后,下载文件,之后解析文件,解析成功后返回解析成功否则解析失败。

项目结构

app/
├── main.py          # 入口
├── api.py           # API 路由
├── services/├── downloader.py  # 下载逻辑└── parser.py      # 解析逻辑

安装依赖

在项目的虚拟环境中安装依赖:
如何创建虚拟环境参考之前的文章:
https://blog.csdn.net/zhang_jiamin/article/details/147442999?spm=1011.2415.3001.5331

pip3 install fastapi uvicorn aiohttp

fastapi → Web 框架
uvicorn → 启动 ASGI 服务器
aiohttp → 异步下载文件(比 requests 更适合异步)

定义 API 路由 (app/api.py)

from fastapi import APIRouter, HTTPException, Form
from fastapi.responses import JSONResponse
from app.services.downloader import download_file
from app.services.parser import parse_filerouter = APIRouter()@router.post("/app/fileParse")
async def parse_file_api(url: str = Form(...)):try:# 1. 下载文件local_path = await download_file(url)# 2. 解析文件apk_url = await parse_file(local_path)return {"apkUrl": apk_url}except Exception as e:raise HTTPException(status_code=500, detail=str(e))

下载逻辑 (app/services/downloader.py)

import aiohttp
import aiofiles
import tempfile
import os
import logginglogger = logging.getLogger(__name__)async def download_file(url: str) -> str:tmp_dir = tempfile.mkdtemp()local_path = os.path.join(tmp_dir, "test_file.file")async with aiohttp.ClientSession() as session:async with session.get(url) as resp:if resp.status != 200:raise Exception(f"下载失败: {resp.status}")logger.info("开始下载文件")async with aiofiles.open(local_path, 'wb') as f:while chunk := await resp.content.read(1024):await f.write(chunk)return local_path

解析逻辑 (app/services/parser.py)

import os
import subprocess
import logginglogger = logging.getLogger(__name__)async def parse_file(local_path: str) -> str:logger.info("开始解析文件")base_dir = os.path.dirname(os.path.abspath(__file__))bundletool_path = os.path.join(base_dir, "..", "..", "bundletool.jar")jks_path = os.path.join(base_dir, "..", "..", "debug.jks")dir_path = os.path.dirname(local_path)apk_dir_path = os.path.join(dir_path, "test_app.apks")cmd = ["java", "-jar", f"{bundletool_path}", "build-apks",f"--bundle={local_path}",f"--output={apk_dir_path}",f"--ks={jks_path}","--ks-pass=pass:1234567","--ks-key-alias=debug","--key-pass=pass:1234567"]result = subprocess.run(cmd, capture_output=True, text=True)if result.returncode == 0:logger.info(f"命令执行成功,returncode={result.returncode}")else:logger.error(f"命令执行失败,returncode={result.returncode}, stderr={result.stderr}")"""上传解析后的文件到s3,返回s3链接,或者直接返回解析后的文件和结果"""apk_url = "https://your-bucket.s3.amazonaws.com/fake-app.apk"return apk_url

FastAPI 入口 (app/main.py)

from fastapi import FastAPI
from app.api import routerapp = FastAPI(title="FILE Parser API")app.include_router(router, prefix="/v1")# 启动服务: uvicorn main:app --reload

启动服务

testmanzhang@loaclhost file_parse % source .venv/bin/activate    
(.venv) testmanzhang@loaclhost file_parse % 
(.venv) testmanzhang@loaclhost file_parse % 
(.venv) testmanzhang@loaclhost file_parse % uvicorn main:app --reload
INFO:     Will watch for changes in these directories: ['/Users/testmanzhang/PycharmProjects/file_parse']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [73816] using StatReload
INFO:     Started server process [73819]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     127.0.0.1:55102 - "GET /docs HTTP/1.1" 200 OK
INFO:     127.0.0.1:55102 - "GET /openapi.json HTTP/1.1" 200 OK

fastapi自带Swagger,地址为:

http://127.0.0.1:8000/docs

在这里插入图片描述
可以使用Swagger进行接口测试,填写参数(下载地址)后点击Execute
在这里插入图片描述

http://www.dtcms.com/a/394827.html

相关文章:

  • Nginx配置中location和proxy_pass指令尾部是否带斜杠的区别
  • Nginx核心配置
  • 医院不良事件管理系统:提升医疗安全的智能化解决方案
  • 【$.post回调函数未被执行的原因分析】,第048篇
  • 远程连接服务器的远程重启办法shutdown -r -t 0
  • 【js】关于JWT的前端存储新思路
  • Unity官方Dots范例工程学习——Jobs101
  • 如何在SQLite中实现事务处理?
  • 广东省省考备考(第一百零四天9.22)——判断推理(强化训练)
  • k8s 常用命令
  • windows远程桌面服务安全加固的配置指南
  • datawhale玩转通义四大新模型 202509 第4次作业
  • MySQL 表约束实战指南:从概念到落地,守护数据完整性
  • 64位整型变量错误使用int类型对应的格式化符%d导致软件崩溃问题的排查与分析(借助deepseek辅助分析)
  • 【Linux操作系统】简学深悟启示录:Ext系列文件系统
  • 第8节-PostgreSQL数据类型-UUID
  • S2多维可视分析表格解析
  • 面经分享--百度开发一面
  • 第15讲 机器学习的数学
  • NestJS-身份验证JWT的使用以及登录注册
  • ChatGPT “影子泄露” 漏洞:黑客可隐秘窃取电子邮件数据
  • Coze Stdio模型配置
  • DSC 参数ARCH_HANG_FLAG对集群的影响
  • Android Jetpack Compose 从入门到精通
  • 【数据结构与算法-Day 31】图的遍历:深度优先搜索 (DFS) 详解,一条路走到黑的智慧
  • C#练习题——LinkedList 的进阶应用与测试
  • 手机CPU型号
  • jdbc相关知识
  • yolov12 导出onnx
  • Linux 环境变量与程序地址空间