skwhp_api.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, HTTPException, Response
  4. import requests
  5. import asyncio
  6. import json
  7. import traceback
  8. from extensions import logger
  9. TARGET_BASE_URL = "http://172.26.1.85:8530/api"
  10. router = APIRouter()
  11. def sync_fetch(method, url, params=None, headers=None, data=None):
  12. try:
  13. response = requests.request(
  14. method,
  15. url,
  16. params=params,
  17. headers=headers,
  18. data=data,
  19. timeout=30 # 设置超时
  20. )
  21. return Response(
  22. content=response.content,
  23. status_code=response.status_code,
  24. headers=dict(response.headers)
  25. )
  26. except Exception as e:
  27. traceback.print_exc()
  28. raise Exception(f"Requests error: {str(e)}")
  29. @router.api_route("/skwhp/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH"])
  30. async def proxy(request: Request, path: str):
  31. target_url = f"{TARGET_BASE_URL}/{path}"
  32. method = request.method.lower()
  33. params = dict(request.query_params)
  34. headers = dict(request.headers) # 可按需筛选 headers
  35. body = None
  36. if method in ["post", "put", "patch"]:
  37. try:
  38. body = await request.body()
  39. except:
  40. traceback.print_exc()
  41. body = None
  42. try:
  43. logger.info(target_url)
  44. if body is not None:
  45. data = body.decode(encoding='utf-8')
  46. if len(data) > 0:
  47. data = json.loads(data)
  48. logger.info(data)
  49. except:
  50. traceback.print_exc()
  51. pass
  52. # 使用 asyncio.to_thread 在后台线程中运行同步的 requests 调用
  53. try:
  54. response = await asyncio.to_thread(
  55. sync_fetch,
  56. method,
  57. target_url,
  58. params=params,
  59. headers=headers,
  60. data=body
  61. )
  62. return response
  63. except Exception as e:
  64. traceback.print_exc()
  65. raise HTTPException(status_code=500, detail=f"代理请求失败: {str(e)}")