使用Flask-WTF中的FileField()实现文件上传和邮件发送
在Flask中使用Flask-WTF的FileField()来实现文件上传和邮件发送的功能,可以分为以下几个步骤:
步骤1:安装Flask和Flask-WTF模块
首先,我们需要安装Flask和Flask-WTF模块。可以通过pip来安装这两个模块:
pip install flask pip install flask_wtf
步骤2:创建Flask应用
然后,我们需要创建一个Flask应用。在应用的根目录下创建一个app.py文件,并添加以下内容:
from flask import Flask, render_template, flash, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import SubmitField
from flask_wtf.file import FileField, FileAllowed, FileRequired
from flask_mail import Mail, Message
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
# 邮件配置
app.config['MAIL_SERVER'] = 'your-mail-server'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = 'your-email'
app.config['MAIL_PASSWORD'] = 'your-email-password'
mail = Mail(app)
# 文件上传配置
app.config['UPLOAD_FOLDER'] = 'path-to-upload-folder'
app.config['ALLOWED_EXTENSIONS'] = {'txt', 'pdf', 'doc'}
# 邮件发送表单
class SendEmailForm(FlaskForm):
file = FileField('Upload File', validators=[FileAllowed(app.config['ALLOWED_EXTENSIONS']), FileRequired()])
submit = SubmitField('Send Email')
# 路由函数
@app.route('/', methods=['GET', 'POST'])
def send_email():
form = SendEmailForm()
if form.validate_on_submit():
file = form.file.data
filename = file.filename
file.save(app.config['UPLOAD_FOLDER'] + '/' + filename)
send_email_with_attachment(filename)
flash('Email sent successfully!', 'success')
return redirect(url_for('send_email'))
return render_template('index.html', form=form)
# 邮件发送函数
def send_email_with_attachment(filename):
with app.app_context():
msg = Message('File Upload',
sender='your-email',
recipients=['recipient-email'])
msg.body = 'Please find the attached file.'
with app.open_resource(app.config['UPLOAD_FOLDER'] + '/' + filename) as fp:
msg.attach(filename, 'application/octet-stream', fp.read())
mail.send(msg)
if __name__ == '__main__':
app.run()
在上述代码中,我们首先导入了所需的模块:Flask用于创建Flask应用,render_template用于渲染网页模板,flash用于闪现消息,redirect和url_for用于重定向。导入FlaskForm用于创建表单,SubmitField用于创建提交按钮,FileField、FileAllowed和FileRequired用于文件上传验证,Mail和Message用于邮件发送。
我们设置了一些应用的配置项,包括SECRET_KEY、邮件配置(其中需填写自己的邮件服务器和账号信息)、文件上传配置。
然后,我们创建了一个名为SendEmailForm的表单类,其中使用FileField来创建文件上传字段,使用SubmitField来创建提交按钮。
在send_email路由函数中,我们创建了一个SendEmailForm表单对象,并在提交时判断表单是否通过验证。如果通过验证,我们保存文件到服务器上指定的文件夹中,并调用send_email_with_attachment函数发送邮件,同时使用flash函数闪现提示消息,最后重定向到该页面。如果表单未通过验证,将渲染index.html模板,同时将表单对象传递给模板。
在send_email_with_attachment函数中,我们使用app.open_resource函数打开文件,然后创建一封带有附件的邮件,并调用mail.send函数发送邮件。
步骤3:创建模板文件
在应用的根目录下创建一个名为templates的文件夹,并在其中创建一个名为index.html的HTML模板文件,添加以下内容:
<!DOCTYPE html>
<html>
<head>
<title>File Upload and Email Send</title>
</head>
<body>
<h1>File Upload and Email Send</h1>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<form method="POST" action="/" enctype="multipart/form-data">
{{ form.csrf_token }}
{{ form.file.label }}{{ form.file }}<br>
{{ form.submit }}
</form>
</body>
</html>
在该模板文件中,我们首先判断是否存在闪现消息,如果存在则将其渲染为无序列表。然后创建一个表单,并使用form.csrf_token和form.file.label来渲染表单的CSRF令牌和文件上传字段及其标签。
步骤4:运行应用
在应用的根目录下打开命令行,输入以下命令运行应用:
python app.py
然后在浏览器中访问http://localhost:5000,即可看到应用界面。选择要上传的文件,并点击提交按钮,即可上传该文件并发送邮件。如果文件上传和邮件发送成功,将会显示提示消息。
以上就是使用Flask-WTF中的FileField()实现文件上传和邮件发送的步骤和例子。通过这种方式,我们可以方便地在Flask中实现文件上传和邮件发送的功能。
