skwhp_api.py 1.9 KB

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