title: flask学习笔记

subtitle: 1. flask框架函数

date: 2018-12-14 10:17:28

Flask学习

学习Miguel Grinberg的2017年新版The Flask Mega-Tutorial教程中遇到的问题,加以记录。

Miguel Grinberg的blog(Flask部分):

The Flask Mega-Tutorial(December 6 2017)

点我刷新

Flask框架函数

Flask框架/库 函数/参数 作用 示例
flask框架 render_template 将模板转换为完整的HTML页面的操作称为渲染。通过render_template渲染模板,该函数传入模板名以及一些模板变量列表,返回被实际变量值替换后的字符串结果。在内部,render_template 调用了原生依赖的Jinja2模板引擎,Jinja2 模板引擎是 Flask 框架的一部分。Jinja2 会把模板参数提供的相应的值替换了 {{…}} 块。 代码块1
Flask-WTF插件 FlaskForm 用户登录表单:Flask-WTF插件来处理本应用中的Web表单,它对WTForms进行了浅层次的封装以便和Flask完美结合。FlaskForm基类。 代码块2
wtforms包 StringField, PasswordField, BooleanField, SubmitField,(DataRequired) 用户登录表单:表单字段的类,每个字段类都接受一个描述或别名作为第一个参数,并生成一个实例来作为LoginForm的类属性。可选参数validators用于验证输入字段是否符合预期。DataRequired验证器仅验证字段输入是否为空 代码块2
Flask-WTF插件 form参数/form.hidden_tag()模板参数 表单模板:login.html模板需要一个form参数的传入到渲染模板的函数中,form来自于LoginForm类的实例化。通过用户视图进行实例化和关联。/ form.hidden_tag()模板参数生成了一个隐藏字段,其中包含一个用于保护表单免受CSRF攻击的token。 对于保护表单,需要做的所有事情就是在模板中包括这个隐藏的字段,并在Flask配置中定义SECRET_KEY变量,Flask-WTF会完成剩下的工作。 代码块2
flask框架 methods 表单视图:路由装饰器中的methods参数。它告诉Flask这个视图函数接受GET和POST请求,并覆盖了默认的GET。之前的“Method Not Allowed”错误正是由于视图函数还未配置允许POST请求。通过传入methods参数,就能告诉Flask哪些请求方法可以被接受。 代码块3
flask框架 form.validate_on_submit()函数 表单视图:执行form校验的工作。当浏览器发起GET请求的时候,它返回False。 代码块3
flask框架 redirect()函数 表单视图:指引浏览器自动重定向到它的参数所关联的URL。当前视图函数使用它将用户重定向到应用的主页。 代码块3
flask框架 get_flashed_messages()函数 表单模板(基础模板):get_flashed_messages()返回用flash()注册过的消息列表。接下来的条件结构用来检查变量messages是否包含元素,如果有,则在<\ul>元素中,为每条消息用<\li>元素来包裹渲染。闪现消息的一个特别的属性是,一旦通过get_flashed_messages函数请求了一次,它们就会从消息列表中移除,所以在调用flash()函数后它们只会出现一次。 代码块4
flask框架 url_for()函数 url_for()函数使用URL到视图函数的内部映射关系来生成URL。 例如,url_for('login')返回/login,url_for('index')返回/index。 url_for()的参数是endpoint名称,也就是视图函数的名字。 代码块5

Flask插件

Flask扩展/插架 函数/参数 作用 示例
Flask-WTF插件 FlaskForm 用户登录表单:Flask-WTF插件来处理本应用中的Web表单,它对WTForms进行了浅层次的封装以便和Flask完美结合。FlaskForm基类。 代码块2

代码块1

代码块1:
app/views.py:
from flask import render_template
from app import app @app.route('/')
@app.route('/index')
def index():
user = {'username': 'Gunxiaoshi'}
posts = [
{
'author': {'username': 'John'},
'body': 'Beautiful day in Portland!'
},
{
'author': {'username': 'Susan'},
'body': 'The Avengers movie was so cool!'
}
]
return render_template("index.html",
title='Home',
user=user,
post=posts)
代码块1:(教程给出的for循环是in posts)
templates/index.html:
<!DOCTYPE html>
<html lang="en">
<head>
{% if title %}
<meta charset="UTF-8">
<title>{{ title }} - microblog - GXS</title>
{% else %}
<title>Welcome to microblog! </title>
{% endif %}
</head>
<body>
<h1>Hi, {{user.username}}!</h1>
{% for post in post %}
{# 对于此处的for循环应该是in post #}
<p>{{post.author.username}} says: <b>{{post.body}}</b></p>
{% endfor %}
</body>
</html>

代码块2

app/forms.py:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired class LoginForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired()])
remember_me = BooleanField('Remember Me')
submit = SubmitField('Sign In')
templates/login.html:
{% extends "base.html" %} {% block content %}
<h1>Sign In</h1>
<form action="" method="post" novalidate>
{{ form.hidden_tag() }}
<p>
{{ form.username.label }}<br>
{{ form.username(size=32) }}
</p>
<p>
{{ form.password.label }}<br>
{{ form.password(size=32) }}
</p>
<p>{{ form.remember_me() }} {{ form.remember_me.label }}</p>
<p>{{ form.submit() }}</p>
</form>
{% endblock %}

代码块3

# @File    : views.py
# @Software: PyCharm # from flask import render_template
# render_template函数需要传入模板名以及一些模板变量列表,返回一个所有变量被替换的渲染的模板。
from app import app
from flask import render_template, flash, redirect
from .forms import LoginForm # index view function suppressed for brevity
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
# if form.validate_on_submit():
# flash('Login requested for OpenID="' + form.openid.data + '", remember_me=' + str(form.remember_me.data))
# return redirect('/index')
# return render_template('login.html', title='Sign In', form=form)
if form.validate_on_submit():
flash('Login requested for user {}, remember_me={}'.format(
form.username.data, form.remember_me.data))
return redirect('/index')
return render_template('login.html', title='Sign In', form=form)

代码块4

<!DOCTYPE html>
<html lang="en">
<head>
{% if title %}
<meta charset="UTF-8">
<title>{{ title }} - microblog - GXS</title>
{% else %}
<title>Welcome to microblog! </title>
{% endif %}
</head>
{# 导航栏代码 #}
<body>
<div>microblog - GXS:
{# <a href="/index">Home</a>#}
{# <a href="/login">Login</a>#}
<a href="{{ url_for('index') }}">Home</a>
<a href="{{ url_for('login') }}">Login</a>
{# 写入需要引用公共模块的.html文件 #}
</div>
<hr>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</body>
</html>

代码块5

<div>
Microblog:
<a href="{{ url_for('index') }}">Home</a>
<a href="{{ url_for('login') }}">Login</a>
</div>
from flask import render_template, flash, redirect, url_for

# ...

@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
# ...
return redirect(url_for('index'))
# ...

Flask框架函数的更多相关文章

  1. flask框架基本使用(4)(钩子函数,异常,命令行运行)

    flask 框架基本使用(1):https://www.cnblogs.com/chichung/p/9756935.html flask 框架基本使用(2):https://www.cnblogs. ...

  2. Flask 框架入门

    Flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 安装 Flask 依赖两个外部库, We ...

  3. Python自动化运维之30、Flask框架

    Flask 官网:http://flask.pocoo.org/ flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...

  4. 2nd_SE-结对编程1-基于flask框架的四则运算生成器

    0x00 Coding https://coding.net/u/nikochan/p/2nd_SE/git 0x01 写在前面 因为在上一个作业中,是基于python完成的Command程序.那么再 ...

  5. Flask框架

    FLask框架的简单介绍 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请 ...

  6. flask 视图函数的使用

    flask框架 视图函数当中 各种实用情况简单配置 1 建立连接 2 路由参数 3 返回网络状态码 4 自定义错误页面 5 重定向 6 正则url限制 和 url 优化 7 设置和获取cookie # ...

  7. Flask框架(1)--基础

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  8. Flask框架搭建一个日程表

    目录 前言 项目介绍 技术栈 Flask Web开发流程 一.搭建环境 1.1: 创建虚拟环境 1.2: 安装依赖包 1.3: 创建依赖包列表文件 1.4: 测试hello word 二.应用程序开发 ...

  9. Flask框架搭建REST-API服务

    一.目的 为了能够将测试工具部署成RESTful-API服务,这样就能通过接口的方式提供统一测试工具服务,使用人员就不用构建application而产生的各种环境问题.使用问题. 适合人群:Pytho ...

随机推荐

  1. 【Codeforces 639B】Bear and Forgotten Tree 3

    [链接] 我是链接,点我呀:) [题意] [题解] 首先,因为高度是h 所以肯定1下面有连续的h个点依次连成一条链.->用了h+1个点了 然后,考虑d这个约束. 会发现,形成d的这个路径,它一定 ...

  2. 洛谷 P3369 BZOJ 3224 【模板】普通平衡树(Treap/SBT)

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询 ...

  3. TensorFlow 便捷的实现机器学习 三

    TensorFlow 便捷的实现机器学习 三 MNIST 卷积神经网络 Fly Overview Enabling Logging with TensorFlow Configuring a Vali ...

  4. 多个线程作用于同一个runnable对象

    多个线程作用于同一个runnable对象 学习了:https://www.cnblogs.com/ligang305/archive/2012/08/10/2632126.html http://as ...

  5. [ajax 学习笔记] ajax初试

    ajax全称是:asynchronous javasctipt and xml. 1.为什么须要ajax? 一般web程序与server的交互是:页面发送请求等待server处理,server处理数据 ...

  6. Codeforces Round 313(div1)

    A题: 题目大意: 给出内角全为120度的六边形的六条边的边长,求由多少边长为1的等边三角形构成. 解题思路: 将六边形补全为一个大的等边三角形,则大的等边三角形的边长为六边形的相邻三边之和,接着减去 ...

  7. luogu2766 最长不下降子序列问题 DP 网络流

    题目大意:给定正整数序列x1,...,xn .(1)计算其最长不下降子序列的长度s.(不一定是否连续)(2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列.(序列内每一个元素不可重复)(3) ...

  8. 【转】学会这13个原则写UI界面文案,用户才能秒懂

    原文网址:http://www.niaogebiji.com/article-12011-1.html 摘要: 首先,在写UI文案之前,为了理清思路,要先搞清楚三个问题:我(设计师)想让用户做什么? ...

  9. day63-webservice 04.JaxWsServerFactoryBean和SOAP1.2

    <wsdl:definitions xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap12="h ...

  10. 小程序:前端防止用户重复提交&即时消息(IM)重复发送问题解决

    背景: 最近参与开发的小程序,涉及到即时消息(IM)发送的功能: 聊天界面如下,通过键盘上的[发送]按钮,触发消息发送功能 问题发现: 功能开发完毕,进入测试流程:测试工程师反馈说: 在Android ...