2011-02-23 43 views
1

我試圖動態生成使用Max M的icalendar python模塊和谷歌的應用引擎iCal輸出。但是,當我從webapp.RequestHandler的輸出中省略了<html>鍋爐板上的頁眉和頁腳標記時,它看起來像HTTP 200響應被添加到文件的頂部。從谷歌的應用引擎生成非HTML輸出

當我註冊驗證碼:

class Calendar(webapp.RequestHandler): 
    def get(self): 
     self.response.out.write('BEGIN:VCALENDAR\n') 
     [...] 

webapp.WSGIApplication,響應的樣子:

Status: 200 OK 
Content-Type: text/html; charset=utf-8 
Cache-Control: no-cache 
Expires: Fri, 01 Jan 1990 00:00:00 GMT 
Content-Length: 11133 

BEGIN:VCALENDAR 
[...] 

如何省略<html>標籤沒有得到HTTP 200響應splatted在頁面的頂部?

+0

嗯,它看起來像我需要看看http://docs.djangoproject.com/en/dev/ref/request-response/#telling-the-browser-to-treat-the-response-as- a-file-attachment – 2011-02-23 22:03:21

回答

3

Web應用程序和App Engine不關心你返回的內容類型,所以問題與標籤無關(或缺乏)。您的代碼中可能存在print語句,這會導致頭文件作爲響應主體的一部分發送。您絕對不應該在WSGI應用中使用print - 始終使用self.response.out.write與您粘貼的代碼片段相同。

0

這似乎是輸出標準的HTTP響應頭。嘗試添加「內容處置:附件;文件名='%s'」%filename HTTP頭到您的響應以獲取所需的文件下載。

+0

不幸的是,這樣做會插入'Content-Disposition:attachment;在HTTP 200響應和日曆之間的文件名='cal.ical''。它不會覈實HTTP 200文本。 – 2011-02-23 19:27:46

1

不知道這是否是真正的問題還是沒有,但你應該設置內容類型,表明這是日曆數據,而不是HTML:

Content-Type: text/html; charset=utf-8

應該

Content-Type: text/calendar;

2

您不能,「狀態:200 OK .....」是HTTP頭,它將在Web服務器的每個請求中輸出。任何Web服務器都會做同樣的事情。

您的客戶需要閱讀http響應的正文

+0

[我是一個網頁noob,但]我認爲,即使HTTP頭被髮送到客戶端,它會被瀏覽器攔截,其餘的文本將傳遞給瀏覽器。例如,如果我在此頁面上執行「查看源代碼」,則看不到HTTP標頭響應。它以'<!DOCTYPE ...'開頭,所以或許我應該問,如何在沒有HTTP標頭的情況下生成動態生成的*文件*。 – 2011-02-23 21:50:10

+0

正如Nick在他的回答中所說的,如果你看到頭文件數據在你的瀏覽器中輸出的話,你可能在你的代碼中有一個打印語句。如果刪除所有打印語句,則不會在瀏覽器中輸出標題。 – dplouffe 2011-02-24 04:01:06

0

別的東西來考慮:

如果從另一個文件中導入代碼,而其他文件是一個Web應用程序,你需要確保它只能運行一個Web應用程序,如果它是主

Anotherwords - 從這個

application = webapp.WSGIApplication(
           [ 
            ('/locate', Request), 
            ], 
           debug=False) 

util.run_wsgi_app(application) 

回到這個

application = webapp.WSGIApplication(
           [ 
            ('/locate', Request), 
            ], 
           debug=False) 

def main(): 
    util.run_wsgi_app(application) 

if __name__ == "__main__": 
    main() 

這個問題在幾個小時裏讓我非常痛苦,這是我能找到的接近它的唯一職位之一。我希望這可以幫助其他人解決和我一樣的問題!