如何将文件附加到从Flask表单收到的Flask Mail?

时间:2018-02-21 02:52:57

标签: python flask flask-wtforms flask-mail

我正在使用Python Flask开发一个网站。我要做的是在其中一个表单中获取上传文件并将其附加到邮件中。我尝试了在类似问题中给出的解决方案,但它给出了以下错误:

  

属性错误:' str'对象没有属性'文件名'

我做错了什么?我是python和flask的初学者。 这是我的代码:

class UploadForm(Form):
    branch = StringField('branch', validators = [DataRequired()])
    year = StringField('year', validators = [DataRequired()])
    sub = StringField('sub', validators = [DataRequired()])
    paper = FileField('Logo', validators = [Required()])

def uploadPaper(form):
    msg = Message('New upload request', sender = ADMINS[0], recipients = ADMINS)
    msg.body = 'text body'
    msg.html = 'Branch: ' + form.branch.data + '<br />' + 'Year: ' + form.year.data + '<br />' + 'Subject: ' + form.sub.data
    msg.attach(form.paper.data.filename, 'application/octect-stream', form.paper.data.read())
    with app.app_context():
        mail.send(msg)
    return "success"

我在验证表单时调用了uploadPaper()函数。

1 个答案:

答案 0 :(得分:0)

嗯,你得到的错误意味着你正在尝试从字符串中读取文件。

AttributeError: 'str' object has no attribute 'filename'

这是因为你的uploadPaper()函数返回一个字符串(或'str')而不是'file'对象。由于Python是面向对象的,因此您的脚本可能会尝试从文件对象中读取“filename”属性。

我还可以在你的函数中看到有一个对象具有你想要使用的属性,在

msg.attach(form.paper.data.filename, 'application/octect-stream', form.paper.data.read())

看起来form.paper.data对象具有您稍后尝试使用的属性“filename”。

为什么不尝试return form.paper.data而不是return "success"

相关问题