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')) # ...
来源:https://www.cnblogs.com/gunxiaoshi/p/11052504.html