#1 face_clustering 프로젝트 - flask와 nas 설정

한치·2020년 3월 1일
0

face_clustering

목록 보기
2/3
post-thumbnail

잠이 오지 않는 관계로, 새벽에 바로 이어서 flask를 한번 써보도록 합니다. 주변에서 사용하는걸 한번 본적은 있지만 저는 django를 종종 써왔기때문에 막상 flask를 사용해본적은 한번도 없었습니다. 이번에 한번 해보는걸로 하지요.

flask

python에서 주로 사용되는 웹 프레임워크 중에 가벼운쪽이다. 라고만 알고있는데 정확하게 알고있는것인지 모르겠습니다. 대충 튜토리얼 페이지를 훑어봤을때는 시작 자체는 훨씬 가볍고 빠르게 하는 것 같아보입니다.

flask 설치

poetry add flask

flask quick start

파이썬 스크립트 몇 줄로 일단 로컬 서버를 띄울 수 있다고 하니 한번 따라해봅니다.

flask_main.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello, World!"

실행 스크립트

export FLASK_APP=flask_main.py
flask run

결과 페이지


엄청 뚝딱 띄울 수 있다는건 확실한 것 같습니다;; 숙련자가 아니라서 구성부터 시작해서 곤란할 요소가 엄청 많아보이긴 하지만 최소한의 구현으로 뚝딱해보고 싶은 마음에 선택했기때문에 계속 진행해봅니다.

스킵

구성하는것도 하나하나 작업하려고 했으나, flask tutorial은 엄청 잘 써져있더군요. tutorial 기준으로 작업한 내용은 스킵하겠습니다. 필요하면 나중에 따로 글을 쓰는 것으로..

현황

그래서, 스킵하고 난 다음의 상태 현황은 어떻게 되느냐! 아래 페이지처럼 최소한의 로그인아웃이 제공되며, file이라는 페이지가 추가되어서 현재 로그인한 유저가 등록해둔 파일 경로의 리스트를 출력하게되어 있습니다. 하지만 저 path를 이미지로 출력하고 싶습니다.

이미지 serving

웹 알못이기때문에, static 디렉토리에 들어있는 것 외에는 뽑아서 쓸줄 모릅니다. 하지만 이 프로젝트의 목표는 로컬 영역에 존재하는 디렉토리들에서 사진을 가져와서 face_clsutering을 하는것이기 때문에, 억지로 image를 서빙하는 url을 추가해줍니다. ㅎㅎ

resource.py

무식하게 경로를 획득해와서 고대로 send하는 친구를 만들었습니다. 보통은 directory를 강제로 제한을 두고 개발하는 편이지만 로컬이라서 보안(은 신경 쓰지 않는 것으로 합니다.)과 상관없이 서버가 접근가능한 모든 영역을 열어줘버립니다 ㅎㅎ.. 루트로 실행하면 서버의 모든것을 아낌없이 내어주는 아름다운 친구가 되겠습니다.

import os # 로컬 경로를 사용하기위해 추가
from flask import (
    Blueprint, send_from_directory
)

bp = Blueprint('resource', __name__, url_prefix='/resource')

@bp.route("/<path:path>")
def images(path):
    return send_from_directory(os.path.dirname("/"+path),
                               os.path.basename(path))

대충 파일 시스템 내에서 지원하는 경로를 입력하면 얼추 제대로 반환해주는 것을 확인합니다. 웹에서도 '/'를 레벨에 접근하는 단위로 사용해서 path를 적절하게 설정하는 과정은 좀 보완해야 될 것 같지만, 암튼 작동합니다.

nas 접근

이 프로젝트를 진행하면서 가장 원했던 점이 메인 서버는 파일 경로나 인덱싱 정보만 가지고 있고, 데이터는 nas에 접근해서 획득해오는 것이었습니다. 물론, 네트워크를 타면 속도가 느려지겠지만.. 개발용 컴퓨터에 무식하게 하드들을 꽂아둘 수 없기때문에, 처음 계획대로 nas에 네트워크 드라이브로 접근해서 데이터를 가져오도록 합니다.

실패1. 다이렉트 접근

우분투 상에서 NAS 내부 경로를 어렵지 않게 접근하길래, 웹 페이지에서도 해당 경로를 입력하면 file이 반환되어 들어올 것이라 생각했지만.. 그것은 제 착각이었죠.

afp://hanchi@HDS.local/homes/hanchi/Drive/Moments/Mobile/sample.jpg

위와 같은 식으로 경로가 있는것을 주소창에다가 딱 넣어줬더니 로컬 파일과 다르게 경로를 검색하고 앉았습니다..? afp 때문인거 같은데, afp가 뭔지 모르니 찾아봅니다.

실패2. afp

애플쪽(mac)에서라면 손쉽게 접근하고 마운트 할 수 있는 방식인 것으로 보입니다. 분명, ubuntu에서 접근에 afp를 사용하고 있음에도 afp와 관련된 라이브러리들은 아주우우우 오래전에 사용된 기록이 마지막이네요. afp_client, mount_afp 등의 키워드들을 획득했지만 헛된 희망이라고 판단했습니다.

실패3. nfs

NAS는 공식적으로 파일 시스템 메뉴에서 NFS를 지원하고 있습니다. 무려, 가이드도 잘 써져있습니다. 그래서 설렌 마음으로 가이드를 따라서 열심히 설정하고 설레서 명령어를 쳐봤습니다.

sudo mount -t nfs 192.168.0.7:/volumn1/homes /nas
mount.nfs: access denied by server while mounting 192.168.0.7:/volumn1/homes

...? 뭔가 접근을 거부당했네요. verbose옵션을 사용해봅니다.

sudo mount -t nfs -v 192.168.0.7:/volumn1/homes /nas
mount.nfs: timeout set for Sun Mar  1 14:33:39 2020
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.0.7,clientaddr=192.168.0.2'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4.1,addr=192.168.0.7,clientaddr=192.168.0.2'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4.0,addr=192.168.0.7,clientaddr=192.168.0.2'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'addr=192.168.0.7'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 192.168.0.7 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 192.168.0.7 prog 100005 vers 3 prot UDP port 892
mount.nfs: mount(2): Permission denied
mount.nfs: access denied by server while mounting 192.168.0.7:/volumn1/homes

nfs 버전 별로 접속을 시도했고, 4점대 버전에서는 NAS에서 지원을 추가해두지 않아서 다 빠꾸를 먹었구 3점대 버전에서는 뭔가 대화를 시도한 것 같은데, 서버쪽에서 access deny를 시켰다고 하는 것 같습니다. 살짝, 뒤져봤는데 빠르게 답을 알아낼 수 있을 것 같은 분위기가 아닌거 같아서 날래가 후퇴합니다.

성공. smb

계속 실패하는 와중에 NAS에서 제일 상단에 제공해주는 smb방식으로 시도해보게 되었습니다. 처음부터 위에서부터 찾아봤으면 금세 끝났을걸 아는것과 힌트를 먼저 찾아보겠다고 빨빨 움직인 덕에 몸이 고생했습니다. 2018년 정도에 smb mount를 시도한 글을 찾았고(감사합니다. 그저 빛빛..), 아래의 명령어로 마운트를 성공했습니다.

sudo mount -t cifs //192.168.0.7/homes /nas -o 'username=hanchi,vers=2.0'

cifs 마운트도 첫 회엔 실패가 났었고, mount(95) 에러가 떨어졌습니다. dmesg로 열어보니 vers를 1.0이나 2.0으로 마운트 해보라고해서 vers=2.0 옵션을 추가해서 마운트에 성공했습니다.

성능 이슈

smb를 검색하는 와중에 nfs와 smb 마운트를 비교하는 글들을 몇 개 보게 되었고, 해당 글들에 환경을 구성한 mount 관련 명령어도 뒤늦게 찾게되었습니다. smb가 작은 파일 송신과 전반적으로 성능이 소폭 낮은것으로 집계되었으나, 성능이 부족하다고 느낄 때 수정할 수 있는 영역으로 남겨두어 봅니다.

마운트 영역에서 이미지 가져오기

마운트에 성공했으니, 가벼운 발걸음으로 server에게 파일경로를 던져봅니다! 어제 작업하면서 먹었던 밥이 잘 출력되었습니다.

한글 경로

아이고.. 인자를 줘서 index페이지에서 보려니까 실패를 합니다. url단에서는 한글이 url quoting이 되어있어서, 경로를 획득해올 때, 문제가 발생했습니다. resource 파일에서 url을 unquoting하는 코드를 추가해줍니다.

resource.py

from urllib import parse

def images(path):
    path=parse.unquote("/"+path)
    return send_from_directory(os.path.dirname(path),
                               os.path.basename(path))

결과

index 페이지에서도 경로에 맞는 사진이 출력되게 되었습니다.

다음 목표

face_dection를 붙여서 얼굴이 매칭된 리스트를 한번 뽑아보겠습니다.

profile
안녕하세요

0개의 댓글