Flask—03-bootstrap与表单
bootstrap与表单
Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML、CSS、JavaScript 开发的简洁、直观、强悍的前端开发框架,使得 Web 开发更加快捷. Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源项目,包括NASA的MSNBC(微软全国广播公司)的BreakingNews都使用了该项目。国内一些移动开发者较为熟悉的框架,如WeX5前端开源框架等,也是基于Bootstrap源码进行性能优化而来。
flask-boostrap
说明:在flask中使用bootstrap,可以通过该扩展库完成。
安装:
pip install flask-bootstrap
使用:
from flask_bootstrap import Bootstrap bootstrap = Bootstrap(app)
模板
{# 继承自bootstrap基础模板 #}
{% extends 'bootstrap/base.html' %} {% block title %}标题{% endblock %} {% block content %}
<div class="container">默认内容</div>
{% endblock %}
bootstrap基础模板中的block
block 说明 doc 整个HTML文档 html 整个html标签 head 整个head标签 metas 一组meta标签 styles 一组link标签 body 整个body标签 navbar 导航条 content 页面内容 scripts 一组scripts标签 提示:当重写一个block后,原来的显示效果全没了,很可能是因为没有写
{{ super() }}
加载静态资源
flask中静态资源默认存放在static目录下,因此目录结构如下:
project/ # 项目目录
manage.py # 启动控制文件
templates/ # 模板文件目录
static/ # 静态资源目录
img/ # 图片
css/ # css文件
js/ # js文件
favicon.ico # 收藏夹图标
加载静态资源文件
{# 继承自自定义的基础模板 #}
{% extends 'base.html' %} {% block title %}用户登录{% endblock %} {% block page_content %}
<h1>欢迎登录...</h1>
<div class="test"></div>
{# 加载图片资源 #}
{# 静态资源加载的目录static,提前在img文件夹保存一个图片xxx.jpg #}
<img width="300" src="{{ url_for('static', filename='img/xxx.jpg') }}">
{% endblock %} {% block styles %}
{{ super() }}
{# 加载CSS文件:css文件可以从bootstrap中粘贴一个过来 #}
<link href="{{ url_for('static', filename='css/common.css') }}" type="text/css" rel="stylesheet" />
{% endblock %} {% block head %}
{{ super() }}
{# 加载网站收藏夹小图标:ico文件自行从百度下载一个ico文件 #}
<link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}" />
{% endblock %} {% block scripts %}
{{ super() }}
{# 加载JS文件:js文件可以从bootstrap中粘贴一个过来 #}
<script type="text/javascript" src="{{ url_for('static', filename='js/common.js') }}"></script>
{% endblock %}
原生表单
准备模板文件
<form method="get" action="{{ url_for('check') }}">
用户名:<input name="username" /><br />
<input type="submit" />
</form>
添加视图函数,渲染模板文件
@app.route('/login/')
def login():
return render_template('login.html')
校验提交的请求
@app.route('/check/', methods=['GET', 'POST'])
def check():
# args:所有的GET参数
# return request.args.get('username', '提交失败')
# form:所有的POST参数
# return request.form.get('username', '提交失败')
# values:所有的GET/POST参数
return request.values.get('username', '提交失败')
一个路由可以接收多种请求
@app.route('/login/', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return request.form.get('username', '登录失败')
return render_template('login.html')
flask-wtf
说明:表单处理的扩展库,提供了CSRF、字段校验等实用功能,实用非常方便。
安装:
pip install flask-wtf
使用:
- 创建表单类:
# 导入表单类的基类
from flask_wtf import FlaskForm
# 导入字段类型
from wtforms import StringField, SubmitField
# 导入相关验证器
from wtforms.validators import Length # 创建表单类
class NameForm(FlaskForm):
# name = StringField('用户名')
# submit = SubmitField('提交')
name = StringField('用户名', validators=[Length(3, 6, message='用户名必须是3~6个字符')])
submit = SubmitField('提交')
- 添加视图函数,创建表单对象,并分配的模板中
@app.route('/', methods=['GET', 'POST'])
def index():
# 创建表单对象
form = NameForm()
# 判断是否是有效的提交
if form.validate_on_submit():
return form.name.data
# 在模板文件中渲染表单,form.html可以自己写一个,也可以百度一个
return render_template('form.html', form=form)
原生渲染表单
{# 原生渲染 #}
<form method="post">
{# CSRF字段 #}
{{ form.hidden_tag() }}
{# name字段 #}
{{ form.name.label() }}{{ form.name(id='xx', class='yy') }}
{% for e in form.name.errors %}
<div>{{ e }}</div>
{% endfor %}
{# 提交按钮 #}
{{ form.submit() }}
</form>
使用bootstrap进行渲染
{% extends 'bootstrap/base.html' %} {# 导入快速渲染表单的宏 #}
{% from 'bootstrap/wtf.html' import quick_form %} {% block title %}bootstrap渲染表单类{% endblock %} {% block content %}
<div class="container">
{# 在合适的位置渲染表单 #}
{{ quick_form(form) }}
</div>
{% endblock %}
POST重定向到GET:浏览器会记录最后的请求状态,若最后请求时POST,点击刷新时会提示再次提交表单。
@app.route('/', methods=['GET', 'POST'])
def index():
# 创建表单对象
form = NameForm()
# 判断是否是有效的提交
if form.validate_on_submit():
session['name'] = form.name.data
return redirect(url_for('index'))
name = session.get('name')
# 在模板文件中渲染表单
return render_template('form2.html', form=form, name=name)
常见字段类型:请自行测试
字段类型 说明 StringField 普通文本 SubmitField 提交按钮 PasswordField 密文文本 HiddenField 隐藏字段 RadioField 单选框 BooleanField 复选框 SelectField 下拉框 FileField 文件上传 TextAreaField 文本域 IntegerField 文本字段,值为整数 FloatField 文本字段,值为浮点数 DateField datetime.date类型 DateTimeField datetime.datetime类型 常见验证器:请自行测试
验证器 说明 Length 规定字符长度 DataRequired 确保字段有值(提示信息与所写的不一致) Email 邮箱格式 IPAddress IP地址 NumberRange 数值的范围 URL 统一资源定位符格式 EqualTo 验证两个字段的一致性 Regexp 正则校验 自定义字段验证函数
# 创建表单类
class NameForm(FlaskForm):
。。。
# 字段校验函数:'validate_字段名'
def validate_name(self, field):
if len(field.data) < 6:
raise ValidationError('用户名不能少于6个字符')
消息闪烁
说明:
当用户发出请求后,状态发生了改变,需要系统给出警告提示等信息时,通常都是弹出一条消息,指示用户下一步的操作,用户可以手动关闭或自动消失,整个过程不会影响页面的正常显示。
使用:
- 在需要闪烁消息时,使用
flash
函数保存闪烁消息
@app.route('/', methods=['GET', 'POST'])
def index():
# 创建表单对象
form = NameForm()
# 判断是否是有效的提交
if form.validate_on_submit():
# 最后一次提交的名字
last_name = session.get('name')
# 如果存在最后提交的名字,且最后提交的名字与之前保存的名字不相同时
if last_name and last_name != form.name.data:
flash('大哥,又换名字了^_^')
session['name'] = form.name.data
return redirect(url_for('index'))
name = session.get('name')
# 在模板文件中渲染表单
return render_template('form2.html', form=form, name=name)
- 在模板文件中提供
get_flashed_messages
函数获取闪烁消息并渲染:
{% for message in get_flashed_messages() %}
{# 闪烁消息文件可以从bootstrap中粘贴一个过来 #}
<div class="alert alert-warning alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span>
</button>
{{ message }}
</div>
{% endfor %}
说明:上面是从bootstrap粘贴的可消失的警告框。
- 在需要闪烁消息时,使用
flask-moment
说明:专门负责数据本地化显示的扩展库,使用非常方便。
安装:
pip install flask-moment
使用:
- python代码:
from flask_moment import Moment moment = Moment(app) @app.route('/moment/')
def mom():
from datetime import datetime, timedelta
current_time = datetime.utcnow() + timedelta(seconds=-360)
return render_template('mom.html', current_time=current_time)
- 模板文件:
{# 加载jQuery:依赖 #}
{{ moment.include_jquery() }} {# 加载moment #}
{{ moment.include_moment() }} {# 设置语言 #}
{{ moment.locale('zh-CN') }} {# 简单的格式化时间显示 #}
<div>时间:{{ moment(current_time).format('LLLL') }}</div>
<div>时间:{{ moment(current_time).format('LLL') }}</div>
<div>时间:{{ moment(current_time).format('LL') }}</div>
<div>时间:{{ moment(current_time).format('L') }}</div> {# 自定义格式化时间显示:如2018-05-20 01:03:14 #}
<div>自定义:{{ moment(current_time).format('YYYY-MM-DD HH:mm:ss') }}</div> {# 显示时间差 #}
<div>发表于:{{ moment(current_time).fromNow() }}</div>
Flask—03-bootstrap与表单的更多相关文章
- Bootstrap之表单控件状态
Bootstrap中的表单控件状态主要有三种:焦点状态,禁用状态,验证状态. 一.焦点状态:该状态告诉用户可输入或选择东西 焦点状态通过伪类“:focus”以实现. bootstrap.css相应 ...
- BootStrap 智能表单系列 首页 (持续更新中...)
背景:本码农.NET后端工程师,在项目开发中发现写了很多重复的代码, 于是自己整了一套根据配置来生成form表单的插件,针对表单的改动仅需要修改配置的json即可 使用中发现还是蛮实用的,于是开源出来 ...
- BootStrap 智能表单系列 十一 级联下拉的支持
像省市县选择的这种,但凡是个人肯定都见过,实现方式有很多种 1.有在第一级选择的时候去加载或者从本地对象中拿第一级对应的数据源显示到列表中,第二级以此类推 2.也有将所有的项都加载到select中,然 ...
- BootStrap 智能表单系列 十 自动完成组件的支持
web开发中,肯定遇到像百度.google这种搜索的功能吧,那智能表单中的自动完成可以做什么呢,下面来揭晓: 1.包含像google.百度等类似的简单搜索 2.复杂结构的支持,比如说 输入产品编号,需 ...
- BootStrap 智能表单系列 九 表单图片上传的支持
本章介绍如何在生成表单后,可以支持上传图片后可以及时预览图片 代码如下(连接地址:https://github.com/xiexingen/Bootstrap-SmartForm/blob/maste ...
- BootStrap 智能表单系列 六 表单数据绑定(编辑页面的数据绑定)
本章介绍如何在生成表单后,将一个model的数据展示到form表单中(一般用于编辑页面) 代码如下(连接地址:https://github.com/xiexingen/Bootstrap-SmartF ...
- BootStrap 智能表单系列 八 表单配置json详解
本章属于该系列的高级部分,将介绍表单中一些列的配置 1.config列的配置: 主要用于控制布局 :config:{autoLayout:true|'1,2,2,4'} true:根据配置项最里层的数 ...
- BootStrap 智能表单系列 七 验证的支持
但凡是涉及到用户编辑信息然后保存的页面,都涉及到一个数据是否符合要求的检查,需要客服端和服务器端的校验的问题: 客服端的校验主要是为了提高用户体验,而服务器端的校验为了数据的合格性 该插件也为您支持到 ...
- BootStrap 智能表单系列 五 表单依赖插件处理
这一章比较简单哦,主要就是生产表单元素后的一些后续处理操作,比如日期插件的渲染.一些autocomplete的处理等,在回调里面处理就可以了, demo: $("input.date-pic ...
- BootStrap 智能表单系列 四 表单布局介绍
表单的布局分为自动布局和自定义布局两种: 自动布局就是根据配置项中第二级配置项中数组的长度来自动使用不同的bootstrap栅格,通过设置autoLayout为true可以实现自动布局 自动以布局就是 ...
随机推荐
- 跨页面传值之Cookie
3.客户端再次访问某站点 浏览器将携带Cookie信息的指令,将获得的信息参与编译. 4.将含有Cookie信息参与编译的页面发回给浏览器 其中如果有相关的设置Cookie的指令.将再次通过浏览器,写 ...
- artDialog组件应用学习(五)
一.artDialog事件应用 对话框编写代码 function DialogEvent() { seajs.use(['jquery', '/Scripts/arale/artDialog/src/ ...
- hello2详解
1.GreetingServlet.java(显示问候页面表单) 此servlet重写该doGet方法,实现GETHTTP方法.servlet显示一个简单的HTML问候表单,其提交按钮就像hello1 ...
- 测试css3的动画效果在display:none的时候不耗费性能
也许你也有这个疑惑,动画一直在播放,那它不显示出来的时候也一直在播放的话,那是否一直占用资源呢? <!doctype html> <html> <head> < ...
- Python中变量的本质探索
Python中变量的本质探索 参考:Vamei博客Python进阶09 动态类型 ''' a = [1,2,3] ''' (1)这条"赋值语句"实际上是将a指向对象"[1 ...
- iOS中使用RNCryptor对资源文件加密
原文:http://blog.csdn.net/chenpolu/article/details/46277587 RNCryptor源码https://github.com/RNCryptor/RN ...
- java原生文件打包
一.背景 前端时间,自己做的项目需要打包功能,不想再引外部的jar包 便用java.util.zip做了下该功能 二.适用场景 生成多个word.excel.xml等文件,并要求打包下载的情形 例:项 ...
- BIEE入门(二)物理层的定义
使用BIEE的第一步是使用admintool去建立一个多维数据模型,而建立多维数据模型的第一步则是建立物理层,请注意因为BIEE本身并不存 储数据,所以所谓BIEE物理层的意义是需要在BIEE里建立各 ...
- VB6.0环境下的CATIA二次开发简介
CATIA作为CAD/CAE/CAM/PDM一体化的软件,广泛用于航空航天.汽车.船舶及电子工业,尤其在航空航天业,有八成以上厂商使用CATIA的市场[11].然而由于使用习惯和使用的侧重点不用,功能 ...
- javascript正则表达式 - 学习笔记
JavaScript 正则表达式 学习笔记 标签(空格分隔): 基础 JavaScript 正则表达式是用于匹配字符串中字符组合的模式.在javascript中,正则表达式也是对象.这些模式被用于Re ...