Flask и WTForms - как определить, отправлено ли поле загрузки файла для обработки - PullRequest
0 голосов
/ 21 октября 2018

Я создал форму с необязательным полем WTForms File для загрузки файла.Форма работает ... но после отправки мой код view.py всегда пытается обработать загруженный файл, независимо от того, был ли он отправлен или нет.

Как определить, имеет ли файлбыл загружен или нет? Я бы хотел, чтобы мой код обрабатывал загрузку, только если что-то было загружено.

В настоящее время я не нашел правильного способа проверки, поэтому мой код обрабатываетзагруженный файл, даже если ни один файл не был загружен.

В настоящее время я пытаюсь это различить в файле views.py, но это не работает (см. Ниже):

    attachFile = False

    if attachment:
        attachFile = True

Я также попробовал следующее, чтобы попытатьсязаставить что-то произойти (это закомментировано в полном коде в views.py):

            First attempt: if form.attachment.data is not str:
            Second attempt: if not attachment.filename == "":   
            Third attempt: if (isinstance(attachment,str) == False):
            (Fourth (and current) attempt is above)

Я также попробовал следующее, но получаю следующую ошибку, когда файл не загружен:

    if attachment.data:
        attachFile = True

## AttributeError: 'str' object has no attribute 'data'

forms.py:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, 
SubmitField, TextAreaField, FileField
from wtforms.fields.html5 import EmailField
from wtforms.validators import DataRequired, Email

class MailerForm(FlaskForm):
    fromName = StringField('fromName', validators=[DataRequired()])
    fromEmail = EmailField('fromEmail', validators=[DataRequired(), Email()])
    subject = StringField('Subject', validators=[DataRequired()])
    toAddress = TextAreaField('toAddress', validators=[DataRequired()])
    message = TextAreaField('message', validators=[DataRequired()])
    attachment = FileField('attachment')
    submit = SubmitField('Send Email')

views.py

@app.route('/mailer/', methods=['GET','POST'])
def mailer():

    # compiled regex to quick and dirty email validation
    EMAIL_REGEX = re.compile(r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)")


    form = MailerForm()

    if form.validate_on_submit():
        fromName = form.fromName.data
        fromEmail = form.fromEmail.data  
        subject = form.subject.data
        toAddress = form.toAddress.data
        messageBody = form.message.data
        attachment = form.attachment.data
        newFileName = ""

        attachFile = False

        if attachment:
            attachFile = True


        basedir = os.path.abspath(os.path.dirname(__file__))

        ## lists to track successful and unsuccessful email addresses submitted
        success = []
        failure = []

        ##
        ## split email address
        ##
        addresses = toAddress.split("\n")
        ##
        ## iterate through email addresses, validate, and send
        ##
        for address in addresses:

            address = address.strip()

            if EMAIL_REGEX.match(address):

                ##if (isinstance(attachment,str) == False):
                ##if not attachment.filename == "":
                if attachFile == True:
                    filename = os.path.join(basedir + "/static/" + app.config['UPLOAD_FOLDER'], attachment.filename)

                    attachment.save(filename)


                msg = Message(subject)
                msg.sender = (fromName,fromEmail)
                msg.recipients = [address]

                msg.body = messageBody
                #if form.attachment.data is not str:
                #if not attachment.filename == "":   
                #if (isinstance(attachment,str) == False):

                if attachFile == True:
                newFileName = attachment.filename
                    with app.open_resource(filename) as fp:

                        msg.attach(
                            newFileName,
                            "application/octet-stream",
                            fp.read())

                mail.send(msg)

                success.append(address)



            else:
                failure.append(address)
                print("Failed:" + address)    

    else: 
        """Renders index page."""
        return render_template(
            'mailer/mailer.html',
        form = form
    )

    ##
    ## Successfully emailed, time to nuke the temp attachment
    ##
    os.system('rm ' + basedir + "/static/" + app.config['UPLOAD_FOLDER'] + "/'" + newFileName + "'")

    ##
    ##
    ##
    return render_template(
            'mailer/mailerCompleted.html',
            form = form,
            success = success,
            failure = failure
        )

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вы также можете использовать not:

if not form.attachment.data:
    print('no files has been uploaded')

not A равно true, когда A пусто или None.

Таким образом, оно срабатывает, когда нет файловприлагается (form.attachment.data == None)

0 голосов
/ 21 октября 2018

Добавить:

from flask_wtf.file import FileField, FileRequired
...
attachment = FileField('attachment' , validators=[FileRequired()])

Файл требуется, и форма не будет проверяться, если файл не отправлен.

РЕДАКТИРОВАТЬ:

Если вы хотите, чтобы файл был необязательным,удалите validators = [FileRequired ()] и проверьте, передан ли файл с

if form.attachment.data is None:
    print("File is empty")
    #  Code if file is empty
else:
    #  Code if file is passed
...