python Flask部分扩展介绍
一、Flask-Script
安装:pip install flask-script
Flask-Script扩展实现了一个Manager类,可以通过该类为Flask程序添加命令行解释器。比如把命令解析功能加到HelloWorld的例子:
helloword.py:
#coding:utf-8
from flask import Flask
from flask_script import Manager
app=Flask(__name__)
manager=Manager(app)
@app.route("/")
def index():
return "<h1>Hello World!</h1>"
if __name__=="__main__":
manager.run()
Flask的扩展初始化方法打开与上面的Manager例子都类似,即把Flask程序实例传递到构造函数中。另一种方法:
manager=Manager()
manager.init_app(app)
现在Flask程序可以解析命令行了,可以在运行脚本命令后面加上命令,例如启动服务器需要加上一个runserver的命令:
runserver是默认的一个命令,命令后面还可以加一些选项作为参数,比如想把指定host为"0.0.0.0"便于网络中其他设备访问服务:
在命令后使用--help可以查看帮助信息。
另一个默认的命令是shell,用于在程序上下文中启动Python shell命令。除了这两个默认的命令,我们也可以自己增加命令。
增加命令的方法:
①调用manager的add_command方法:
manager.add_command("runserver",Server("0.0.0.0",5000))
可以把默认的runserver命令顶掉,新的命令指定了host和port。
②@manager.command修饰器:
@manager.command
def hello():
print "Hello World!"
③@manager.option修饰器增加带选项的命令:
@manager.option('-n', '--name', dest='name',default="muma")
@manager.option('-u', '--url', dest='url')
def hello(name, url):
print "hello", name, url
可支持选项简写,省略选项可以设置默认值,如果没设置,则默认为None。
二、Flask-Bootstrap
Bootstrap是一个前端框架,有一些已经实现好的CSS和JS脚本,能够方便的控制页面显示和效果。Flask-Bootstrap是包含了Bootstrap的扩展,安装Flask-Bootstrap之后,就可以在程序中集成Bootstrap。
安装 :
安装完成后,可以在程序中进行初始化:
bootstrap=Bootstrap(app)
然后就可以在html文件中通过继承bootstrap/base.html,让页面具有基本结构,并且可以通过Bootstrap提供的CSS和JS来调整页面效果。可以在Flask扩展包里查看bootstrap/base.html。
hello.html:
{% extends "bootstrap/base.html" %}
{% block title %} Flask-Bootstrap {%endblock %}
{% block navbar %}
<div class="navbar-inverse" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
</ul>
</div>
</div>
</div>
{% endblock %}
hello.py:
#coding:utf-8
from flask import Flask,request,render_template
from flask_script import Manager
from flask_bootstrap import Bootstrap
app=Flask(__name__)
manager=Manager(app)
bootstrap=Bootstrap(app)
@app.route("/",methods=["POST","GET"])
def index():
return render_template("hello.html")
if __name__=="__main__":
manager.run()
Bootstrap中定义了可在子模板中重定义的块,可以通过查看bootstrap/base.html查看。
有一些块不能直接重定义,要使用super()函数继承基类模板中的内容。
三、Flask-Moment:本地化时间和日期
安装:
初始化:
from flask_moment import Moment
moment=Moment(app)
在hello.html引入moment.js库:{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{{ moment.lang("zh-cn") }}
{% endblock %}
同时在页面中显示时间:
{% block content %}
<div>
时间:{{ moment(current_time).format("LLL") }},{{ moment(current_time).fromNow(refresh=True) }}
</div>
{% endblock %}
如果没有引入了moment.js但是没有显示时间,注意查看标签的display属性是不是被设置为了none。
四、Flask-WTF-简化表单处理、防跨站请求伪造(CSRF)攻击
安装:pip install flask-wtf
使用:
1.设置秘钥
为了实现CSRF防护,需要为程序设置一个**,该**可以在Flask和多个扩展中使用。
import os
app=Flask(__name__)
app.config["SECRET_KEY"]=os.environ.get("SECRET_KEY") or "secret string"
为了增强安全性,上述代码从环境变量中获取**,只有获取不到才采用一个默认的**串。设置环境变量的方法是使用指令:
如果没有变量值空格,可以省略掉双引号。
2.表单类
Flask-WTF的每个web表单都是一个Form类,把Form类的对象作为参数渲染模板,然后在模板中调用表单渲染函数把form对象处理为前端显示的表单即可。
from flask_ext import Form
from wtforms import StringField,SubmitField
from wtforms.validators import DataRequired
class NameForm(Form):
name=StringField("你是?",validators=[DataRequired])
submit=SubmitField("提交")
@app.route("/",methods=["POST","GET"])
def index():
name=None
form=NameForm()
if form.validate_on_submit():
name=form.name.data
form.name.data=""
return render_template("hello.html",form=form,name=name)
上面的例子中,StringField字段表示单行输入框控件,DataRequired()是表单提交验证函数,要求该字段不能为空,后面有队WTForms支持的HTML标准字段以及WTForms验证函数的列表。
在hello.html中渲染表单:
<form method="POST">
{{ form .hidden_tag() }}
{{ form.name.label }} {{ form.name(id="form_name") }}
{{ form.submit() }}
</form>
但是这样的渲染方式工作量还是很大,并且表单很丑陋(虽然可以通过标签的id、class等熟悉修改表单表现),更快捷的方法是使用Flask-Bootstrap提供的辅助函数:
{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form)}}
字段 | 说明 |
StringField | 文本字段 |
TextAreaField | 多行文本 |
PasswordField | 密码文本 |
HiddenField | 隐藏文本字段 |
DateField | 文本字段,值为datetime.date格式 |
DateTimeField | 文本字段,值为datetime.datetime格式 |
IntegerField | 文本字段,值为整数 |
DecimalField | 文本字段,值为decimal.Decimal |
FloatField | 文本字段,浮点数 |
BooleanField | bool值复选框 |
RadioField | 单选框 |
SelectField | 下拉列表 |
SelectMultipleField | 下拉多选框 |
FileField | 文件上传字段 |
SubmitField | 表单提交按钮 |
FormField | 嵌套表单 |
FieldList | 一组指定类型的字段 |
函数 | 功能 |
验证电子邮件 | |
EqualTo | 验证两个字段,比如确认密码 |
IPAddress | 验证IPV4地址 |
Length | 验证输入串长度,如Length(0,14) |
NumberRange | 验证输入值的数字范围 |
Optional | 无输入时跳过其他验证函数 |
Required | 新版本为DataRequired |
Regexp | 验证是否符合正则 |
URL | 验证是否符合URL |
AnyOf | 指定输入值列表 |
NoneOf | 指定非输入值列表 |
上一篇: Python——异常处理
下一篇: 二十:数字重复长度计算