fast api 服务
依赖安装:
pip install fastapi unicorn
import json
from fastapi import FastAPIimport os
os.environ['TZ'] = 'Asia/Shanghai'
async def call_http_get_service(url):
async with aiohttp.ClientSession() as session:async with session.get(url) as response:
return await response.text()app = FastAPI()
@app.get("/myfist")
async def home(query:str):request_url=""
response = await call_http_get_service(request_url)
json_response = json.loads(response)
correct_query=json_response.get("text_new",query)
return {"data":correct_query}
服务执行:uvicorn correct_service:app --host 0.0.0.0 --port 22101
方法一:基于fastapi进行流式服务返回。(支持对大文件或大文本的分阶段内容返回)
# -*-coding:utf-8-*-
import json
from fastapi import FastAPI
import os
import uvicorn
from fastapi.responses import StreamingResponse
os.environ['TZ'] = 'Asia/Shanghai'
app = FastAPI()
async def _gen():
for i in range(10):
yield {"data":i}async def _stream_message():
final_total_message = []async for answer_message in _gen():
yield "data: " + json.dumps(answer_message,ensure_ascii=False) + "\r\n"@app.get("/basic_service_path")
async def chat():return StreamingResponse(_stream_message(),media_type="text/plain; charset=utf-8")
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=PORT)
方法二:(适合大模型的流式输出,有了标准的输出规范)
# -*-coding:utf-8-*-
import json
from fastapi import FastAPIfrom sse_starlette.sse import ServerSentEvent, EventSourceResponse
import os
import uvicorn
os.environ['TZ'] = 'Asia/Shanghai'app = FastAPI()
def _gen():
for i in range(10):
yield {"data": i}def decorate(generator):
for item in generator:
yield ServerSentEvent(json.dumps(item, ensure_ascii=False), event='delta')@app.get("/basic_service_path")
async def chat():
return EventSourceResponse(decorate(_gen()), media_type="text/plain; charset=utf-8")if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=22104)
关于SSE流式处理的规范:使用FastAPI与aiohttp进行SSE响应开发 - 知乎
使用aiohttp流式结果的数据获取:
import aiohttp
async def post_service(llm_server_url,llm_server_path,data):
async with aiohttp.ClientSession(llm_server_url) as session:
async with session.post(llm_server_path, json=data) as response:
async for chunk in response.content:
decode_message = chunk.decode('utf8').strip("data:").strip("\r\n")
if decode_message and "DONE" not in decode_message:
yield decode_message
使用http方式获取流式结果:
def test(): url = r"http://127.0.0.1:8000/" headers = {'Content-Type': 'text/event-stream'} response = requests.get(url, headers=headers, stream=True) for chunk in response.iter_content(chunk_size=1024, decode_unicode=True): print(chunk)
关于在离线(非联网)状态下,fastapi进行swagger接口查看:
Swagger UI使用文件: swagger-ui-bundle.js | swagger-ui.css
ReDoc使用该文件:redoc.standalone.js
项目文件结构
.
├── app
│ ├── __init__.py
│ ├── main.py
└── static
├── redoc.standalone.js
├── swagger-ui-bundle.js
└── swagger-ui.css
from fastapi import FastAPI from fastapi.openapi.docs import ( get_redoc_html, get_swagger_ui_html, get_swagger_ui_oauth2_redirect_html, ) from fastapi.staticfiles import StaticFiles app = FastAPI(docs_url=None, redoc_url=None) app.mount("/static", StaticFiles(directory="static"), name="static") @app.get("/docs", include_in_schema=False) async def custom_swagger_ui_html(): return get_swagger_ui_html( openapi_url=app.openapi_url, title=app.title + " - Swagger UI", oauth2_redirect_url=app.swagger_ui_oauth2_redirect_url, swagger_js_url="/static/swagger-ui-bundle.js", swagger_css_url="/static/swagger-ui.css", ) @app.get(app.swagger_ui_oauth2_redirect_url, include_in_schema=False) async def swagger_ui_redirect(): return get_swagger_ui_oauth2_redirect_html() @app.get("/redoc", include_in_schema=False) async def redoc_html(): return get_redoc_html( openapi_url=app.openapi_url, title=app.title + " - ReDoc", redoc_js_url="/static/redoc.standalone.js", ) @app.get("/users/{username}") async def read_user(username: str): return {"message": f"Hello {username}"}