WTForm

Flask-WTForm:

from flask import Flask,render_template,request,redirect

from wtforms.fields import core

from wtforms.fields import html5

from wtforms.fields import simple

from wtforms import Form

from wtforms import validators

from wtforms import widgets

app = Flask(__name__,template_folder="templates")

class Myvalidators(object):

    '''自定义验证规则'''

    def __init__(self,message):

        self.message = message

    def __call__(self, form, field):

        print(field.data,"用户输入的信息")

        if field.data == "haiyan":

            return None

        raise validators.ValidationError(self.message)

class LoginForm(Form):

    '''Form'''

    name = simple.StringField(

        label="用户名",

        widget=widgets.TextInput(),

        validators=[

            Myvalidators(message="用户名必须是haiyan"),#也可以自定义正则

            validators.DataRequired(message="用户名不能为空"),

            validators.Length(max=8,min=3,message="用户名长度必须大于%(max)d且小于%(min)d")

        ],

        render_kw={"class":"form-control"}  #设置属性

    )

    pwd = simple.PasswordField(

        label="密码",

        validators=[

            validators.DataRequired(message="密码不能为空"),

            validators.Length(max=8,min=3,message="密码长度必须大于%(max)d且小于%(min)d"),

            validators.Regexp(regex="d+",message="密码必须是数字"),

        ],

        widget=widgets.PasswordInput(),

        render_kw={"class":"form-control"}

    )

   

    def validate_pwd_confim(self,field,): #相当于clean_field 钩子函数

        '''

        自定义pwd_config字段规则,例:与pwd字段是否一致

        :param field:

        :return:

        '''

        # 最开始初始化时,self.data中已经有所有的值

        if field.data != self.data['pwd']:

            # raise validators.ValidationError("密码不一致") # 继续后续验证

            raise validators.StopValidation("密码不一致")  # 不再继续后续验证

           

    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):  #这里的self是一个RegisterForm对象

        '''重写__init__方法'''          #从数据库实时更新

        super(RegisterForm,self).__init__(*args, **kwargs)  #继承父类的init方法

        self.favor.choices =((1, '篮球'), (2, '足球'), (3, '羽毛球'))  #吧RegisterForm这个类里面的favor重新赋值

            

@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("用户提交的数据用过格式验证,值为:%s"%form.data)

            return "登录成功"

        else:

            print(form.errors,"错误信息")

        return render_template("login.html",form=form)

if __name__ == '__main__':

    # app.__call__()

    app.run(debug=True)

   

   

class TestForm(Form):

    name = html5.EmailField(label='用户名')

    pwd = simple.StringField(label='密码')

    class Meta:

        # -- CSRF

        # 是否自动生成CSRF标签

        csrf = True

        # 生成CSRF标签name

        csrf_field_name = 'csrf_token'

        # 自动生成标签的值,加密用的csrf_secret

        csrf_secret = 'xxxxxx'

        # 自动生成标签的值,加密用的csrf_context

        csrf_context = lambda x: request.url

        # 生成和比较csrf标签

        csrf_class = MyCSRF

        # -- i18n

        # 是否支持本地化

        # locales = False

        locales = ('zh', 'en')

        # 是否对本地化进行缓存

        cache_translations = True

        # 保存本地化缓存信息的字段

        translations_cache = {}

       

Flask-Session:

    #!/usr/bin/env python

    # -*- coding:utf-8 -

    import redis

    from flask import Flask, session

    from flask_session import Session

    app = Flask(__name__)

    app.debug = True

    app.secret_key = 'xxxx'

    app.config['SESSION_TYPE'] = 'redis'  # session类型为redis

    app.config['SESSION_PERMANENT'] = False  # 如果设置为True,则关闭浏览器session就失效。

    app.config['SESSION_USE_SIGNER'] = False  # 是否对发送到浏览器上session的cookie值进行加密

    app.config['SESSION_KEY_PREFIX'] = 'session:'  # 保存到session中的值的前缀

    app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port='6379', password='123123')  # 用于连接redis的配置

    Session(app)

    @app.route('/index')

    def index():

        session['k1'] = 'v1'

        return 'xx'

    if __name__ == '__main__':

        app.run()

   

   

Flask-Script:

    首先,创建一个Python模板运行命令脚本,可起名为manager.py;

    在该文件中,必须有一个Manager实例,Manager类追踪所有在命令行中调用的命令和处理过程的调用运行情况;

    Manager只有一个参数——Flask实例,也可以是一个函数或其他的返回Flask实例;

    调用manager.run()启动Manager实例接收命令行中的命令;

    from flask_script import Manager 

    from debug import app 

     

    manager = Manager(app) 

    

    @manager.command 

    def hello(): 

        'hello world' 

        print 'hello world' 

     

    if __name__ == '__main__': 

        manager.run() 

    

    python manager.py hello

   

   

    from flask_script import Manager 

    from debug import app 

     

    manager = Manager(app) 

    

    @manager.option('-n', '--name', dest='name', help='Your name', default='world')  

    #命令既可以用-n,也可以用--name,dest="name"用户输入的命令的名字作为参数传给了函数中的name

    @manager.option('-u', '--url', dest='url', default='www.csdn.com') 

    #命令既可以用-u,也可以用--url,dest="url"用户输入的命令的url作为参数传给了函数中的url

    def hello(name, url): 

    'hello world or hello <setting name>' 

        print 'hello', name 

        print url  

     

    if __name__ == '__main__': 

    manager.run() 

    运行结果:

        python manager.py hello

        >hello world

        >www.csdn.com

        python manager.py hello -n sissiy -u www.sissiy.com

        > hello sissiy

        >www.sissiy.com

原文地址:https://www.cnblogs.com/mihon/p/8981018.html