Flask 웹 개발 처리 세 션

본 고 는 우리 가 지난 글 에서  POST 요청(로그 인 사례)을 처리 하 는 토대 에서 세 션 에 대한 Flask 의 지원 을 설명 합 니 다.
상기 사례 에서 우 리 는 다음 과 같은 기능 을 수정 하고 추가 해 야 한다.
1、로그 인 성공 후 url 은 더 이상http://192.168.142.138/home?username=admin
...이다http://192.168.142.138/home
페이지 에 표 시 된 username 정 보 는 템 플 릿 코드 에서 session 에서 가 져 옵 니 다.
2,로그 인 하기 전에 브 라 우 저 입력http://192.168.142.138/xxxx 주소http://192.168.142.138/login페이지,
로그 인 성공 후 입장 합 니 다http://192.168.142.138/xxxx페이지그 중 xxx 는 이미 존재 하 는 url 이다.
 
다음은 우리 가 한 걸음 한 걸음 실현 하 겠 습 니 다.
1.run.py 파일 을 수정 합 니 다.수 정 된 파일 의 내용 은 다음 과 같 습 니 다.
from flask import Flask
from flask import render_template, redirect,url_for
from flask import request,session

app = Flask(__name__)

@app.route('/login', methods=['POST','GET'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username']=='admin':
            session['username'] = request.form['username']
            return redirect('/home')
        else:
            error = 'Invalid username/password'
    return render_template('login.html', error=error)

@app.route('/home')
def home():
    return render_template('home.html',username=session['username'])

app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

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

수 정 된 내용 은:1)로그 인 에 성 공 했 습 니 다.session[username]=request.form[username]과 같은 코드 를 session 에 저장 합 니 다.
2)로그 인 에 성 공 했 습 니 다.홈 으로 다시 설정 합 니 다.username 조회 파 라 메 터 를 가 져 올 필요 가 없습니다.
3)홈()방법 으로 템 플 릿 에 들 어 오 는 username 인 자 는 session 에서 직접 사용 합 니 다.
4)세 션 을 효과적으로 하기 위해 서 는 키 를 설정 해 야 한다
메모:위의 코드 에 문제 가 있 습 니 다.로그 인 하기 전에 브 라 우 저 에 홈 을 직접 입력 하면 오류 가 발생 할 수 있 습 니 다.이 때 session 에 username 이 존재 하지 않 기 때 문 입 니 다.이 문 제 는 우리 가 아래 에서 해결 할 것 이다.
 
app.debug=true 설정 을 추 가 했 기 때문에 run.py 가 수정 되면 서비스 가 자동 으로 재 개 됩 니 다.이때 우 리 는 브 라 우 저 에서 다시 방문 하여 발견 하 였 다. 로그 인 성공 후 url 은 더 이상http://192.168.142.138/home?username=admin 보다http://192.168.142.138/home。 이렇게 문장 첫머리 에 말 한 첫 번 째 문 제 는 해결 되 었 다.
다음은 두 번 째 문 제 를 해결 하 겠 습 니 다.
2.templates 디 렉 터 리 에 test.html 파일 을 추가 하면 내용 은 마음대로 문자 일 수 있 습 니 다.
로그 인 하기 전에 브 라 우 저 에 test.html 를 입력 하면 login 페이지 로 이동 하고 로그 인 에 성공 하면 test.html 페이지 로 자동 으로 이동 합 니 다.
3.run.py 에 test.html 경로,코드 를 추가 합 니 다.
@app.route('/test')
def test():
    return render_template('test.html');

4.run.py 파일 을 수정 하고 수정 한 내용 은 다음 과 같 습 니 다.
from flask import Flask
from flask import render_template, redirect,url_for
from flask import request,session

app = Flask(__name__)

@app.route('/login', methods=['POST','GET'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username']=='admin':
            session['username'] = request.form['username']
            if 'newurl' in session:
                newurl = session['newurl']
        session.pop('newurl', None)
                return redirect(newurl)
            else:
                return redirect('/home')
        else:
            error = 'Invalid username/password'
    return render_template('login.html', error=error)

@app.route('/home')
def home():
    return render_template('home.html',username=session['username'])

@app.route('/test')
def test():
    if 'username' in session:
        return render_template('test.html')
    else:
        session['newurl']='test'
        return redirect(url_for('login'))
 
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

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

위의 코드 는 앞 과 비교 합 니 다.test 요청 의 응답 처리 에서 session 에 username 이 존재 하 는 지 판단 하고 존재 하지 않 으 면 login 페이지 로 이동 하여 test 주 소 를 session 에 저장 합 니 다.그리고 login 의 post 요청 에서 newurl 이 존재 하 는 지 확인 합 니 다.존재 하면 다른 페이지 에서 로그 인 페이지 로 이동 한 다 는 뜻 입 니 다.이렇게 로그 인 에 성공 한 후에 해당 페이지 로 이동 합 니 다.부족 한 점 은 홈 페이지 로 이동 합 니 다.
 
이렇게 해서 우리 글 에서 처음에 제기 한 두 번 째 문제 도 해 결 된 것 처럼 보인다.왜 보인다 고 하 죠?실제로 문제 가 있 기 때문이다.테스트 요청 에 대한 특별 처리 입 니 다.우 리 는 모든 요청(문제 가 있 는 홈 요청 포함)을 차단 하여 로그 인 여 부 를 판단 하고 로그 인 하지 않 으 면 로그 인 페이지 로 이동 할 수 있어 야 합 니 다.
이 문 제 는 우리 가 후속 적 인 글 에서 처리 하 는 핵심 적 인 사 고 는 모든 구체 적 인 경로 코드 에 도달 하기 전에 로그 인 여 부 를 차단 하고 판단 하 는 것 이다.

좋은 웹페이지 즐겨찾기