파이썬 플라스크 form 활용법

파이썬 플라스크 form 활용법

form이란, 구글폼처럼 입력을 받아 정보를 수집하는 방식을 말한다.

http://hleecaster.com/flask-form/

form을 활용하기 위해서는 프로젝트 파일을 관리해야하는데, 구성은 다음과 같다.

forms.py : form을 활용하기 위한 클래스를 담아놓는 파일. 유효성 검사와 같은 기능을 포함해놓을 수 있고, 이후에 flask 앱에서는 여기서 미리 생성해놓은 form 클래스를 가져다 쓰기만 하면 된다.

app.py : Flask 앱을 구동시킬 실행시킬 파일. URL와 템플릿을 연결하는 route 데코레이터와 그에 해당하는 뷰 함수가 담겨 있다.

*.html : 모든 HTML 문서, 즉 템플릿 파일은 templates라는 폴더 안에 담아놓아야 한다. 이 템플릿 내에서 내가 쓸 폼을 플라스크 변수 형태로 담아 사용할 수 있다.

from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Length, Email, EqualTo class RegisterationFrom(FlaskForm): username = StringField("아이디",validators = [DataRequired(), Length(min=4,max=20)]) email = StringField("이메일", validators = [DataRequired(), Email()]) password = PasswordField("비밀번호", validators=[DataRequired(), Length(min = 4, max = 20)]) confirm_password = PasswordField("비밀번호 확인", validators=[DataRequired(), EqualTo("password")]) submit = SubmitField("가입")

FlaskWTF에서 FlaskForm을 불러온다.

소괄호로 부모클래스를 포함시키면 자식클래스에서는 부모클래스의 속성과 메소드를 기재하지 않아도 된다.

원하는 폼의 내용들을 위와 같이 변수로 지정해준다.

wtforms.validators에서 이루어지는 검사들

- DataRequired() : 필수 입력값으로 지정

- Length : 길이 지정

- EqualTo : 이미 입력한 값과 같은 값을 입력했는지 검사

Get, Post 요청 보내기

웹 공부는 할 수록 신기한게 어느 언어를 써서 웹 개발을 하든 언어 표현 방식만 다를 뿐이지 형식은 다 비슷하다는 것이다. Flask에서는 웹 페이지를 route하면 기본적으로 GET방식을 지원한다. form으로 양식을 제출하면 POST요청으로 전송된다. 이 경우에는 다음과 같이 요청을 처리할 수 있다.

@app.route("/", method = ["GET", "POST"])

디폴트 값은 GET이다.

app.py와 forms.py를 연결하기 위해서 만들 app.py는 다음과 같다.

from flask import Flask, render_template, url_for, flash, redirect from forms import RegistrationForm app = Flask(__name__) app.config["SECRET_KEY"] = '(복잡한 문자열)' #CSRF를 방지하기 위해 사용 @app.route('/') def home(): return render_template('layout.html') @app.route('/register',methods=["GET","POST"]) #register URL을 회원가입으로 사용할 예정. def register(): form = RegistrationForm() if form.validate_on_submit(): #POST방식으로 요청한 경우 flash(f'{form.username.data}님 회원가입 완료!','success') #부트스트랩으로 알림 메세지를 띄우기 위해 사용. (굳이 필요 x) return redirect(url_for('home')) return render_template('register.html', form=form) #GET방식으로 요청한 경우 if __name__ == '__main__': app.run(debug=True)

url_for([뷰 함수 이름]) : 뷰 함수와 연결된 곳, 즉 루트 URL로 리다이렉트시켜준다.

{{form.hidden_tag() }} {{form.username.label }} {{form.username()}} {{form.email.label}} {{form.email()}} {{form.password.label}} {{form.password()}} {{form.confirm_password.label}} {{form.confirm_password()}} {{form.submit()}}

register.html을 이렇게 입력하면 자동으로 HTML 렌더링이 된다.

아니 왜 포트 안열림? ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ - 추후 해결하기

from http://mingyum119.tistory.com/33 by ccl(A) rewrite - 2021-01-29 00:26:52