이전 포스트에 이어서 진행한 내용이다. AI server에서 나온 결과 영상을 프론트엔드에서 보여주고한다.
여러 방법들이 존재하지만 AI server에서 토큰을 활용해 임시 url을 만들어 해당 url을 프론트엔드에서 접속하여 출력하는 방식으로 했다.
클라이언트(Streamlit) 측에서 Server로 원하는 파일에 대한 request 를 보내면 Server에서 임시 URL을 만들어 보낸다.
if st.button('Start analysis'):
if uploaded_file is not None:
with st.spinner('Processing ...'):
json_data = json.dumps({"file_name" : uploaded_file.name})
files = {"file": (uploaded_file.name, uploaded_file.getvalue())}
response_upload = requests.post("http://0.0.0.0/upload", files=files)
response_run = requests.post("http://0.0.0.0/run", data=json_data, headers={'Content-Type': 'application/json'})
file_name_without_extension = os.path.splitext(uploaded_file.name)[0]
request_file_name = f'{file_name_without_extension}_resultImage.jpg'
# Flask 서버로 임시 URL 생성 요청 보내기
response = requests.get(f"http://0.0.0.0/generate_url/{request_file_name}")
if response.ok:
# 임시 URL 받기
temp_url = response.text
# Streamlit에서 영상 표시
st.image(temp_url)
json 데이터로 file_name 에 대한 값을 post 요청을 보낸다. 보낸 결과에 대해 서버는 영상을 서버에 저장하고 실행된다. 이 후 결과에 대한 데이터를 받아오기 위해 response 를 보낸다. 여기서 보낸 요청은 서버에서 아래와 같이 응답한다. temp_urls = {} # 임시 url 저장할 곳
@app.route('/generate_url/<filename>') # /generate_url/<filename> get 요청 응답
def generate_temp_url(filename):
token = str(uuid.uuid4()) # 고유 식별자 생성 - 토큰 생성을 위함
expiration_time = datetime.now() + timedelta(hours=1) # url 만료 시간 - 1시간 후 만료
temp_urls[token] = {'filename': filename, 'expires': expiration_time}
return f'http://flask_server/temp/{token}'
@app.route('/temp/<token>')
def temp_file(token):
data = temp_urls.get(token)
if data and data['expires'] > datetime.now():
directory = 'uploaded_files' # 파일이 저장된 디렉토리 경로 (서버 내의 파일 경로)
filename = data['filename']
return send_from_directory(directory, filename)
except ValueError:
abort(404) # 잘못된 경로 접근 시
else:
abort(404) # 토큰이 만료되었거나 유효하지 않은 경우
uuid 를 통해 고유 식별자를 만들어 이를 토큰으로 활용한다. 토큰에는 파일이름과 만료될 시간을 기입한다. 그리고 토큰이 담긴 url을 클라이언트에게 보내고 요청이 오면 해당 경로의 파일을 보여준다.