쿠키와 세션 다루기
쿠키: 클라이언트의 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)
# 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)
':: IT > python' 카테고리의 다른 글
[파이썬]class 정리 - 정적메소드 @classmethod/@staticmethod /@property 사용하기 (0) | 2020.07.23 |
---|---|
Flask 입문, 파이썬과 HTML, 폼으로 데이터 전송받기 (0) | 2020.05.06 |
[파이썬] 데이터 전처리 20200424 (0) | 2020.04.27 |
[파이썬] 전처리 20200423 (0) | 2020.04.27 |
[파이썬]수집된 데이터 형식 확인 및 로컬 전처리 (0) | 2020.04.23 |