一、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 数据库迁移