fastapi swagger 접근제한
app = FastAPI(
title="server",
description="omija server",
docs_url=None,
redoc_url=None,
openapi_url=None,
root_path="/api",
)
class AdminPageAuth(HTTPBasic):
pass
security = AdminPageAuth()
def get_admin(
credentials: Annotated[HTTPBasicCredentials, Depends(security)],
config: Annotated[Settings, Depends(get_settings)],
):
correct_username = secrets.compare_digest(
credentials.username,
config.USERNAME,
) # type: ignore
correct_password = secrets.compare_digest(
credentials.password,
config.PASSWORD
) # type: ignore
if not (correct_username and correct_password):
raise HTTPException(
status_code=401,
detail="Incorrect ID or password",
headers={"WWW-Authenticate": "Basic"},
)
return credentials.username
@app.get("/swagger", tags=["docs"])
async def get_docs(username: str = Depends(get_admin)):
return get_swagger_ui_html(openapi_url="/openapi.json", title="docs")
@app.get("/openapi.json", tags=["docs"])
async def openapi(username: str = Depends(get_admin)):
return JSONResponse(
content=get_openapi(title="docs", version="0.1.0", routes=app.routes)
)
이렇게 해놓으면 맨 처음 swagger에 접근할때 아이디와 비밀번호를 요청할 수 있음.
asyncopenai gpt
async 버전의 openai 패키지가 존재한다.
from openai import AsyncOpenAI
client = AsyncOpenAI(api_key=config.API_KEY.OPENAI)
async def get_summary_from_post(post: str) -> list:
response = await client.chat.completions.create(
model="gpt-4o-mini",
response_format={
"type": "json_object",
},
messages=[
{
"role": "system",
"content": """글을 문단별로 요약해줘. 제대로 안하면 회초리 때린다? 출력은 다음과 같은 json으로 해줘
"summary" : [{"1" : "asdf"},{"2" :"fdsa"}]""",
},
{"role": "user", "content": post},
],
)
summary = response.choices[0].message.content
summary_json = json.loads(summary)
return summary_json.get("summary", [])
이렇게 해놓으면 나중에 aiohttp로 비동기식 무차별폭격 호출해도 잘 됨
