python 服务 fastapi

fast api 服务

依赖安装:

pip install fastapi unicorn

import json
from fastapi import FastAPI

import 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 FastAPI

from 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}"}

参考:Extending OpenAPI - FastAPI 

           fastapi离线使用swagger | lly.im

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会发paper的学渣

您的鼓励和将是我前进的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值