CoolFace
Apppublic

response000/apis

sourceHugging Faceapache-2.0updated 7mo agoView on Hugging Face
0likes
app.py134 linesDownload Raw Back to root
1from os import getenv2from fastapi import FastAPI, Form, HTTPException, Request3from fastapi.responses import PlainTextResponse4from starlette.responses import StreamingResponse, Response5 6import requests7 8from json import dumps9from tencentcloud.common.credential import Credential10from tencentcloud.common.profile.client_profile import ClientProfile11from tencentcloud.common.profile.http_profile import HttpProfile12from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException13from tencentcloud.tmt.v20180321.tmt_client import TmtClient14from tencentcloud.tmt.v20180321.models import TextTranslateRequest15 16app = FastAPI()17 18# 创建全局 Session 以复用连接池19session = requests.Session()20 21DN_DEFAULT = "response000-apis.hf.space"22 23# 逐段传输头 (Hop-by-hop headers),根据 RFC 2616 应当被过滤24EXCLUDED_HEADERS = {25    'content-encoding', 'content-length', 'transfer-encoding', 'connection',26    'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers'27}28 29@app.get("/")30def read_root():31    return {"message": "hello Huggingface!apis"}32 33@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"])34async def forward(request: Request, path: str):35 36    # 获取 query 参数37    params = dict(request.query_params)38    dn = params.get('dn', DN_DEFAULT)39    40    url = f'https://{dn}/{path}'41 42    # 准备转发的 Headers43    headers = {k: v for k, v in request.headers.items() 44               if k.lower() not in EXCLUDED_HEADERS and k.lower() != 'host'}45    headers['Host'] = dn46 47    # 获取请求体48    body = await request.body()49 50    try:51        # 发起流式请求52        resp = session.request(53            method=request.method,54            url=url,55            params=params,56            headers=headers,57            data=body,58            cookies=request.cookies,59            allow_redirects=False,60            stream=True,61            timeout=(5, 60)62        )63 64        # 过滤响应头65        resp_headers = [66            (name, value) for name, value in resp.raw.headers.items()67            if name.lower() not in EXCLUDED_HEADERS68        ]69 70        resp.raw.decode_content = True71        return StreamingResponse(72            resp.raw,73            status_code=resp.status_code,74            headers=dict(resp_headers),75            media_type=resp.headers.get("Content-Type")76        )77    78        # 返回流式响应79        # return StreamingResponse(80        #     resp.iter_content(chunk_size=16384),81        #     status_code=resp.status_code,82        #     headers=dict(resp_headers)83        # )84 85    except requests.exceptions.RequestException as e:86        print(f"Proxy Error: {e}")87        return Response(f"Proxy Error: {str(e)}", status_code=502)88 89@app.post("/translate")90def translate(91    txt: str = Form(...),92    source: str = Form(...),93    target: str = Form(...),94):95    ret = ''96    try:97        if txt:98            # API Exploer API在线调试: https://console.cloud.tencent.com/api/explorer?Product=tmt&Version=2018-03-21&Action=TextTranslate99            # 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密100            # 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305101            # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取102            cred = Credential(getenv('SECRET_ID'), getenv('SECRET_KEY'))103            # 实例化一个http选项,可选的,没有特殊需求可以跳过104            httpProfile = HttpProfile()105            httpProfile.endpoint = "tmt.tencentcloudapi.com"106 107            # 实例化一个client选项,可选的,没有特殊需求可以跳过108            clientProfile = ClientProfile()109            clientProfile.httpProfile = httpProfile110            # 实例化要请求产品的client对象,clientProfile是可选的111            # client = TmtClient(cred, "ap-beijing", clientProfile)112            client = TmtClient(cred, "na-siliconvalley", clientProfile)113 114            # 实例化一个请求对象,每个接口都会对应一个request对象115            req = TextTranslateRequest()116            params = {117                "SourceText": txt,118                "Source": source,119                "Target": target,120                "ProjectId": 1251694040121            }122            req.from_json_string(dumps(params))123 124            # 返回的resp是一个TextTranslateResponse的实例,与请求对象对应125            resp = client.TextTranslate(req)126            ret = f'{txt}\n{resp._TargetText}'127 128    except TencentCloudSDKException as err:129        print(err)130        ret = err.message131    finally:132        return PlainTextResponse(ret)133    134