[n8n] 백엔드 파이썬 서버 붙이기

소개

  • n8n의 code node는 python을 제한적으로만 지원함. 따라서 다양한 python 코드를 활용하려면 백엔드가 필수적임.

  • render를 통해 백엔드를 구성하였고, n8n의 http request로 불러올 수 있음을 확인함.

진행 방법

  • cursor (IDE)

  • n8n

  • render (파이썬 백엔드)

  • chatgpt

n8n WorkFlow

  • Main workflow

Google 태깅 프로세스의 프로세스를 보여주는 다이어그램
  1. 구글 드라이브에 새로운 이미지 파일(예를들면 택시 영수증)이 업로드 되면,

  2. 파일의 다운로드 링크 주소를 받아서,

  3. http request로 웹훅을 불러옴

✅ 초기에는 이미지를 download 받은 후, base64로 변환한 이후에 http request로 보내려고 하였음. 그러나 용량의 문제, json 처리의 문제 등으로 인해 백엔드에서 직접 다운받고 base64 변환하는것이 더 낫다고 판단함. 따라서 구글드라이브에서는 다운로드 링크만 받도록 처리하였음.

Google 드라이브에서 공유 파일 옵션의 스크린 샷

다운로드 링크를 누구나 볼 수 있도록, shaer file node를 설정하였음.

  • Sub workflow

여러 단계를 보여주는 웹 페이지의 스크린 샷
많은 버튼이있는 화면의 스크린 샷
  • process라는 endpoint를 사용함.

  • 사용자가 미리 지정한 data label(ex. 결제금액, 승하차시간)과 사진다운로드 링크를 백엔드에 전송함

  • 백엔드는 받아서 data label에 맞는 데이터를 추출하여 반환함

웹 브라우저에서 CSS 파일의 스크린 샷
  • 날짜는 2025년인데 2023년으로 잘못 추출함 -> 추후 프롬프트를 정교하게하던가, 이미지처리를 gemini로 바꾸던가 해야할듯

  • 차량번호와 결제요금은 정확하게 추출함.

  • Respond to webhook 노드를 통해 메인 워크플로우에 반환함

[Backend] Render, Fastapi

챗지피티와 커서에게 엄청나게 많이 물어봤다.

deploy 에러도 많이 나고, 원하는대로 실행이 안되서 여기서 시간을 엄청 잡아먹었다.

결국 어찌저찌했는데.. 뭘 한건지 다시 공부할 필요가 있을듯하다.

그래도 기억나는 것들만 정리하자면..

  • Render에서 백엔드를 만드려면, "Web service"로 만들어야함. "Static site"가 아니다.

  • Deploy가 5분이상 걸리면 뭔가 렉걸린거라서, 중단시키고 재배포를 해야한다.

  • 파이썬 코드에서 API키를 쓰는경우, render에서는 환경변수에 api키를 직접 넣어줘야한다.

  • 파이썬 코드에서 @app.get / @app.post 로 REST API를 지정할 수 있다.

@app.get("/")
async def root():
    """Hello World 엔드포인트"""
    return {"message": "Hello World"}

@app.get("/health")
async def health_check():
    """서버 상태 확인 엔드포인트"""
    return {"status": "healthy"}
  • 또한 BaseModel을 이용하여 pydantic 하게 인풋내용을 미리 지정할수 있다..(잘모름)

class ImageRequest(BaseModel):
    web_content_link: HttpUrl = Field(
        ...,
        description="Google Drive의 webContentLink 형태로, anyone-with-link 상태여야 합니다."
    )
    labels: List[str] = Field(
        ...,
        min_items=1,
        description="최소 1개 이상의 라벨을 문자열 리스트로 전달합니다."
    )
  • 저장된 class를 바탕으로 request와 response의 형태를 지정할 수 있다. class로 request를 지정하는 경우 header를 반드시 붙여야한다.

@app.post("/process", response_model=ImageResponse)
def process_image(req: ImageRequest):
    # 1) 이미지 다운로드
    # 블라블라 ...

결과와 배운 점

  • 파이썬 백엔드 코드를 좀 공부해볼 필요가 있겠다. 지금은 LLM이 알려준거 복붙수준이다.. ㅠ

  • 파이썬 백엔드를 붙이면 n8n을 좀 더 확장성있게 사용할 수 있다.

  • render 무료 버전은, 일정시간이 inactive하면 수면상태에 빠져든다. 따라서 2분마다 get 하는 http request를 설정해놨다. => 프로젝트가 블락 당할수 있다고하네요..

  • 서브 워크플로우에서 webhook 설정할때, 맨처음 webhook trigger node에서 respond 를 immediately가 아니라 using respond to webhook node 를 선택해줘야한다.

  • chatgpt vision calling 할 때, LLM은 과거 코딩데이터를 가지고 있다. chat completion? 방식만을 알고 있다. 그런데 이제는 response 방식으로 바뀌었다. docs 내용을 복붙해줘야 한다.

  • 2주차 강의도 밀려서 못들었다.. 빨리 따라가야지..

1
1개의 답글

👉 이 게시글도 읽어보세요