2014-01-15 25 views
0

當我將一個ics日曆邀請附加到一個電子郵件發送到Django時,我得到了AttributeError: 'HttpResponse' object has no attribute 'encode'。這隻有當我附上了特邀邀請函,如果我不附上,一切都很好。Django ical attachment導致'HttpResponse'對象沒有屬性'編碼'

我不確定爲什麼它尋找HttpResponse對象上的編碼屬性或如何處理它。

def email_invite(ics_form, user_assigned): 
    subject = 'You Have Been Assigned Schuduled Maintance/Calendar invite' 
    from_address = '[email protected]' 
    body = "This is a invite" 
    recip = [user_assigned] 
    email = EmailMessage(subject, body, from_address, recip) 
    email.attach(ics_form['Filename'], ics_form, 'text/calendar') 
    email.send() 


def create_ics(data): 
    start1 = data['date_due'] 
    utc = vobject.icalendar.utc 
    start2 = datetime.datetime(start1.year, start1.month, start1.day, tzinfo = utc) 
    start3 = data['action'] 
    cal = vobject.iCalendar() 
    cal.add('method').value = 'PUBLISH' 
    vevent = cal.add('vevent') 
    vevent.add('dtstart').value = start2 
    vevent.add('dtend').value = start2 
    vevent.add('dtstamp').value = datetime.datetime.now() 
    vevent.add('summary').value = data['action'].name 
    response = HttpResponse(cal.serialize(), content_type='text/calendar') 
    response['Filename'] = 'filename.ics' 
    response['Content-Disposition'] = 'attachment; filename=filename.ics' 
    return response 

File "/home/one/.virtualenvs/chronos/local/lib/python2.7/site-packages/django/core/mail/message.py", line 280, in _create_message 
    return self._create_attachments(msg) 
    File "/home/one/.virtualenvs/chronos/local/lib/python2.7/site-packages/django/core/mail/message.py", line 293, in _create_attachments 
    msg.attach(self._create_attachment(*attachment)) 
    File "/home/one/.virtualenvs/chronos/local/lib/python2.7/site-packages/django/core/mail/message.py", line 320, in _create_attachment 
    attachment = self._create_mime_attachment(content, mimetype) 
    File "/home/one/.virtualenvs/chronos/local/lib/python2.7/site-packages/django/core/mail/message.py", line 303, in _create_mime_attachment 
    attachment = SafeMIMEText(content, subtype, encoding) 
    File "/home/one/.virtualenvs/chronos/local/lib/python2.7/site-packages/django/core/mail/message.py", line 126, in __init__ 
    MIMEText.__init__(self, text, subtype, charset) 
    File "/usr/lib/python2.7/email/mime/text.py", line 30, in __init__ 
    self.set_payload(_text, _charset) 
    File "/usr/lib/python2.7/email/message.py", line 226, in set_payload 
    self.set_charset(charset) 
    File "/usr/lib/python2.7/email/message.py", line 268, in set_charset 
    cte(self) 
    File "/usr/lib/python2.7/email/encoders.py", line 73, in encode_7or8bit 
    orig.encode('ascii') 
AttributeError: 'HttpResponse' object has no attribute 'encode' 
[15/Jan/2014 08:30:36] "POST /modify/2/ HTTP/1.1" 500 167107 
Not Found: /favicon.ico 

回答

3

您還沒有粘貼所有的代碼,但它聽起來就像你做這樣的事情:

ical = create_ics(thedata) 
email_invite(ical, theuser) 

這引起了你看到的,因爲ics_formHttpResponse對象除外...的attach方法期望將文件的內容作爲字符串附加。

也許你應該有create_ics函數只是返回ical內容,並在單獨的視圖函數中返回一個HttpResponse。類似於:

def email_invite(filename, ics, user_assigned): 
    subject = 'You Have Been Assigned Schuduled Maintance/Calendar invite' 
    from_address = '[email protected]' 
    body = "This is a invite" 
    recip = [user_assigned] 
    email = EmailMessage(subject, body, from_address, recip) 
    email.attach(filename, ics, 'text/calendar') 
    email.send() 

def create_ics(data): 
    start1 = data['date_due'] 
    utc = vobject.icalendar.utc 
    start2 = datetime.datetime(start1.year, start1.month, start1.day, tzinfo = utc) 
    start3 = data['action'] 
    cal = vobject.iCalendar() 
    cal.add('method').value = 'PUBLISH' 
    vevent = cal.add('vevent') 
    vevent.add('dtstart').value = start2 
    vevent.add('dtend').value = start2 
    vevent.add('dtstamp').value = datetime.datetime.now() 
    vevent.add('summary').value = data['action'].name 
    return cal.serialize() 

def download_ics(request): 
    # do whatever you do to prepare thedata 
    ics = create_ics(thedata) 
    response = HttpResponse(ics, content_type='text/calendar') 
    response['Filename'] = 'filename.ics' 
    response['Content-Disposition'] = 'attachment; filename=filename.ics' 
    return response 

ical = create_ics(thedata) 
email_invite('filename.ics', ical, theuser) 
+0

Django EmailMessage()是否將所有附件計數爲HttpResponse對象?如何讓ics_form不是HttpResponse對象? – dman

+2

嘗試閱讀和理解代碼...他們的方式你有'create_ics'函數返回一個'HttpResponse'對象。 Django'EmailMessage' _does不希望_一個HttpResponse ...這是你有 – Anentropic

+1

我上面發佈的代碼是一個粗略的版本,你可能需要的問題...我已經改寫了'create_ics'函數來_not_返回一個'HttpResponse' – Anentropic

相關問題