目录
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"