1. 程式人生 > >flask之wtform與flask-session組件

flask之wtform與flask-session組件

必須 cli method ret files cor pro dir users

1.wtform

from flask import Flask, render_template, request, redirect

from wtforms import Form

from wtforms.fields import core
from wtforms.fields import html5
from wtforms.fields import simple

from wtforms import validators
from wtforms import widgets

app = Flask(__name__, template_folder=templates
) app.debug = True class MyValidator(object): def __init__(self,message): self.message = message def __call__(self, form, field): print(field.data) if field.data == 王浩: return None raise validators.StopValidation(self.message) class LoginForm(Form): name
= simple.StringField( label=用戶名, validators=[ # MyValidator(message=‘用戶名必須等於王浩‘) validators.DataRequired(message=用戶名不能為空.), validators.Length(min=6, max=18, message=用戶名長度必須大於%(min)d且小於%(max)d) ], widget=widgets.TextInput(), render_kw
={class: form-control} ) pwd = simple.PasswordField( label=密碼, validators=[ validators.DataRequired(message=密碼不能為空.), validators.Length(min=8, message=用戶名長度必須大於%(min)d), validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}", message=密碼至少8個字符,至少1個大寫字母,1個小寫字母,1個數字和1個特殊字符) ], widget=widgets.PasswordInput(), render_kw={class: form-control} ) @app.route(/login, methods=[GET, POST]) def login(): if request.method == GET: form = LoginForm() return render_template(login.html, form=form) else: form = LoginForm(formdata=request.form) if form.validate(): print(用戶提交數據通過格式驗證,提交的值為:, form.data) else: print(form.errors) return render_template(login.html, form=form) # ########################### 用戶註冊 ########################## class RegisterForm(Form): name = simple.StringField( label=用戶名, validators=[ validators.DataRequired() ], widget=widgets.TextInput(), render_kw={class: form-control}, default=alex ) pwd = simple.PasswordField( label=密碼, validators=[ validators.DataRequired(message=密碼不能為空.) ], widget=widgets.PasswordInput(), render_kw={class: form-control} ) pwd_confirm = simple.PasswordField( label=重復密碼, validators=[ validators.DataRequired(message=重復密碼不能為空.), validators.EqualTo(pwd, message="兩次密碼輸入不一致") ], widget=widgets.PasswordInput(), render_kw={class: form-control} ) email = html5.EmailField( label=郵箱, validators=[ validators.DataRequired(message=郵箱不能為空.), validators.Email(message=郵箱格式錯誤) ], widget=widgets.TextInput(input_type=email), render_kw={class: form-control} ) gender = core.RadioField( label=性別, choices=( (1, ), (2, ), ), coerce=int ) city = core.SelectField( label=城市, choices=( (bj, 北京), (sh, 上海), ) ) hobby = core.SelectMultipleField( label=愛好, choices=( (1, 籃球), (2, 足球), ), coerce=int ) favor = core.SelectMultipleField( label=喜好, choices=( (1, 籃球), (2, 足球), ), widget=widgets.ListWidget(prefix_label=False), option_widget=widgets.CheckboxInput(), coerce=int, default=[1, 2] ) def __init__(self, *args, **kwargs): super(RegisterForm, self).__init__(*args, **kwargs) self.favor.choices = ((1, 籃球), (2, 足球), (3, 羽毛球)) def validate_pwd_confirm(self, field): """ 自定義pwd_confirm字段規則,例:與pwd字段是否一致 :param field: :return: """ # 最開始初始化時,self.data中已經有所有的值 if field.data != self.data[pwd]: # raise validators.ValidationError("密碼不一致") # 繼續後續驗證 raise validators.StopValidation("密碼不一致") # 不再繼續後續驗證 @app.route(/register, methods=[GET, POST]) def register(): if request.method == GET: # 設置默認值 form = RegisterForm(data={gender: 1}) return render_template(register.html, form=form) else: form = RegisterForm(formdata=request.form) if form.validate(): print(用戶提交數據通過格式驗證,提交的值為:, form.data) else: print(form.errors) return render_template(register.html, form=form) if __name__ == __main__: app.run()

2.flask-session

#!/usr/bin/env python
# -*- coding:utf-8 -
import redis
from flask import Flask,current_app,session
from flask_session import Session
app = Flask(__name__)
app.debug = True
app.secret_key = xxxx

# 為Flask-session組件提供的配置
# app.config[‘SESSION_TYPE‘] = ‘redis‘  # session類型為redis
# app.config[‘SESSION_REDIS‘] = redis.Redis(host=‘127.0.0.1‘, port=‘6379‘, password=‘123123‘)  # 用於連接redis的配置
# app.config[‘SESSION_KEY_PREFIX‘] = ‘session:‘  # 保存到session中的值的前綴
# app.config[‘SESSION_PERMANENT‘] = False  # 如果設置為True,則關閉瀏覽器session就失效。
# app.config[‘SESSION_USE_SIGNER‘] = False  # 是否對發送到瀏覽器上 session:cookie值進行加密
# Session(app)
#
# import memcache
# app.config[‘SESSION_TYPE‘] = ‘memcached‘ # session類型為redis
# app.config[‘SESSION_PERMANENT‘] = True # 如果設置為True,則關閉瀏覽器session就失效。
# app.config[‘SESSION_USE_SIGNER‘] = False # 是否對發送到瀏覽器上session的cookie值進行加密
# app.config[‘SESSION_KEY_PREFIX‘] = ‘session:‘ # 保存到session中的值的前綴
# app.config[‘SESSION_MEMCACHED‘] = memcache.Client([‘10.211.55.4:12000‘])
# Session(app)

app.config[SESSION_TYPE] = filesystem  # session類型為redis
app.config[SESSION_FILE_DIR] = rC:\Users\Administrator\PycharmProjects\day121\2.flask-session組件  # session類型為redis
app.config[SESSION_FILE_THRESHOLD] = 500  # 存儲session的個數如果大於這個值時,就要開始進行刪除了
app.config[SESSION_FILE_MODE] = 384  # 文件權限類型

app.config[SESSION_PERMANENT] = True  # 如果設置為True,則關閉瀏覽器session就失效。
app.config[SESSION_USE_SIGNER] = False  # 是否對發送到瀏覽器上session的cookie值進行加密
app.config[SESSION_KEY_PREFIX] = session:  # 保存到session中的值的前綴

Session(app)




@app.route(/index)
def index():
    session[k1] = v1
    return xx


if __name__ == __main__:
    app.run()

flask之wtform與flask-session組件