• 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

  • 相关阅读:
    MySQL运维案例分析:Binlog中的时间戳
    身边有位“别人家的程序员”是什么样的体验?
    苹果收取30%过路费_你是顶是踩?
    1019 数字黑洞 (20 分)C语言
    1015 德才论 (25 分)C语言
    1017 A除以B (20 分)C语言
    1014 福尔摩斯的约会 (20 分)
    求n以内最大的k个素数以及它们的和、数组元素循环右移问题、求最大值及其下标、将数组中的数逆序存放、矩阵运算
    1005 继续(3n+1)猜想 (25 分)
    爬动的蠕虫、二进制的前导的零、求组合数、Have Fun with Numbers、近似求PI
  • 原文地址:https://www.cnblogs.com/mihon/p/8981018.html
Copyright © 2020-2023  润新知