Преобразование списка диктов в CSV и прикрепление к электронной почте с помощью SendGrid - PullRequest
0 голосов
/ 26 января 2020

Я пытаюсь получить некоторые данные и отправить их по почте из облачной функции Google, используя SendGrid

Я попытался преобразовать данные в виде списка словарей (с тем же, плоский, структура) в CSV, как подробно здесь , но это не сработает, поскольку файловая система доступна только для чтения.

Чтобы противостоять этому, Я использую io.StringIO () для хранения CSV в памяти.

Однако при выполнении я получаю следующую ошибку / трассировку стека:

Traceback (most recent call last): 
File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", 
 line 383, in run_background_function_function_handler.invoke_user_function(event_object) 
File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", 
 line 217, in invoke_user_function return call_user_function(request_or_event) 
File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", 
 line 214, in call_user_function event_context.Context(**request_or_event.context)) 
File "/user_code/main.py",  line 267, in session_updated summarize_session(sessionid, doctorid)  File "/user_code/main.py", line 375, in summarize_session send_email([docemail], data) 
File "/user_code/main.py", line 328, in send_email response = sg.send(message) 
File "/env/local/lib/python3.7/site-packages/sendgrid/sendgrid.py",  
 line 98, in send response = self.client.mail.send.post(request_body=message.get()) 
File "/env/local/lib/python3.7/site-packages/python_http_client/client.py", 
 line 251, in http_request data = json.dumps(request_body).encode('utf-8')  
File "/opt/python3.7/lib/python3.7/json/__init__.py", 
 line 231,  in dumps return _default_encoder.encode(obj) 
File "/opt/python3.7/lib/python3.7/json/encoder.py",  
 line 199, in encode chunks = self.iterencode(o, _one_shot=True)  
File "/opt/python3.7/lib/python3.7/json/encoder.py", 
 line 257, in iterencode return _iterencode(o, 0)  
File "/opt/python3.7/lib/python3.7/json/encoder.py", 
 line 179,  in default raise TypeError(f'Object of type {o.__class__.__name__} '  
TypeError: Object of type StringIO is not JSON serializable

Код выглядит следующим образом:

def send_email(to_emails, datadict):
    message = Mail(
    from_email='info@domain.com',
    #to_emails= to_emails,
    to_emails= ['dude@domain.com'],
    subject='Summary of your session',
    html_content='<strong>Data Summary</strong>\
        <p>This email is a summary of your session. Please check the attachment for  details.    </p>')
    sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
    keys = datadict[0].keys()
    try:
        output_file = io.StringIO()
        #output_file = io.BytesIO()  # results in a typeerror 
        # https://stackoverflow.com/questions/34283178/typeerror-a-bytes-like-object-is-required-not-str-in-python-and-csv
        dict_writer = csv.DictWriter(output_file, keys)
        dict_writer.writeheader()
        dict_writer.writerows(datadict)

        print("Attaching")
        message.attachment = [
        Attachment(FileContent(output_file),
                FileType('text/csv'),
                FileName('sessiondata.csv'),
                Disposition('inline'),
                ContentId('SessionData')),
        ]
    except Exception as e:
        print("Exception:")
        print(e)
        return

    response = sg.send(message)

Как преобразовать список словарей в CSV и прикрепить его к электронному письму, не открывая физический файл в файловой системе?

...