main.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. from fastapi import FastAPI, Request
  2. from fastapi.exceptions import RequestValidationError
  3. from fastapi.responses import JSONResponse
  4. from app.api.modbus import router as modbus_router
  5. from app.response import response_payload
  6. def validation_error_message(exc: RequestValidationError) -> str:
  7. messages: list[str] = []
  8. for error in exc.errors():
  9. location = ".".join(str(item) for item in error.get("loc", []) if item != "body")
  10. message = error.get("msg", "validation error")
  11. messages.append(f"{location}: {message}" if location else message)
  12. return "; ".join(messages) or "validation error"
  13. def create_app() -> FastAPI:
  14. app = FastAPI(title="Data Collector Gateway")
  15. app.include_router(modbus_router, prefix="/api/dc-gateway")
  16. @app.exception_handler(RequestValidationError)
  17. async def request_validation_exception_handler(
  18. request: Request,
  19. exc: RequestValidationError,
  20. ) -> JSONResponse:
  21. data: dict[str, list] = {}
  22. if request.url.path.endswith("/modbus/read"):
  23. data = {"communication": []}
  24. elif request.url.path.endswith(("/modbus/read_points", "/modbus/read-points")):
  25. data = {"points": []}
  26. return JSONResponse(
  27. status_code=200,
  28. content=response_payload(1, validation_error_message(exc), data),
  29. )
  30. return app
  31. app = create_app()
  32. def main() -> None:
  33. import uvicorn
  34. uvicorn.run(app, host="0.0.0.0", port=8000)