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