Flask-WTForm:

from flask import Flask,render_template,request,redirect

from wtforms.fields import core

from wtforms.fields import html5

from wtforms.fields import simple

from wtforms import Form

from wtforms import validators

from wtforms import widgets

app = Flask(__name__,template_folder="templates")

class Myvalidators(object):

'''自定义验证规则'''

def __init__(self,message):

self.message = message

def __call__(self, form, field):

print(field.data,"用户输入的信息")

if field.data == "haiyan":

return None

raise validators.ValidationError(self.message)

class LoginForm(Form):

'''Form'''

name = simple.StringField(

label="用户名",

widget=widgets.TextInput(),

validators=[

Myvalidators(message="用户名必须是haiyan"),#也可以自定义正则

validators.DataRequired(message="用户名不能为空"),

validators.Length(max=8,min=3,message="用户名长度必须大于%(max)d且小于%(min)d")

],

render_kw={"class":"form-control"}  #设置属性

)

pwd = simple.PasswordField(

label="密码",

validators=[

validators.DataRequired(message="密码不能为空"),

validators.Length(max=8,min=3,message="密码长度必须大于%(max)d且小于%(min)d"),

validators.Regexp(regex="\d+",message="密码必须是数字"),

],

widget=widgets.PasswordInput(),

render_kw={"class":"form-control"}

)

def validate_pwd_confim(self,field,): #相当于clean_field 钩子函数

'''

自定义pwd_config字段规则,例:与pwd字段是否一致

:param field:

:return:

'''

# 最开始初始化时,self.data中已经有所有的值

if field.data != self.data['pwd']:

# raise validators.ValidationError("密码不一致") # 继续后续验证

raise validators.StopValidation("密码不一致")  # 不再继续后续验证

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):  #这里的self是一个RegisterForm对象

'''重写__init__方法'''          #从数据库实时更新

super(RegisterForm,self).__init__(*args, **kwargs)  #继承父类的init方法

self.favor.choices =((1, '篮球'), (2, '足球'), (3, '羽毛球'))  #吧RegisterForm这个类里面的favor重新赋值

@app.route('/login',methods=["GET","POST"])

def login():

if request.method =="GET":

form = LoginForm()

return render_template("login.html",form=form)

else:

form = LoginForm(formdata=request.form)

if form.validate():

print("用户提交的数据用过格式验证,值为:%s"%form.data)

return "登录成功"

else:

print(form.errors,"错误信息")

return render_template("login.html",form=form)

if __name__ == '__main__':

# app.__call__()

app.run(debug=True)

class TestForm(Form):

name = html5.EmailField(label='用户名')

pwd = simple.StringField(label='密码')

class Meta:

# -- CSRF

# 是否自动生成CSRF标签

csrf = True

# 生成CSRF标签name

csrf_field_name = 'csrf_token'

# 自动生成标签的值,加密用的csrf_secret

csrf_secret = 'xxxxxx'

# 自动生成标签的值,加密用的csrf_context

csrf_context = lambda x: request.url

# 生成和比较csrf标签

csrf_class = MyCSRF

# -- i18n

# 是否支持本地化

# locales = False

locales = ('zh', 'en')

# 是否对本地化进行缓存

cache_translations = True

# 保存本地化缓存信息的字段

translations_cache = {}

Flask-Session:

#!/usr/bin/env python

# -*- coding:utf-8 -

import redis

from flask import Flask, session

from flask_session import Session

app = Flask(__name__)

app.debug = True

app.secret_key = 'xxxx'

app.config['SESSION_TYPE'] = 'redis'  # session类型为redis

app.config['SESSION_PERMANENT'] = False  # 如果设置为True,则关闭浏览器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='123123')  # 用于连接redis的配置

Session(app)

@app.route('/index')

def index():

session['k1'] = 'v1'

return 'xx'

if __name__ == '__main__':

app.run()

Flask-Script:

首先,创建一个Python模板运行命令脚本,可起名为manager.py;

在该文件中,必须有一个Manager实例,Manager类追踪所有在命令行中调用的命令和处理过程的调用运行情况;

Manager只有一个参数——Flask实例,也可以是一个函数或其他的返回Flask实例;

调用manager.run()启动Manager实例接收命令行中的命令;

from flask_script import Manager

from debug import app

manager = Manager(app)

@manager.command

def hello():

'hello world'

print 'hello world'

if __name__ == '__main__':

manager.run()

python manager.py hello

from flask_script import Manager

from debug import app

manager = Manager(app)

@manager.option('-n', '--name', dest='name', help='Your name', default='world')

#命令既可以用-n,也可以用--name,dest="name"用户输入的命令的名字作为参数传给了函数中的name

@manager.option('-u', '--url', dest='url', default='www.csdn.com')

#命令既可以用-u,也可以用--url,dest="url"用户输入的命令的url作为参数传给了函数中的url

def hello(name, url):

'hello world or hello <setting name>'

print 'hello', name

print url

if __name__ == '__main__':

manager.run()

运行结果:

python manager.py hello

>hello world

>www.csdn.com

python manager.py hello -n sissiy -u www.sissiy.com

> hello sissiy

>www.sissiy.com

WTForm的更多相关文章

  1. flask + wtform + google storage

    项目需要使用 flask 上传.下载文件到 google storage 上, 搜了一圈没有能直接结合 wtform 使用的插件,所以动手造了个轮子. 只实现了基本的上传,下载的功能,后续可能会完善预 ...

  2. 【Flask】 WTForm表单编程

    WTForm表单编程 在网页中,为了和用户进行信息交互总是不得不出现一些表单.flask设计了WTForm表单库来使flask可以更加简便地管理操作表单数据.WTForm中最重要的几个概念如下: Fo ...

  3. flask之wtform与flask-session组件

    1.wtform from flask import Flask, render_template, request, redirect from wtforms import Form from w ...

  4. 仿照wtform自定义Form组件

    仿照wtforms自定义Form组件 1.wtforms 点击查看源码分析及使用方法 2.自定义Form组件 #!usr/bin/env python # -*- coding:utf-8 -*- f ...

  5. Flask wtform组件

    Wtforms简介 WTForms是一个支持多个web框架的form组件 主要能够帮助我们生成html标签 对数据进行验证 安装 pip install wtforms Wtforms的使用 这里借助 ...

  6. wtform 表单示例

    用户注册 from flask import Flask, render_template, request, redirect from wtforms import Form from wtfor ...

  7. Flask WTForm disable choice field

    Flask disable choice field ChoiceField = { render_kw={'disabled':''} } form.my_field.render_kw = {'d ...

  8. global name 'validate_on_submit' is not defined错误

    原因就是validate_on_submit()方法是属于form的方法我使用的时候忘了form. 还有一个比较重要的是validate_on_submit()方法是wtf特有的而wtform是没有这 ...

  9. wtforms 使用

    wtforms是一个表单模板库, 下面以修改密码表单为例简单说明其用法. 我们可以用python代码定义form的基本元素, 比如用户名/邮箱, 并给定各个元素的validation条件. 然后在re ...

随机推荐

  1. Day5 CSS基本样式和C3选择器

    Day5 CSS基本样式和C3选择器 一.背景属性 1.背景颜色            background-color:transparent(默认值,透明); 颜色的取值:            ...

  2. 2833 奇怪的梦境 未AC

    2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold         题目描述 Description Aiden陷入了一个奇怪的梦境:他被困在一个小 ...

  3. MATLAB之折线图、柱状图、饼图以及常用绘图技巧

    MATLAB之折线图.柱状图.饼图以及常用绘图技巧 一.折线图 参考代码: %图1:各模式直接成本预测 %table0-table1为1*9的数组,记录关键数据 table0 = data_modol ...

  4. 构建第一个Spring Boot2.0应用之集成mybatis、Druid(七)

    一.环境: IDE:IntelliJ IDEA 2017.1.1 JDK:1.8.0_161 Maven:3.3.9 springboot:2.0.2.RELEASE 二.说明:      本文综合之 ...

  5. Redis基础对象

    Redis 中每个对象都由一个 redisObject 结构表示 typedef struct redisObject { //类型 unsigned type:; //编码 unsigned enc ...

  6. 配置Maven镜像与本地缓存

    IntelliJ IDEA 安装后自带Maven,也可以使用自己安装的Maven. 配置阿里镜像与本地仓库文件夹 找到Maven的安装目录 打开settings.xml配置文件   修改mirrors ...

  7. Javascript 向量

    向量 既有大小又有方向的量叫做向量(亦称矢量),与标量相对,用JS实现代码如下,直接搬miloyip的了 Vector2 = function(x, y) { this.x = x; this.y = ...

  8. [Rails学习之路]初识Ruby(一)

    Ruby是一门动态的.强类型的.纯面向对象的编程语言.它和Python非常相似,但比Python面向对象更加彻底.使用更加灵活.语法更加复杂.也更为有趣. 抛开做事情到底应该有多少种方法这个问题,我相 ...

  9. 【洛谷2257】YY的GCD(莫比乌斯反演)

    点此看题面 大致题意: 求\(\sum_{x=1}^N\sum_{y=1}^MIsPrime(gcd(x,y))\). 莫比乌斯反演 听说此题是莫比乌斯反演入门题? 一些定义 首先,我们可以定义\(f ...

  10. 索引属性 unique指定

    比较重要的属性有: 名字 db.collection.ensureIndex({},{name:''}) 在创建索引时,mongodb会自己给索引创建默认的名字,这种名字并不好记,我们看一下mongo ...