-
Notifications
You must be signed in to change notification settings - Fork 176
/
Copy pathapi.py
89 lines (71 loc) · 2.7 KB
/
api.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
"""
Entry for startup fastapi server
"""
import logging
from fastapi import FastAPI, Header, Response, Request, status
from fastapi.responses import FileResponse, JSONResponse
from fastapi.exceptions import RequestValidationError
from fastapi.middleware.cors import CORSMiddleware
from fastapi.middleware.gzip import GZipMiddleware
import uvicorn
from fooocusapi.utils import file_utils
from fooocusapi.routes.generate_v1 import secure_router as generate_v1
from fooocusapi.routes.generate_v2 import secure_router as generate_v2
from fooocusapi.routes.query import secure_router as query
from fooocusapi.utils.img_utils import convert_image
app = FastAPI()
logging.basicConfig(level=logging.DEBUG)
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
# 记录错误信息到日志
logging.error(f"Validation error: {exc.errors()}, body: {exc.body}")
# 返回更详细的错误信息给客户端
return JSONResponse(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
content={"detail": exc.errors(), "body": exc.body},
)
app.add_middleware(GZipMiddleware, minimum_size=1000)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Allow access from all sources
allow_credentials=True,
allow_methods=["*"], # Allow all HTTP methods
allow_headers=["*"], # Allow all request headers
)
@app.get("/files/{date}/{file_name}", tags=["Query"])
async def get_output(date: str, file_name: str, accept: str = Header(None)):
"""
Get a specific output by its ID.
"""
accept_formats = ('png', 'jpg', 'jpeg', 'webp')
if accept is not None:
try:
_, ext = accept.lower().split("/")
if ext not in accept_formats:
ext = None
except ValueError:
ext = None
else:
ext = file_name.split('.')[-1]
if ext not in accept_formats:
ext = None
if not file_name.endswith(accept_formats):
return Response(status_code=404)
if ext is None:
try:
return FileResponse(f"{file_utils.output_dir}/{date}/{file_name}")
except FileNotFoundError:
return Response(status_code=404)
img = await convert_image(f"{file_utils.output_dir}/{date}/{file_name}", ext)
return Response(content=img, media_type=f"image/{ext}")
app.include_router(query)
app.include_router(generate_v1)
app.include_router(generate_v2)
def start_app(args):
"""Start the FastAPI application"""
file_utils.STATIC_SERVER_BASE = args.base_url + "/files/"
uvicorn.run(
app="fooocusapi.api:app",
host=args.host,
port=args.port,
log_level=args.log_level)