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 action = "/" method = "post">
{{form.hidden_tag() }}
<!-- CSRF로부터 보호하는 데 필요한 작업 -->
{{form.username.label }}
{{form.username()}}
{{form.email.label}}
{{form.email()}}
{{form.password.label}}
{{form.password()}}
{{form.confirm_password.label}}
{{form.confirm_password()}}
{{form.submit()}}
</form>
register.html을 이렇게 입력하면 자동으로 HTML 렌더링이 된다.
아니 왜 포트 안열림? ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ - 추후 해결하기
'Framework > Flask' 카테고리의 다른 글
Jinja2 템플릿, 변수, 조건문 및 반복문 (0) | 2021.01.29 |
---|---|
가상 환경 설정, 그리고 Hello World! (0) | 2021.01.28 |