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 Data\PycharmProject\Flask\flask插件>python manage.py test
>>命令

#D:\Project Data\PycharmProject\Flask\flask插件>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 Data\PycharmProject\Flask\flask插件>python manager.py db migrate
数据库迁移

 

posted @ 2021-02-04 22:33  NQ31  阅读(135)  评论(0编辑  收藏  举报