main.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. # -*- coding:utf-8 -*-
  2. """
  3. @author: isaacqyang
  4. @time: 2022/8/29
  5. @desc:
  6. """
  7. import argparse
  8. import time
  9. import traceback
  10. import uuid
  11. import uvicorn
  12. from fastapi import FastAPI, Request, Path, Body
  13. from starlette.responses import RedirectResponse
  14. from commom import f_doc_export, get_logger, request_id_context
  15. from entitys.response import BaseResponse
  16. logger = get_logger()
  17. app = FastAPI()
  18. def doc_export(
  19. token: str = Path(title='doc token', description="文档的token"),
  20. request_id: str = Path(title='request id', description="请求ID作为文档名后缀"),
  21. data: object|None = Body(None, description="额外参数")
  22. ):
  23. try:
  24. # request_id = str(uuid.uuid4()) #request_id_context.get()
  25. # logger.info(f"Request ID: {request_id}, Token: {token}")
  26. word_downloda_url = f_doc_export(token, request_id, data)
  27. if word_downloda_url:
  28. return BaseResponse.ofSuccess(word_downloda_url)
  29. else:
  30. return BaseResponse.ofFailure("生成word失败")
  31. except Exception as msg:
  32. logger.error(traceback.format_exc())
  33. return BaseResponse.ofFailure(str(msg))
  34. @app.middleware("http")
  35. async def add_request_id_header(request: Request, call_next):
  36. request_id = request.headers.get("X-REQUEST-ID")
  37. if request_id is None or len(request_id) == 0:
  38. request_id = str(uuid.uuid4())
  39. request_id_context.set(request_id)
  40. start_time = time.time()
  41. response = await call_next(request)
  42. process_time = time.time() - start_time
  43. response.headers["X-REQUEST-ID"] = request_id_context.get()
  44. response.headers["PROCESS-TIME"] = f"{process_time:.2f}"
  45. return response
  46. async def document():
  47. return RedirectResponse(url="/docs")
  48. def api_start(host, port):
  49. app.get("/", response_model=BaseResponse)(document)
  50. app.post("/znjd/doc/export/{token}/{request_id}", response_model=BaseResponse)(doc_export)
  51. uvicorn.run(app, host=host, port=port)
  52. if __name__ == "__main__":
  53. parser = argparse.ArgumentParser()
  54. parser.add_argument("--host", type=str, default="0.0.0.0")
  55. parser.add_argument("--port", type=int, default=18070)
  56. args = parser.parse_args()
  57. api_start(args.host, args.port)