«Ожидаемая строка или байтовый объект» только при использовании RQ - PullRequest
0 голосов
/ 09 июля 2020

Этот код может сгенерировать и загрузить PDF-файл в S3 с помощью Boto и Python (Flask), но когда используется RQ worker, возвращается исключение «Ожидаемая строка или байтовый объект».

generator.py

import os
import requests
from extensions import db
from models import Users
from datetime import timedelta, datetime
from lib.helpers import *
from lib.apis import *
from fpdf import FPDF
from rq import Queue
from worker import conn

q = Queue(connection=conn)

def generate():
    users = Users.query.all()
    for user in users:
      # fails
      job = q.enqueue(create_pdf, user)

      # works as expected
      # create_pdf(user)

def create_pdf(user):
    # creates the pdf
    pdf_filename = f'{year}-{month}-{client_name}.pdf'
    pdf_file = pdf.output(name=pdf_filename, dest='F')
    upload_monthly_report_s3(f'{year}-{month}', pdf_filename)

def upload_monthly_report_s3(month, filename):
    s3 = boto_client('s3')
    bucket = os.environ.get("S3_REPORTS")
    try:
        with open(filename, 'rb') as data:
          print("DATA:", data)
          res = s3.upload_fileobj(
              data,
              bucket,
              "{}/{}".format(month, filename),
              ExtraArgs={
                  "ContentType": "application/pdf"
              }
          )

    except Exception as e:
        print("Something Happened: ", e)
        os.remove(filename)
        return [500, e]

    os.remove(filename)
    return [200, "https://s3-us-west-2.amazonaws.com/{}/{}/{}".format(bucket, month, filename)]

Если этот код работает без RQ, он работает должным образом. Как только функция create_pdf() вызывается в очереди, возникает исключение Something Happened: expected string or bytes-like object.

Объект, передаваемый в upload_filobj(), равен <_io.BufferedReader name='2020-7-username.pdf'>

RQ Log / Stacktrace

22:48:24 default: pdf_generator.create_pdf(<User 49>) (afc3e851-a563-41ab-a328-1de6aee25726)
GENERATE QUEUE CONNECTION Redis<ConnectionPool<Connection<host=localhost,port=6379,db=0>>>
QUEUE <Queue default>
filename 2020-7-username.pdf file
DATA: <_io.BufferedReader name='2020-7-username.pdf'>
Something Happened:  expected string or bytes-like object
22:50:39 default: Job OK (afc3e851-a563-41ab-a328-1de6aee25726)

Как RQ мешает этому работать?

...