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使用SMTP模块、email模块发送邮件
    harbor搭建及使用
    ELK搭建-windows
    ELK技术栈之-Logstash详解
    【leetcode】1078. Occurrences After Bigram
    【leetcode】1073. Adding Two Negabinary Numbers
    【leetcode】1071. Greatest Common Divisor of Strings
    【leetcode】449. Serialize and Deserialize BST
    【leetcode】1039. Minimum Score Triangulation of Polygon
    【leetcode】486. Predict the Winner
  • 原文地址:https://www.cnblogs.com/nq31/p/14351004.html
Copyright © 2011-2022 走看看