Web 框架 Flask 快速入门(二)表单

简介: 🌴 表单1、表单介绍当我们在网页上填写账号密码进行登录的时候,就是在填写一个“表单”。web表单是web应用程序种最基本的功能。2、表单的简单实现下面的代码实现了这样的功能:

🌴 表单

1、表单介绍

当我们在网页上填写账号密码进行登录的时候,就是在填写一个“表单”。web表单是web应用程序种最基本的功能。

2、表单的简单实现

下面的代码实现了这样的功能:

  • 前端发起请求时,收到一个含表单的网页
  • 在网页填写表单提交到后端
  • 后端对表单进行验证,显示成功或错误信息到前端

网页显示:

cdbc08b9eb5a4f32993b386d3d1d5e52.png

1. 代码

前端代码(index2.html):

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <!-- 一个表单 -->
        <form method="post">
           <label>用户名:</label><input type="text" name="username"><br>
           <label>密码:</label><input type="password" name="password"><br>
           <label>确认密码:</label><input type="password" name="password2"><br>
           <input type="submit" value="提交"><br>
           <!-- 使用遍历获取闪现的消息 -->
           {% for message in get_flashed_messages() %}
               {{ message }}
           {% endfor %}
        </form>
    </body>
</html>

后端代码(python):

from flask import Flask, render_template, request, flash
app = Flask(__name__)
app.secret_key = 'qfmz'
'''
目的:实现一个简单的登录的逻辑处理
1. 路由需要有get和post两种请求方式 --> 需要判断请求方式
2. 获取请求的参数
3. 判断参数是否填写 & 密码是否相同
4. 如果判断都没有问题,就返回一个success
'''
'''
给模板传递消息
flash --> 需要对内容加密,因此设置secret_key,做加密消息的混淆
模板中遍历消息
'''
@app.route('/', methods=['GET', 'POST'])
def index():
    # request: 请求对象 --> 获取请求方式、数据
    # 1. 判断请求方式
    if request.method == 'POST':
        # 2. 获取请求参数
        username = request.form.get('username')
        password = request.form.get('password')
        password2 = request.form.get('password2')
        print(username)
        print(password)
        print(password2)
        # 3. 判断参数是否填写 & 密码是否相同
        if not all([username, password, password2]):
            flash('参数不完整')
        elif password != password2:
            flash('密码不一致')
        else:
            return 'success'
    # 2. 获取请求参数
    return render_template('index2.html')
app.run(debug=True)

2. 代码的执行逻辑

我填写一个表单时,这些代码的执行逻辑是怎样的呢?我知道这些代码能跑,但我总感觉自己和这些代码之间的隔阂较大,我不知道我在网页中的没一步操作是哪些代码在发挥作用。对此,debug单步执行是一个很有用的帮助理解的办法。

我知道,一个请求就对应着一个响应。那么总结下,进入一个网页,填写和提交表单的过程中应该是发生了2次请求,同时也有2次响应。

  • 第1次,我进入网页,网页对后端发送GET请求,后端判断请求类型不是POST,于是直接返回(不是返回html源代码,是在flask的模板引擎里走了一遭的)index2.html,前端就显示一个需要填写的表单。

第2次,我填写完表单进行提交后,网页将表单中填写的数据作为参数,对后端发送POST请求,使用webob库解析environ得到的post参数如下:

MultiDict([('username', '1'), ('password', '******'), ('password2', '******')])
  • 然后后端根据请求再返回一个网页到前端。

3、使用wtf扩展实现

显示效果与前面的“简单实现”一样,前端代码写起来会简单一些,后端的表单逻辑验证也可以直接使用库实现。

前端代码(index.html)

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form method="post">
            {{ form.csrf_token() }}
            {{ form.username.label }}{{ form.username }}<br>
            {{ form.password.label }}{{ form.password }}<br>
            {{ form.password2.label }}{{ form.password2 }}<br>
            {{ form.submit }}
            <!-- 使用遍历获取闪现的消息 -->
            {% for message in get_flashed_messages() %}
                {{ message }}
            {% endfor %}
        </form>
    </body>
</html>

后端代码(python)

from flask import Flask, render_template, request, flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo
app = Flask(__name__)
app.secret_key = 'qfmz'
'''
使用WTF实现表单
自定义表单类
'''
class LoginForm(FlaskForm):
    username = StringField('用户名', validators=[DataRequired()])
    password = PasswordField('密码', validators=[DataRequired()])
    password2 = PasswordField('确认密码', validators=[DataRequired(), EqualTo('password', '密码填入不一致!')])
    submit = SubmitField('提交')
@app.route('/', methods=['GET', 'POST'])
def login():
    login_form = LoginForm()
    # 1. 判断请求方式
    if request.method == 'POST':
        # 2. 获取请求参数
        username = request.form.get('username')
        password = request.form.get('password')
        password2 = request.form.get('password2')
        # 3. 逻辑验证,WTF一句话
        # 自动包含CSRF_token验证,前端代码记得写上{{ form.csrf_token() }}
        if login_form.validate_on_submit():
            print(username, password, password2)
            return 'success'
        else:
            flash('填写错误,请确保每项都填,且两次密码填写一致。')
    return render_template('index.html', form=login_form)
app.run(debug=True)

4、bug记录:表单验证总是失败

起初没加csrf时,以为是它的原因;后来加了还是失败,总以为是我csrf没写好,在网上搜csrf相关的文章和教程,然而令我没想到的是,最终问题是在验证函数EqualTo()这里,

# 问题代码
password2 = PasswordField('确认密码', validators=[DataRequired(), EqualTo(password, '密码填入不一致!')])
# 修改
password2 = PasswordField('确认密码', validators=[DataRequired(), EqualTo('password', '密码填入不一致!')])

相关文章
|
26天前
|
安全 数据安全/隐私保护 开发者
Flask框架的安全性如何?
安全是一个持续的过程,需要不断地关注和更新。随着新的安全威胁的出现和技术的发展,开发者需要及时了解并采取相应的措施来应对,以确保 Flask 应用始终处于安全的状态。
|
21天前
|
SQL 监控 安全
Flask 框架防止 SQL 注入攻击的方法
通过综合运用以上多种措施,Flask 框架可以有效地降低 SQL 注入攻击的风险,保障应用的安全稳定运行。同时,持续的安全评估和改进也是确保应用长期安全的重要环节。
141 71
|
28天前
|
开发者 数据库管理 Python
Django框架和Flask框架的区别
总体而言,Django 适合需要快速搭建大型应用的开发者,而 Flask 则更适合有特定需求和追求灵活性的开发者。
112 64
|
21天前
|
安全 网络安全 数据安全/隐私保护
Flask框架的安全机制与其他框架相比有哪些优势和劣势?
总的来说,Flask 的安全机制在灵活性和可扩展性方面有其独特优势,但也需要开发者在安全方面投入更多的精力和努力,以确保应用的安全可靠运行。
45 11
|
19天前
|
SQL 安全 Java
除了Flask框架,还有哪些框架能防止SQL注入攻击?
这些框架都在安全方面有着较好的表现,通过它们的内置机制和安全特性,可以有效地降低 SQL 注入攻击的风险。然而,无论使用哪个框架,开发者都需要具备良好的安全意识,正确配置和使用框架提供的安全功能,以确保应用的安全可靠。同时,持续关注安全更新和漏洞修复也是非常重要的。
38 7
|
26天前
|
搜索推荐 API 开发者
Django框架和Flask框架的适用场景分别是什么?
总体而言,Django 更适合需要全面功能和大规模开发的场景,而 Flask 则更适合灵活性要求高、小型项目或特定需求的开发。当然,具体的选择还应根据项目的具体情况、团队的技术能力和偏好等因素来综合考虑。在实际应用中,开发者可以根据项目的特点和需求,灵活选择使用这两个框架,或者结合它们的优势来构建更强大的 Web 应用程序。
|
26天前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
|
25天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
35 2
|
27天前
|
JSON 前端开发 API
使用Python和Flask构建简易Web API
使用Python和Flask构建简易Web API
|
27天前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
70 1
下一篇
DataWorks