Python学习笔记--Flask补充(一)

WTForms验证

Flask-WTF

Flask-WTF是简化了WTForms操作的一个第三方库。WTForms表单的两个主要功能是验证用户提交数据的合法性以及渲染模板。当然还包括一些其他的功能:CSRF保护,文件上传等。

安装方式

安装Flask-WTF会自动安装WTForms

pip install flask-wtf

先来创建模板, 用于测试下面各项验证

在这里插入代码片

表单验证

在注册账号时, 会经常对用户名和密码做些长度的验证以及再次输入密码等验证.

然后建立一个py文件, 用于表单验证并将验证结果返回到视图文件中.
表单验证form.py

from wtforms import Form, StringField, validators
from wtforms.validators import Length, EqualTo


# 表单验证
class RegistForm(Form):
    username = StringField(validators=[Length(min=3, max=10, message="用户名长度不正确")])
    password = StringField(validators=[Length(min=3, max=10, message="密码长度不正确")])
    password_repate = StringField(validators=[EqualTo("password", message="两次密码不一致")])
  • 做验证的类需要继承Form
  • Length: 验证长度
  • EqualTo: 验证指定字段的值是否相同
  • message: 自定义输出错误信息

在视图文件中, 只需要导入表单验证文件,并对返回结果做判断即可

from flask import Flask, request,render_template
from forms import RegistForm
app = Flask(__name__)


@app.route("/")
def index():
    return "首页"


@app.route("/regist/", methods=["GET", "POST"])
def regist():
    if request.method == "GET":
        return render_template("regist.html")
    else:
        # 将接收到的post数据传入表单验证中
        form = RegistForm(request.form)
        if form.validate():  # 判断是否验证通过
            return "成功"
        else:
            print(form.errors)  # 输出错误原因
            return "失败"


if __name__ == '__main__':
    app.run(debug=True)
  • 后续不管做什么验证, 视图文件都只需要根据验证结果判断并返回相应的内容即可, 不需要在视图文件中写太多验证的代码.

验证邮箱格式

验证邮箱格式需要用到Email模块
另外,在使用前还需要安装email_validator, 它需要依赖这个模块才能使用

...
from wtforms.validators import Email  # 验证邮箱格式

...
...

class LoginForm(Form):
    email = StringField(validators=[Email(message="邮箱格式不正确")])

限制数字为整数以及验证范围内的数字

IntegerField: 限制传入的字段都必须为整数
NumberRange: 判断一个数字是否在指定的范围内.

...
from wtforms import IntegerField  # 限制输入整数
from wtforms.validators import NumberRange  # 验证范围内的数字

...
...

class LoginForm(Form):
    # email = StringField(validators=[Email(message="邮箱格式不正确")])
    age = IntegerField(validators=[NumberRange(1, 200, message="年龄范围错误")])  # 限制数字为整数以及验证范围内的数字

必填验证

...
from wtforms.validators import InputRequired  # 必填验证

...
...

class LoginForm(Form):
    # email = StringField(validators=[Email(message="邮箱格式不正确")])
    # age = IntegerField(validators=[NumberRange(1, 200, message="年龄范围错误")])  # 限制数字为整数以及验证范围内的数字
    username = StringField(validators=[InputRequired(message="用户名为必填")])

自定义正则表达式

某些时候WTForms内置的方法不能满足业务时, 可以使用Regexp自定义正则表达验证.
例如验证手机号格式

...
from wtforms.validators import Regexp

...
...

class LoginForm(Form):
	...
    phone = StringField(validators=[Regexp(r"1[2-9]{2}\d{8}", message="手机号输入不正确")])  # 自定义正则表达式验证手机号

URL验证

...
from wtforms.validators import URL

...
...

class LoginForm(Form):
	...
    info = StringField(validators=[URL(message="URL错误")])

自定义验证方法

Form类提供了一种方式可以自定义验证方法, 在定义这种方法的时候,它有固定的命名格式: validate_验证的字段名
例如下面做的一个简单的验证码, 验证码的长度固定为4; 然后将会判断输入的验证码是否等于"4444"(由于只是个小测试, 验证码写死为4444)

...
from wtforms import Form, StringField, validators
from wtforms.validators import Length, EqualTo
from wtforms.validators import ValidationError

...
...

class LoginForm(Form):
	...
	
    # 验证验证码的长度
    captcha = StringField(validators=[Length(min=4, max=4, message="验证码长度不正确")])

    # 自定义验证方法, 命名格式: validate_验证的字段名
    def validate_captcha(self, field):
        if field.data != "4444":
            raise ValidationError("验证码错误")
  • 另外, 这里导入了ValidationError, 这是用于主动抛出异常信息

文件上传

文件上传也是一个网页基本的功能, 下面实现了一个简单的文件上传方式

首先创建模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
    <table>
        <tr>
            <td>头像</td>
            <td><input type="file" name="image_file"></td>
        </tr>
        <tr>
            <td>描述</td>
            <td><input type="text" name="desc"></td>
        </tr>
        <tr>
            <td><input type="submit" value="提交"></td>
        </tr>
    </table>
</form>
</body>
</html>
  • 在模版中,form表单中,需要指定encotype='multipart/form-data’才能上传文件。(重点)

然后创建视图文件

from flask import Flask, request, render_template
import os

app = Flask(__name__)
app.config["TEMPLATES_AUTO_RELOAD"] = True


@app.route("/")
def index():
    return "首页"


@app.route("/upload/", methods=["GET", "POST"])
def upload():
    if request.method == "GET":
        return render_template("upload.html")
    else:
        desc = request.form.get("desc")
        img_file = request.files.get("image_file")
        # print(img_file)
        # print(type(img_file))
        img_file.save(os.path.join("img", img_file.filename))
        return "文件上传成功"

if __name__ == '__main__':
    app.run(debug=True)
  • 在后台如果想要获取上传的文件,那么应该使用request.files.get(‘avatar’)来获取。

考虑到安全问题, 在保存上传文件时需要对文件名字进行过滤, 这里可以用werkzeug.utils.secure_filename来对上传上来的文件名进行一个过滤, 它会将文件名中的空格替换成"_"; 会将带有路径的文件名自动过滤前面的路径, 只保留文件名等. 在源码中有介绍
在这里插入图片描述
视图文件修改如下代码

from flask import Flask, request, render_template
from werkzeug.utils import secure_filename  # 导入secure_filename模块
import os

app = Flask(__name__)
app.config["TEMPLATES_AUTO_RELOAD"] = True


@app.route("/")
def index():
    return "首页"


@app.route("/upload/", methods=["GET", "POST"])
def upload():
    if request.method == "GET":
        return render_template("upload.html")
    else:
        desc = request.form.get("desc")
        img_file = request.files.get("image_file")
        # print(img_file)
        # print(type(img_file))
        filname = secure_filename(img_file.filename)  # 过滤文件名
        img_file.save(os.path.join("img", filname))  
        return "文件上传成功"

if __name__ == '__main__':
    app.run(debug=True)

文件验证

根据业务的不同, 上传文件很多时候会验证文件类型, 例如只能上传图片、文档或特定类型的文件。
举例, 验证上传的图片类型为“jpg、png、gif” 且图片上传是必须的

首先创建upload_form.py文件, 用于定义验证器

from wtforms import Form, FileField, StringField
from wtforms.validators import InputRequired
from flask_wtf.file import FileAllowed, FileRequired

class UploadForm(Form):
    # FileRequired 文件必须传
    # FileAllowed 允许上传的类型
    image_file = FileField(validators=[FileRequired(), FileAllowed(["jpg", "png", "gif"])])
    desc = StringField(validators=[InputRequired()])  # 验证desc为必填
  • 使用FileRequired()限制文件上传是必须的
  • 使用FileAllowed限制上传文件的类型, 这里需要传入一个列表
  • FileRequired和FileAllowed模块都是从flask_wtf中导入的

然后修改视图函数

# 增加导入下面两个模块
from upload_form import UploadForm  # 导入验证器文件
from werkzeug.datastructures import CombinedMultiDict


@app.route("/upload/", methods=["GET", "POST"])
def upload():
    if request.method == "GET":
        return render_template("upload.html")
    else:
        # form = UploadForm(request.form, request.files) # 使用这种方式, 并不能将文件传入upload_form进行验证
        form = UploadForm(CombinedMultiDict([request.form, request.files]))  # 将request.form与request.files进行合并,再传给验证器来验证。
        if form.validate():
            # desc = request.form.get("desc")
            # img_file = request.files.get("image_file")

            # 可以使用form来接收表单数据
            desc = form.desc.data
            img_file = form.image_file.data
            filname = secure_filename(img_file.filename)  # 过滤文件名
            img_file.save(os.path.join("img", filname))
            return "上传成功"

        else:
            print(form.errors)
            return "上传失败"
  • 验证文件不能用通常的form = UploadForm(request.form, request.files), 这样只会讲request.form表单数传入验证器中, 文件并没有传入, 因此这里需要用到CombinedMultiDict将request.form与request.files进行合并,再传给验证器来验证.
  • 要获取表单数据除了使用desc = request.form.get(“desc”)还可以使用desc = form.desc.data, 两者是相等的, 但后者代码更简洁; img_file也是同理

通过URL访问文件

在网页中右键图表查看属性可以看到图片的URL, 将它复制到浏览器中可以通过浏览器访问到这个图片, 这个功能在FLASK中通过导入也能很轻易的实现
在视图文件中加入以下代码

from flask import send_from_directory

@app.route("/images/<filename>")
def get_img(filename):
    return send_from_directory("img", filename)

然后在浏览器输入http://127.0.0.1:5000/images/图片名字
.

常用验证器

验证器的导入方式一般是通过wtforms.validators导入

from wtforms.validators import XXXXXX
验证器描述
Length验证长度参数min=最小值, max=最大值,
EqualTo传入一个字段,验证与字段的值是否相同
Email验证邮箱格式, 要额外安装email_validator才能使用
InputRequired必填验证
Regexp自定义正则表达式
URL验证URL格式
validate_验证的字段名用于自定义验证方法, 方法的命名格式是固定的
FileRequired限制文件上传是必须的,从flask_wtf中导入
FileAllowed限制上传文件的类型, 这里需要传入一个列表, 从flask_wtf中导入
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要基于PythonFlask建立一个学习笔记系统,你可以按照以下步骤进行: 1. 安装PythonFlask:首先,确保你的计算机上安装了Python。然后,使用pip命令安装Flask框架。在命令行执行以下命令: ``` pip install Flask ``` 2. 创建Flask应用:在你选择的目录下创建一个新的文件夹,用于存放你的应用程序。进入该文件夹,并创建一个名为app.py的Python脚本文件。 3. 导入依赖:在app.py文件,导入必要的模块和库: ```python from flask import Flask, render_template, request ``` 4. 初始化Flask应用:在app.py文件,初始化Flask应用: ```python app = Flask(__name__) ``` 5. 创建路由和视图函数:根据你的学习笔记系统的需求,创建不同的路由和对应的视图函数。例如,你可以创建一个用于显示学习笔记列表的路由: ```python @app.route('/notes') def notes(): # 在这里编写代码来获取学习笔记列表,并将其传递给模板 return render_template('notes.html', notes=notes_list) ``` 6. 创建模板:在你的应用程序文件夹创建一个名为templates的文件夹,并在其创建一个名为notes.html的模板文件。在模板文件,你可以使用Flask提供的模板语法来显示学习笔记列表: ```html <h1>学习笔记列表</h1> <ul> {% for note in notes %} <li>{{ note }}</li> {% endfor %} </ul> ``` 7. 运行应用:在命令行,使用以下命令运行你的应用: ``` python app.py ``` 现在,你的基于PythonFlask学习笔记系统就可以运行了。你可以根据需要添加更多的路由和视图函数,以及其他功能如添加、编辑和删除学习笔记等。同时,你可以探索Flask的文档和教程,以深入了解如何构建更复杂的应用程序。祝你成功!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值