쿠키와 세션 다루기

쿠키: 클라이언트의 PC에 텍스트 파일 형태로 저장되는 것으로 일반적으로는 시간이 지나면 소멸

자동 로그인, 팝업 창에서 "오늘은 이 창을 더 이상 보지 않기" 등의 기능을 클라이언트에 저장해놓기 위해 사용

 

쿠키

웹 페이지에서 폼을 전송받으며, 클라이언트에 쿠키를 넘겨주는 코드

#routes.py

from flask import Flask, render_template, request
app = Flask(__name__)

@app.route('/')
def index():
   return render_template('index.html')

if __name__ == '__main__':
   app.run(debug = True)

 

#index.html
 <form action = "/setcookie" method = "POST">
         <p><h3>Enter userID</h3></p>
         <p><input type = 'text' name = 'nm'/></p>
         <p><input type = 'submit' value = 'Login'/></p>
 </form>

 

# routes.py

from flask import Flask, render_template, request, make_response

app = Flask(__name__)


# 가장 먼저 플라스크 객체를 만들어놓아야 한다.

@app.route('/')
def index():
    return render_template('index.html')  # 자바의 welcomlist와 같이 만들어지는 부분

#해당 폼은 /setcookie URL로 전송되는데, 이제 그 쪽을 짜보자.
# 폼으로 데이터를 입력받을 경우, POST 메소드로 /setcookie에 오게 된다.
@app.route('/setcookie', methods=['POST', 'GET'])
def setcookie():
    if request.method == 'POST':
        user = request.form['nm']

   #make_response() 함수는 사용자에게 반환할 뷰 함수를 생성한 후, 그대로 묶어두는 역할
   #뷰를 보여주기 전에 쿠키를 생성해야 하므로
    resp = make_response("Cookie Setting Complete")
    #set_cookie() 함수를 사용해 쿠키를 생성하였다.
    # 쿠키의 이름은 'userID'이며, 내용에는 아까 폼으로 입력된 문자열이 들어간다.
    # 그 후 해당 뷰 객체를 반환하여 보여주게 하였다.
    resp.set_cookie('userID', user)

    return resp

# 등록된 쿠키를 확인(http://127.0.0.1:5000/getcookie)
@app.route('/getcookie')
def getcookie():
   name = request.cookies.get('userID')
   return '<h1>welcome '+name+'</h1>'


if __name__ == '__main__':
    app.run(debug=True)

 

세션

세션과 관련된 데이터는 서버에 저장된다. 서버에서 관리할 수 있다는 점에서 안전성이 좋아서 보통 로그인 관련으로 사용되고 있다. 플라스크에서 세션은 딕셔너리의 형태로 저장되며 키를 통해 해당 값을 불러올 수 있다

# routes.py

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

# 가장 먼저 플라스크 객체를 만들어놓아야 한다.
@app.route('/')
def index():
   if 'username' in session:
    	username = session['username']
    	return 'Logged in as ' + username + '<br>' + \
    	"<b><a href = '/logout'>click here to log out</a></b>"

   return "You are not logged in <br><a href = '/login'></b>" + \
      "click here to log in</b></a>"


if __name__ == '__main__':
    app.run(debug=True)

조건문으로 Flask 세션 정보 안에 'username' 이라는 세션 정보가 있냐 없냐에 따라서 로그인을 했는지 안했는지를 판단

# routes.py

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

# 가장 먼저 플라스크 객체를 만들어놓아야 한다.
@app.route('/')
def index():
   if 'username' in session:
    	username = session['username']
    	return 'Logged in as ' + username + '<br>' + \
    	"<b><a href = '/logout'>click here to log out</a></b>"

   return "You are not logged in <br><a href = '/login'></b>" + \
      "click here to log in</b></a>"

#로그인으로 처음엔 get 메소드로 요청 되므로 로그인을 하기 위한 폼을 전송(폼을 통한 전송으로 post)
@app.route('/login', methods=['GET', 'POST'])
def login():
   if request.method == 'POST':
      #username이라는 세션을 생성하여 입력받은 폼의 데이터를 세션에 저장
      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>

   '''

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

'''
#세션의 유효기간을 직접 설정
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)
'''
if __name__ == '__main__':
    app.run(debug=True)

 

 

리다이렉션과 에러처리

 

리다이렉션

특정 URL로 강제로 이동시키고 싶을 때

# routes.py

from flask import Flask, render_template, request, make_response
from flask import session, redirect, url_for
from flask import app
from datetime import timedelta

app = Flask(__name__)
# 가장 먼저 플라스크 객체를 만들어놓아야 한다.
app.secret_key = 'any random string'


@app.route('/')
def index():
    if 'username' in session:
        username = session['username']
        return 'logged in as' + username + "<b><a href='/logout'>click here to log out</a></b>"
    return "you are not logged in <br><a href='/loginForm'></b>" + "click here to log in</b></a>"


@app.route('/setcookie', methods=['POST', 'GET'])  # 쿠키저장
def setcookie():
    if request.method == 'POST':
        user = request.form['nm']

    resp = make_response("Cookie Setting Complete")
    resp.set_cookie('userID', user)  # 쿠키저장

    return resp


@app.route('/getcookie')
def getcookie():
    name = request.cookies.get('userID')  # 쿠키가져오기
    return '<h1>welcome' + name + '</h1>'


@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST' and request.form['username'] == 'admin':  # post이고 admin이면 adminname이란변수에 대입
        adminname = request.form['username']
        return redirect(url_for('success'))  # redirect() 페이지 이동함수
    return redirect(url_for('index'))


@app.route('/success')
def success():
    return '관리자 로그인 성공'


@app.route('/loginForm', methods=['GET', 'POST'])
def loginForm():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return '''

   <form action = "/login" method = "post">
      <p><input type = text name = username /></p>
      <p><input type = submit value = Login /></p>
   </form>

   '''


@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect(url_for('index'))


# 요청이 들어오기 전에 세션수명만들어야함
@app.before_request
def make_session_permanent():
    session.permanent = True  # False면 31동안 보관
    app.permanent_session_lifetime = timedelta(minutes=1)  # 수명을 1분유지


if __name__ == '__main__':
    app.run(debug=True)

 

 

에러

# routes.py

from flask import Flask, render_template, request, make_response
from flask import session, redirect, url_for, abort
from flask import app
from datetime import timedelta

app = Flask(__name__)
# 가장 먼저 플라스크 객체를 만들어놓아야 한다.
app.secret_key = 'any random string'


@app.route('/')
def index():
    if 'username' in session:
        username = session['username']
        return 'logged in as' + username + "<b><a href='/logout'>click here to log out</a></b>"
    return "you are not logged in <br><a href='/loginForm'></b>" + "click here to log in</b></a>"


@app.route('/setcookie', methods=['POST', 'GET'])  # 쿠키저장
def setcookie():
    if request.method == 'POST':
        user = request.form['nm']

    resp = make_response("Cookie Setting Complete")
    resp.set_cookie('userID', user)  # 쿠키저장

    return resp


@app.route('/getcookie')
def getcookie():
    name = request.cookies.get('userID')  # 쿠키가져오기
    return '<h1>welcome' + name + '</h1>'

# abort(): 오류 코드와 함께 강제로 페이지를 중지시킬 수 있는 함

@app.route('/login',methods = ['POST', 'GET'])
def login():
   if request.method == 'POST':
      if request.form['username'] == 'admin' :
         return redirect(url_for('success'))
      else:
         abort(401)
   else:
      return redirect(url_for('index'))

@app.route('/success')
def success():
    return '관리자 로그인 성공'


@app.route('/loginForm', methods=['GET', 'POST'])
def loginForm():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return '''

   <form action = "/login" method = "post">
      <p><input type = text name = username /></p>
      <p><input type = submit value = Login /></p>
   </form>

   '''


@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect(url_for('index'))


# 요청이 들어오기 전에 세션수명만들어야함
@app.before_request
def make_session_permanent():
    session.permanent = True  # False면 31동안 보관
    app.permanent_session_lifetime = timedelta(minutes=1)  # 수명을 1분유지


if __name__ == '__main__':
    app.run(debug=True)

 

 

# routes.py

from flask import Flask, render_template, request, make_response
from flask import session, redirect, url_for, abort
from flask import app
from datetime import timedelta

app = Flask(__name__)
# 가장 먼저 플라스크 객체를 만들어놓아야 한다.
app.secret_key = 'any random string'


@app.route('/')
def index():
    if 'username' in session:
        username = session['username']
        return 'logged in as' + username + "<b><a href='/logout'>click here to log out</a></b>"
    return "you are not logged in <br><a href='/loginForm'></b>" + "click here to log in</b></a>"


@app.route('/setcookie', methods=['POST', 'GET'])  # 쿠키저장
def setcookie():
    if request.method == 'POST':
        user = request.form['nm']

    resp = make_response("Cookie Setting Complete")
    resp.set_cookie('userID', user)  # 쿠키저장

    return resp


@app.route('/getcookie')
def getcookie():
    name = request.cookies.get('userID')  # 쿠키가져오기
    return '<h1>welcome' + name + '</h1>'

# abort(): 오류 코드와 함께 강제로 페이지를 중지시킬 수 있는 함
@app.route('/login',methods = ['POST', 'GET'])
def login():
   if request.method == 'POST':
      if request.form['username'] == 'admin' :
         return redirect(url_for('success'))
      else:
         abort(401)
   else:
      return redirect(url_for('index'))

#각 에러에 한해서 자신이 만든 페이지를 뜨게 하고 싶다면
@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404


@app.route('/success')
def success():
    return '관리자 로그인 성공'


@app.route('/loginForm', methods=['GET', 'POST'])
def loginForm():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return '''

   <form action = "/login" method = "post">
      <p><input type = text name = username /></p>
      <p><input type = submit value = Login /></p>
   </form>

   '''


@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect(url_for('index'))


# 요청이 들어오기 전에 세션수명만들어야함
@app.before_request
def make_session_permanent():
    session.permanent = True  # False면 31동안 보관
    app.permanent_session_lifetime = timedelta(minutes=1)  # 수명을 1분유지


if __name__ == '__main__':
    app.run(debug=True)

 

파일 업로드하기

 

from flask import Flask, render_template, request
from werkzeug.utils import secure_filename

app = Flask(__name__)


@app.route('/upload')
def load_file():
    return render_template('upload.html')

@app.route('/uploader', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
       #f = request.files['file'] :  request 객체의 'file'이라는 이름의 폼으로 전송된 파일에 해당
        f = request.files['file']
        # f.save() : 말 그대로 해당 파일 객체를 저장하는 메소드
        #secure_filename(f.filename): 해당 파일명을 보호하기 위한 메소드이다.
        # 해당 파일이 실제 시스템에 저장되기 전에 파일명을 보호하기 위한 함수
        f.save(secure_filename(f.filename))
        return 'file uploaded successfully'

if __name__ == '__main__':
    app.run(debug=True)

 

+ Recent posts