저번 포스팅에 이어서 슬랙 봇 관련하여 코드를 정리해본다.
최초에 fastapi 생성 후 만들 때 main.py에 모든 기능들을 다 추가하였는데
기능들이 추가될 때 마다 보기힘들고 분류도 되지 않기 때문에
router를 prefix단위로 쪼개서 계속 붙여나가려고 한다.
.
├── app
│ ├── __init__.py
│ ├── main.py
│ ├── dependencies.py
│ └── routers
│ │ ├── __init__.py
│ │ ├── router1.py
│ │ └── router2.py
main.py에 집중되어있던 부분들을 위와같은 구조로 변경하려고한다.
router = APIRouter(
prefix="/slack",
tags=["slack"],
)
router 폴더를 만들고 파일을 만든 후 위와같이 APIRouter 클래스를 이용하여 router 객체를 생성한다.
prefix를 이용해서 {서버주소}/slack/myname
형태로 접근할 수 있도록 한다.
@router.post("/myname")
async def input_myname():
slack_client.post_message(
channel_id=url.channel_id,
text="나의이름은",
blocks=slack_client.plain_text_input(
label_text="당신의 이름을 '한자'로 입력해 주세요.",
place_holder="ex) 炯旭 (성을 제외한 이름만 입력해주세요.)"
)
)
return
@router.post("/interactive")
async def post_message(request: Request, db: Session = Depends(get_db)):
form_data = await request.form()
payload = json.loads(form_data.get("payload"))
myname = payload["actions"][0]["value"]
name_list = [myname[i:i+1] for i in range(len(myname))]
result = await get_china_character_name(name_list, db)
if not result:
message = "멋진 이름입니다. 당신의 이름에는 불용한자가 없습니다!"
else:
name_text = ""
for name in result:
name_text = f"{name_text}불용한자는 [{name.cha_name},{name.kor_name}]이며, 이 한자는 {name.description}\n"
message = f"당신의 이름 중 불용한자는 총 {len(result)}개 입니다...\n{name_text}\n\n부모님이 주신 소중한 이름, 재미로만 봐주세요 🥹"
slack_client.post_message(
channel_id=url.channel_id,
text=message,
)
return
이런식으로 파일을 계속 추가하면서 기능별로 분리해주도록 하고
router들을 생성한 후에는 main.py에서 해당 router들을 합쳐야한다.
from routers import china_character
app = FastAPI()
app.include_router(china_character.router)
이 때는 include_router를 이용해서 router들을 포함시키도록 한다.
마찬가지로 notion API들도 이동해서 main.py에서 없애도록한다.
import sys, os
import requests
from fastapi import APIRouter, Body
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))))
from slack_notion import url
from slack_notion import config
router = APIRouter(
prefix="/notion",
tags=["notion"],
)
# URL Setting
# @router.post("/message")
# async def post_message(request_body: dict = Body(...)):
# response = {"challenge": request_body["challenge"]}
# print(response)
# return response
# Notion API
# @router.post("/message")
# async def post_message(request_body: dict = Body(...)):
# print(request_body["event"]["text"])
#
# await set_message_notion(request_body["event"]["text"])
# return request_body["event"]["text"]
# CHA Character
@router.post("/message")
async def post_message(request_body: dict = Body(...)):
# print(request_body["event"]["text"])
# print(request_body)
# await set_message_notion(request_body["event"]["text"])
return request_body["event"]["text"]
async def set_message_notion(message: str):
request_body = {"parent": {"database_id": "752bcc48aaa646be99b9a07676b32afc"}, "properties": {"Name": {"title": [{"text": {"content": message}}]}}}
response = requests.post(url.database_url, headers={"Authorization": f"Bearer {config.notion_token}", "Notion-Version": "2022-02-22"}, json=request_body)
print(response.text)