如何使用重定向烧瓶传递参数

时间:2021-07-19 10:35:38

标签: python variables flask parameters arguments

我已经编写了一个可以接受用户上传文件的编码。然后在进入另一个功能和另一个功能之前,文件将在水印功能中加水印。现在我有 3 个函数,分别是 upload_file()encrypt()emel()。我设法将文件从 upload_file() 传递到 encrypt()。但是当我尝试将文件传递给 emel() 时。我遇到了错误。

upload_file()

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

pdf_file = request.files['file']
watermark = "watermark.pdf"
merged_file = "merged.pdf"

input_pdf = PyPDF2.PdfFileReader(pdf_file)

watermark_file = open(watermark,'rb')
watermark_pdf = PyPDF2.PdfFileReader(watermark_file)

pdf_page = input_pdf.getPage(0)

watermark_page = watermark_pdf.getPage(0)

pdf_page.mergePage(watermark_page)

output = PyPDF2.PdfFileWriter()

output.addPage(pdf_page)

merged_file = open(merged_file,'wb')
output.write(merged_file)

merged_file.close()
watermark_file.close()
pdf_file.close()

return redirect(url_for("encrypt", file="merged.pdf"))

encrypt()

@app.route("/<file>")
def encrypt(file):

key = Fernet.generate_key()

file1 = open('key.key', 'wb')
file1.write(key)
file1.close()

file2 = open('key.key', 'rb')
key = file2.read()
file2.close()

encrypted_file = 'test1.pdf'
decrypted_file = 'test2.pdf'

# with open ('mykey.key', 'wb') as mykey:
#     mykey.write(key)  

# with open('mykey.key', 'rb') as mykey:
#     key = mykey.read()

# print(key)

with open(str(file), 'rb') as original_file:
    original = original_file.read()

f = Fernet(key)
encrypted = f.encrypt(original)

with open('test1.pdf', 'wb') as encrypted_file:
    encrypted_file.write(encrypted)

f = Fernet(key)

with open('test1.pdf', 'rb') as encrypted_file:
    encrypted = encrypted_file.read()

decrypted = f.decrypt(encrypted)

with open('test2.pdf', 'wb') as decrypted_file:
    decrypted_file.write(decrypted)

return redirect(url_for("emel", final_file='test2.pdf'))

到这里为止,我设法通过了它。但是从 return redirect(url_for("emel", final_file='test2.pdf')) 开始,我遇到了错误。

emel()

@app.route("/<final_file>")
def emel(final_file):

email_user = "email@gmail.com"
email_send = "email@gmail.com"
subject = 'Python!'

msg = MIMEMultipart()
msg['From'] = email_user
msg['To'] = email_send
msg['Subject'] = subject

body = 'Hi there, sending this email from Python!'
msg.attach(MIMEText(body, 'plain'))

filename = final_file
attachment = open(filename,'rb')

part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= "+filename)

msg.attach(part)

text = msg.as_string()

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(email_user, "password")

server.sendmail(email_user, email_send, text)
server.quit()

return "Success send email"

回溯:

Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 2088, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 2073, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 2070, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 1515, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 1513, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 1499, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "C:\Users\User\Desktop\abc\test.py", line 103, in encrypt
    with open(str(file), 'rb') as original_file:
OSError: [Errno 22] Invalid argument: "<_io.BufferedWriter name='test2.pdf'>"

我需要帮助。谢谢

1 个答案:

答案 0 :(得分:0)

我认为问题在于您的文件路径,您必须使用完整路径

open(r"C:\file_path\merged.pdf","rb")

或相对路径

open("merged.pdf","rb")