《flask Web 开发》读书笔记 & chapter4

chapter 2 - chapter 3 - 源码

  • 概念剖析-flask表单对象
    • 跨站请求伪造保护
    • 表单类
    • 重定向和用户会话
    • flash推送状态变化消息

概念剖析-flask表单对象

  • request.form 能够获取 POST 请求中提交的表单对象,但是需要很多重复的操作,如:生成表单的HTML代码和验证提交的表单数据。
  • Flask-WTF 扩展能够方便的处理表单,pip install flask-wtf

跨站请求伪造保护

  • Flask-WTF,需要程序设置一个密钥,Flask-WTF利用密钥生成加密令牌,再利用令牌验证请求中表单数据的真伪。
  • app.config 字典能用来存储框架、扩展和程序本身的配置变量。
  • app.config['SECRET_KEY'] = 'scret word' 设置通用密钥,可在 FLask 和多个第三方库中使用。
  • 为了增强安全性,密钥不应该直接输入代码,而要保存在环境变量中。
  app = FLask(__name__)
  app.config['SECRET_KEY'] = "hard to guess string"

表单类

廖雪峰-Python教程-使用元类

  • flask-web 中的每个表单都由继承自 Form 的一个类表示,这个类定义表单中一组字段,每个字段都用对象表示。类似于ORM的技术
  • 每个字段都可附属一个或多个验证函数,验证用户输入是否符合要求

hello.py 文件:

from wtforms import StringField, SubmitField
from wtforms.validators import Required

class NameForm(Form):
  name = StringField("What's your name", validators=[Required()] )
  submit = SubmitField('Submit')
# ---------------------------------------------------- #
# ---------------------------------------------------- #
# 路由的 GET 和 POST 的区别是什么,及执行过程?
@app.route('/', methods=['GET', 'POST'])
def index():
    name=None
    form = NameForm()
    if form.validate_on_submit():
      name = form.name.data
      form.name.data = ''
    return render_template( 'index.html', form=form, name=name )

index.html 文件:

{% extends "base.html" %}
 
{% import "bootstrap/wtf.html" as wtf %}
{% block title %} Flasky - index {% endblock %}
{% block page_content %}
  
  
  {{ wtf.quick_form(form) }}
{% endblock %}
  • git add., git commit -m "flask-wtf first demo ", git tag 4a

重定向和用户会话

页面刷新时,浏览器会自动的发送之前已经发送给过的 post 请求,会弹出警告页面
Post / 重定向 / Get模式 Web开发设计模式PRG:Post/Redirect/Get,防止重复提交表单 通俗来说,PRG就是用户提交 post 请求,服务器返回 get 的重定向,客户端请求 get 请求,当刷新时,浏览器提交 get 请求。此时需要采用 会话对象 保存表单数据。

hello.py 文件:

@app.route('/', methods=['GET', 'POST'])
def index():
    name=None
    form = NameForm()
    if form.validate_on_submit():
        # 使用 session 保存数据
        session['name'] = form.name.data
        return redirect( url_for('index'))
    return render_template( 'index.html', form=form, name=session.get('name') )
OUTPUT:
127.0.0.1 - - [21/Apr/2017 21:31:51] "GET / HTTP/1.1" 200 -                    # 启动浏览器,get index.html
127.0.0.1 - - [21/Apr/2017 21:31:52] "GET /static/favicon.ico HTTP/1.1" 200 -  # 加载图标文件
127.0.0.1 - - [21/Apr/2017 21:32:02] "POST / HTTP/1.1" 302 -                   # 表单的 post 请求
127.0.0.1 - - [21/Apr/2017 21:32:02] "GET / HTTP/1.1" 200 -                    # 重定向 get 请求
  • git add., git commit -m "post_redirect_get and session "

flash推送状态变化消息

hello.py 修改

from flask import Flask, render_template, session, url_for, redirect, flash
...
@app.route('/', methods=['GET', 'POST'])
def index():
    name=None
    form = NameForm()
    if form.validate_on_submit():
        old_name = session['name']
        if old_name is not None and old_name != form.name.data:
            # flash 推送状态信息
            flash('Looks like you have changed your name!')
        # 使用 session 保存数据
        session['name'] = form.name.data
        return redirect( url_for('index'))
    return render_template( 'index.html', form=form, name=session.get('name') )

base.html 添加渲染

{% for message in get_flashed_messages() %}
{{ message }}
  • git add., git commit -m "flash alert " ,git tag 4b

你可能感兴趣的:(《flask Web 开发》读书笔记 & chapter4)