FLASK 인스타 클론

이민기·2022년 5월 4일
0

이미지 미리 보기

    function setImageFromFile(input, expression) {
        if (input.files && input.files[0]) {
            var reader = new FileReader();
            reader.onload = function (e) {
                $(expression).attr('src', e.target.result);
            }
            reader.readAsDataURL(input.files[0]);
        }
    }
<img src="" id="preview">

setimgformfile 이라는 함수를 만들어 준다.
input,expression 을 매개 변수로 넣어 준다.
만약 파일이 있고 input 파일이 0번째 라면
reader 변수에 file을 읽어서 저장해 준다.

$('#photo_upload').change(function(){
  setImageFromFile(this, '#preview');
})

해당 아이디에 폼이 체인지가 되었을때 지정된 아이디 src 링크에 넣어준다.

@app.route('/upload', methods=['GET', 'POST'])
def get_file():
    if request.method == 'POST':
        image = request.files['file']
        image.save(f'./static/img_upload/{image.filename}')
    return redirect(url_for('profile'))

FLASK에서 폼에서 받아온 이미지 파일을 저장해 준다.
HTML file name에서 파일을 받아와 static/img_upload/ 폴더에
받아온 이미지 파일 네임으로 저장해 준다.

이미지 파일명을 암호화 시킬수도 있다.

FLASK 세션 사용 하기

from flask import Flask, request, session, redirect, url_for
app = Flask(__name__)
app.secret_key = 'any random string'

Flask session 사용을 위해서 임포트 해준다.

세션을 사용하기 위해서는 .....

app.secret_key 값을 지정해 줘야 한다.

@app.route('/')
def index():
   if 'username' in session:
    	username = session['username']
    	return '로그인 되어 있습니다.'

세션에 해당 유저네임이 있다면 로그인이 되어 있는 것이다.

@app.route('/login', methods = ['GET', 'POST'])
def login():
   if request.method == 'POST':
      session['username'] = request.form['username']
      return redirect(url_for('index'))
   return '''
	
   <form action = "" method = "post">
      <p><input type = text name = username></p>
      <p<input type = submit value = Login></p>
   </form>
	
   '''

로그인 아이디 정보를 받아와 session['username']에 저장해 줄수 있다.

@app.route('/logout')
def logout():
   # remove the username from the session if it is there
   session.pop('username', None)
   return redirect(url_for('index'))
   

pop으로 session 에서 해당 아이디를 뽑아 낼수 있고 그 이후로는 로그아웃이 된다.

from datetime import timedelta
from flask import session, app

@app.before_request
def make_session_permanent():
    session.permanent = True
    app.permanent_session_lifetime = timedelta(minutes=5)

서버 측의 세션 정보는 사라지지 않기 때문에 이미 사라져버린 세션을 계속 잡고 있게 된다. 플라스크에서도 이런 경우를 대비하여 각 세션의 유효기간이 정해져 있으며 아무 설정도 하지 않을 경우, 31일로 설정되어 있다.

만약 직접 세션의 유효기간을 직접 설정하고 싶다면, 아래와 같은 함수를 추가해주면 된다

hashlib 이해

import hashlib
import os


def check_passwd():
    if os.path.exists('passwd.txt'):
        before_passwd = input('기존 비밀번호를 입력하세요:')
        m = hashlib.sha256()
        m.update(before_passwd.encode('utf-8'))
        with open('passwd.txt', 'r') as f:
            return m.hexdigest() == f.read()
    else:
        return True


if check_passwd():
    passwd = input('새로운 비밀번호를 입력하세요:')
    with open('passwd.txt', 'w') as f:
        m = hashlib.sha256()
        m.update(passwd.encode('utf-8'))
        f.write(m.hexdigest())
else:
    print("비밀번호가 일치하지 않습니다.")

check_passwd 함수는 이미 작성된 비밀번호 파일이 없거나 기존 비밀번호와 일치하는 경우에 True를 리턴한다. check_passwd 함수가 True를 리턴할 경우에만 새로운 비밀번호를 생성하여 파일에 저장한다. 이미 저장된 비밀번호 파일이 있는 경우에는 사용자가 입력한 비밀번호와 기존 비밀번호가 일치하는지 비교하기 위해서 사용자의 입력값을 해싱하여 일치하는지 비교하였다.

여기서 주의깊게 보아야 할 부분은 비밀번호 일치 여부를 검증하기 위해 사용자로부터 입력받은 이전 비밀번호를 동일한 방법으로 해싱하여 파일에 저장된 값과 비교했다는 점이다. 해싱된 문자열은 복구할 수 없기 때문에 항상 이런 방법으로 검증해야 한다는 점을 기억하자.

profile
지나가는사람

0개의 댓글