Flask-WTF和文件上传

目录

1、WTForms

①使用示例:

②常用的验证器:

③自定义校验规则

2、文件上传

 ①示例

②对上传文件进行表单校验


1、WTForms

类似Django中的forms,进行数据校验,返回错误信息,模板渲染。

第一个功能是做表单验证,把用户提交上来的数据进行验证是否合法。第二个就是做模版渲染。

①使用示例:

forms.py

from wtforms import Form, StringField, IntegerField, BooleanField, DateField, SelectField
from wtforms.validators import Length, EqualTo, Email, InputRequired, NumberRange, Regexp, URL, UUID, ValidationError


class RegistForm(Form):
    username = StringField(validators=[Length(min=3, max=10, message='用户名长度必须在3到10位之间')])  # 指定返回的message
    password = StringField(validators=[Length(min=6, max=10)])
    password_repeat = StringField(validators=[Length(min=6, max=10), EqualTo("password")])  # EqualTo和哪个字段保持一致


class LoginForm(Form):
    email = StringField(validators=[Email()])  # 验证器中是列表
    username = StringField(validators=[InputRequired()])
    age = IntegerField(validators=[NumberRange(12, 100)])
    phone = StringField(validators=[Regexp(r'1[38745]\d{9}')])
    homepage = StringField(validators=[URL()])
    uuid = StringField(validators=[UUID()])
    captcha = StringField(validators=[Length(4, 4)])

视图函数:

@app.route('/login/', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template("login.html")
    else:
        form = LoginForm(request.form)
        if form.validate():    # 是否通过校验
            return "success"
        else:
            print(form.errors)
            return "fail"

②常用的验证器:

数据发送过来,经过表单验证,因此需要验证器来进行验证,以下对一些常用的内置验证器进行讲解:

1. Email:验证上传的数据是否为邮箱。

2. EqualTo:验证上传的数据是否和另外一个字段相等,常用的就是密码和确认密码两个字段是否相等。

3. InputRequir:原始数据的需要验证。如果不是特殊情况,应该使用InputRequired。

3. Length:长度限制,有min和max两个值进行限制。

4. NumberRange:数字的区间,有min和max两个值限制,如果处在这两个数字之间则满足。

5. Regexp:自定义正则表达式。

6. URL:必须要是URL的形式。

7. UUID:验证UUID。

③自定义校验规则

1. 定义一个方法,方法的名字规则是:validate_字段名(self,filed)
2. 在方法中,使用field.data可以获取到这个字段的具体的值。
3. 如果数据满足条件,那么可以什么都不做。如果验证失败,那么应该抛出一个wtforms.validators.ValidationError的异常,并且把验证失败的信息传到这个异常类中。

    def validate_captcha(self, field): #validate_ 加字段,进行某个字段的校验
        if field.data != '1234':
            raise ValidationError('验证码错误!')

2、文件上传

1. 在模版中,form表单中,需要指定encotype='multipart/form-data'才能上传文件。
2. 在后台如果想要获取上传的文件,那么应该使用request.files.get('avatar')来获取。
3. 保存文件之前,先要使用werkzeug.utils.secure_filename来对上传上来的文件名进行一个过滤。这样才能保证不会有安全问题。
4. 获取到上传上来的文件后,使用avatar.save(路径)方法来保存文件。
5. 从服务器上读取文件,应该定义一个url与视图函数,来获取指定的文件。在这个视图函数中,使用send_from_directory(文件的目录,文件名)来获取。

 ①

@app.route('/upload/',methods=['GET','POST'])
def upload():
    if request.method == 'GET':
        return render_template('upload.html')
    else:
        avatar = request.files.get("avatar") # 获取头像
        filename = secure_filename(avatar.filename) #防止通过文件名攻击
        avatar.save(os.path.join(UPLOAD_PATH,filename))
        return '上传成功'

@app.route('/images/<filename>/')
def get_image(filename):
    return send_from_directory(UPLOAD_PATH,filename)  #send_from_directory 获取文件

②对上传文件进行表单校验

forms.py

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


class UploadForm(Form):
    # FileRequired 是否为空。FileAllowed 验证后缀
    avatar = FileField(validators=[FileRequired(), FileAllowed(['jpg', 'png', 'gif'])])
    desc = StringField(validators=[InputRequired()])

视图函数:

@app.route('/upload/', methods=['GET', 'POST'])
def upload():
    if request.method == 'GET':
        return render_template('upload.html')
    else:
        # 将用户提交的数据组合到一起,都放到表单中验证
        form = UploadForm(CombinedMultiDict([request.form, request.files]))
        if form.validate():
            desc = form.desc.data
            avatar = form.avatar.data
            filename = secure_filename(avatar.filename)  # 文件名安全
            avatar.save(os.path.join(UPLOAD_PATH, filename))
            return '文件上传成功'
        else:
            print(form.errors)
            return "fail"

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值