Project/Python

[SERVER] FLASK

moguogu 2021. 7. 28. 19:58

flask

flask 사용 이유

검색을 해보니 django보다 조금 더 가벼운 형태로 사용할 수 있다고 해서 선택하게 되었다.
실제로 사용해보니 문법도 파이썬이라서 간편하고 라우팅 하는 부분만 이해하면 간편하게 쓸 수 있었다.

개발 하는 내용

감정인식 기반의 답변 출력 챗봇 웹 형태로 제작 및 UX/UI 적용


> flask 코드

import os
import json
import numpy as np
import torch
from dialogLM.model.kogpt2 import DialogKoGPT2
from kogpt2_transformers import get_kogpt2_tokenizer
from flask import Flask,request,Response,render_template

arr=[]

app=Flask(__name__)

@app.route("/",methods='POST')
def hello():
    return render_template('test.html')#test.html 페이지로 연결


@app.route("/post",methods='POST') #url에 연결 -> post로 연결
def home():
    # 체크 포인트 생략
    # 저장한 Checkpoint 불러오기
    checkpoint = torch.load(save_ckpt_path, map_location=device)
    # 필요한 모델 불러오기
    model = DialogKoGPT2() 
    model.load_state_dict(checkpoint['model_state_dict'])
    model.eval()
    tokenizer = get_kogpt2_tokenizer()

    count = 0
    output_size = 200 # 출력하고자 하는 토큰 갯수
    # 답변 출력 부분
    while 1:
    # for i in range(5):
      sent = request.form['msg']  # '요즘 기분이 우울한 느낌이에요'
      if sent.encode().isalpha():
        print("한국말로 해주세용^^")
        print(100 * '-')
        continue
      tokenized_indexs = tokenizer.encode(sent)

      input_ids = torch.tensor([tokenizer.bos_token_id,]  + tokenized_indexs +[tokenizer.eos_token_id]).unsqueeze(0)
      # set top_k to 50
      sample_output = model.generate(input_ids=input_ids)

      str= tokenizer.decode(sample_output[0].tolist()[len(tokenized_indexs)+1:],skip_special_tokens=True)
      answer=str.split('.')[0] # 챗봇의 답변
      arr.append(sent) #내가 입력한 부분 
      arr.append(answer) #챗봇의 답변

      return render_template('test.html',msg=arr) # test.html 페이지로 렌더링 및 arr(내 입력과 답변이 저장된 list)전달


if __name__ == '__main__':
    app.run(host='-.-.-.-', port=5000)# 연결하는 ip주소와 포트 번호 설정 

> 챗봇 답변 출력 html 코드 일부분

       <!--반복문으로 msg list 값에서 value 라는 이름으로 출력-->
             <!--짝수 홀수로 나누어 출력하기 위한 index 이용-->
            <li class="me">
                        <div class="entete">
                        <h2>Me</h2>
                        <span class="status blue"></span></div>
                        <div class="triangle"></div>
                        <div class="message">발화<div></li>
        <!--조건문 사용시 해당 태그로 닫기-->


                        <li class="you"> 
                        <div class="entete">
                        <h2>Chatbot</h2>
                        <span class="status blue"></span></div>
                        <div class="triangle"></div>
            <div class="message">답변<div></li>

          <!--반복문 사용시 해당 태그로 닫기-->

코드 설명

html 코드의 경우 flask코드에서 렌더링 할 때 msg라는 이름으로 데이터를 같이 전달해 주었다.
이러한 경우 jinja2라는 문법을 사용해서 값을 출력시킬 수 있다. 깃허브에서 확인할
반복문을 사용하여 출력 시킬 수 있었다. 주석을 확인해 보면 자세한 설명을 확인할 수 있다.

삽질 부분

  1. html 페이지를 적용 시키기 위해서는 그냥 경로에 두면 안되고 /templates/a.html 이런식으로 파일이 존재해야한다.
  2. css 페이지를 적용 시키기 위해서는 마찬가지로 그냥 경로에 두면 안되고 /static/css/a.css와 같은 경로애 파일이 있어야 적용 가능하다.

깃허브 링크

https://github.com/dividiviDeep/emotion_chatbot

'Project > Python' 카테고리의 다른 글

[CSV to JSON] 공공데이터 자료 변환 후 mongoDB에 넣기  (0) 2022.07.30