Flask框架函数

雨燕双飞 提交于 2020-02-10 02:52:46

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'))
    # ...
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!