zoukankan      html  css  js  c++  java
  • flask第三方扩展使用

    一、flask-session

    1、简介

    flask-session是重写flask框架的session组件,支持redis,mongodb,sqlalchmey,filesystem,memcached多种存储方式。需要安装(pip install flask-session)

    2、flask-session的使用

    2.1、存储在redis

    # -*-coding:utf-8 -*-
    from flask import Flask,session
    
    from flask_session import Session,RedisSessionInterface,MongoDBSessionInterface
    import redis
    
    app=Flask(__name__)
    app.debug=True
    app.secret_key='sljglsaagdsj'
    
    # 方式 1
    app.config['SESSION_TYPE']='redis'  #session保存类型
    app.config['SESSION_PERMANENT'] = False  # 如果设置为False,则关闭浏览器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='12345')  # 用于连接redis的配置
    Session(app)
    
    ''' 方式 2
    # 创建一个redis连接对象
    # conn=redis.Redis(host='127.0.0.1',port=6379,password=12345)
    # redis对象传给RedisSessionInterface
    # app.session_interface=RedisSessionInterface(conn,key_prefix='flask-session')
    '''
    @app.route('/')
    def home():
        session['k']='value'
        return 'hello world'
    
    
    if __name__=='__main__':
        app.run()

    2.2、存储在mongodb

    # 只需改变这几个参数,其他参数跟redis配置一样
    app.config['SESSION_TYPE'] = 'mongodb'  # session类型为redis
    
    app.config['SESSION_MONGODB'] = pymongo.MongoClient()
    app.config['SESSION_MONGODB_DB'] = 'mongo的db名称(数据库名称)'
    app.config['SESSION_MONGODB_COLLECT'] = 'mongo的collect名称(表名称)'

    2.3、存储在sqlalchmey

    from flask_session import Session as FSession
    from flask_sqlalchemy import SQLAlchemy
    # 设置数据库链接
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:密码@127.0.0.1:3306/fssa?charset=utf8'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    
    # 实例化SQLAlchemy
    db = SQLAlchemy(app)
    
    
    app.config['SESSION_TYPE'] = 'sqlalchemy'  # session类型为sqlalchemy
    app.config['SESSION_SQLALCHEMY'] = db # SQLAlchemy对象
    '''
    其他参数配置跟redis一样
    '''
    FSession(app)

    2.4、存储到filesystem

    其他参数跟redis配置一样

    app.config['SESSION_TYPE'] = 'filesystem'  # session类型为filesystem
    app.config[
        'SESSION_FILE_DIR'] = 存储文件路径  # 文件保存路径
    app.config['SESSION_FILE_THRESHOLD'] = 500  # 存储session的个数如果大于这个值时,就要开始进行删除了
    app.config['SESSION_FILE_MODE'] = 384  # 文件权限类型

    2.5、存储到memcached

    app.config['SESSION_TYPE'] = 'memcached' # session存储类型
    
    app.config['SESSION_MEMCACHED'] = memcache.Client(['ip:port'])

    总结:每种存储方式都有两种方法,一种是直接配置app.config中的参数,然后将app传给flask_session中的Session,一种是给重写的SessionInterface类传入必要的参数,然后传给app.session_interface,例如:app.session_interface=xxxSessionInterface(参数,参数...)

    二、wtforms

    1、简介

    WTForms是用于Python Web开发的灵活的表单验证和呈现库。它可以与您选择的任何Web框架和模板引擎一起使用。它支持数据验证。跟Django的forms组件类似

    2、使用

    具体使用参考wtforms官方文档

    常见的字段:

    StringField           #文本字段
    TextAreaField         #多行文本字段
    PasswordField         #密码文本字段
    HiddenField           # 隐藏文件字段
    DateField             # 文本字段,值为 datetime.date 文本格式
    DateTimeField         # 文本字段,值为 datetime.datetime 文本格式
    IntegerField          #文本字段,值为整数
    DecimalField          #文本字段,值为decimal.Decimal
    FloatField            # 文本字段,值为浮点数
    BooleanField          #复选框,值为True 和 False
    RadioField            #一组单选框
    SelectField           #下拉列表
    SelectMutipleField    # 下拉列表,可选择多个值
    FileField             # 文件上传字段
    SubmitField           #表单提交按钮
    FormField             #把表单作为字段嵌入另一个表单
    FieldList             #一组指定类型的字段

    validators常用验证函数

    Email        #验证电子邮件地址
    EqualTo        #比较两个字段的值,常用于要求输入两次密码进行确认的情况
    IPAddress    #验证IPv4网络地址
    Length        #验证输入字符串的长度
    NumberRange    #验证输入的值在数字范围内
    Optional    #无输入值时跳过其他验证函数
    Required    #确保字段中有数据
    Regexp        #使用正则表达式验证输入值
    URL            #验证URL
    AnyOf        #确保输入值在可选值列表中
    NoneOf        #确保输入值不在可选列表中

    案例:

    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
    # 继承from类
    class RegisterForm(Form):
        name = simple.StringField(
            label='用户名',
            validators=[  #验证器
                validators.DataRequired()
            ],
            widget=widgets.TextInput(), #html小部件,也就是类似输入框的东西
            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 # choices中(1,'男')1的类型
         )
        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': 2,'hobby':[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()
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>用户注册</h1>
    <form method="post" novalidate style="padding:0  50px">
        {% for field in form %}
        <p>{{field.label}}: {{field}} {{field.errors[0] }}</p>
        {% endfor %}
        <input type="submit" value="提交">
    </form>
    </body>
    </html>

     三、flask-script

    1、简介

    flask-script是Flask提供的一个扩展组件,可以让我们用脚本的形式(命令行)来操作flask

    2、用法

    注意:必须在脚本文件所在目录下执行命令,还需要执行一下脚本文件

    (1)基本使用方法和命令添加方式

    # 导入Manager模块
    from flask_script import Manager
    # 从app.py文件中导入flask实例app
    from app import app
    # 实例一个Manager对象,必须传入flask实例
    manage=Manager(app)
    # 命令添加方式 ---- 无参数命令
    
    @manage.command
    def test():
        print('命令')
    
    # 命令添加方式 ---有参数添加方式 
    # option('-简写命令','--全写命令',dest='传给函数的形参')
    @manage.option('-u','--username',dest='username') @manage.option('-p','--password',dest='password') def super(username,password): print('用户名:',username) print('密码:',password) if __name__=='__main__': manage.run()

    执行命令效果

    #D:Project DataPycharmProjectFlaskflask插件>python manage.py test
    >>命令
    
    #D:Project DataPycharmProjectFlaskflask插件>python manage.py super -u nq31 -p 123
    >>用户名: nq31
    >>密码: 123

    (2)添加子命令

    manager.add_command("子命令",Manager对象)

    子命令文件dbs.py代码如下

    from flask_script import Manager
    db_manager=Manager()
    
    @db_manager.command
    def init():
        print('初始化数据库')
    @db_manager.command
    def migrate():
        print('数据库迁移')
    @db_manager.command
    def upgrade():
        print('数据库更新')

    主命令文件manager.py代码如下

    # -*-coding:utf-8 -*-
    from flask_script import Manager
    from app import app
    from dbs import db_manager
    manage=Manager(app)
    manage.add_command('db',db_manager)
    
    if __name__=='__main__':
        manage.run()

    执行manager.py文件后,命令使用:

    #D:Project DataPycharmProjectFlaskflask插件>python manager.py db migrate
    数据库迁移
    不将就
  • 相关阅读:
    计算机视觉之图像特效(实现图像边缘检测、浮雕效果、颜色映射、油画特效等功能)
    计算机视觉之图像特效(实现图像灰度处理、颜色反转、马赛克、毛玻璃、图片融合等功能)
    计算机视觉之几何变换(实现图片缩放、剪切、移位、镜像、仿射变换、旋转等功能)
    Python实现人工神经网络逼近股票价格
    Python中matplotlib模块的简单使用
    Python中numpy模块的简单使用
    TensorFlow入门(矩阵基础)
    TensorFlow入门(常量变量及其基本运算)
    计算机视觉入门
    菜得一P!
  • 原文地址:https://www.cnblogs.com/nq31/p/14351004.html
Copyright © 2011-2022 走看看