2017-08-08 60 views
0

我正在開發一個web工具,並且在設置cookie時遇到了一些問題。我曾經在20年前在Perl中做過這件事,並且對於2017年看起來似乎沒有一種清晰而乾淨的方式來處理cookie中的cookie!我認爲會一天比一天簡單快捷。我已經嘗試過使用請求模塊手動設置cookie,以及我在堆棧溢出中找到的大量部分代碼示例。無論我看,文檔都很差,沒有完整的工作示例,或者答案很老。在Python cgi中設置瀏覽器cookie的問題

我正在用Python創建一個cgi腳本。在腳本的登錄頁面上,我有print "Content-type: text/html\r\n"以便在網頁上顯示文本框和選擇菜單。當用戶點擊提交時,如果出現錯誤,我有一個驗證步驟,需要在頁面上打印某些內容。如果沒有錯誤,我需要腳本來加載一個新頁面並設置一個cookie。

這裏是我使用的設置我的cookies代碼:

#!C:\Python27\python.exe -u 

    import Cookie 
    c = Cookie.SimpleCookie() 
    c['id'] = '12345' 
    c['score'] = '8.76' 
    c['page'] = '3' 
    print "Content-type: text/html %s;\r\n" % (c) 
    print "" 
    print c 

的問題是:

  1. 只有兩個上述三個C值的存儲餅乾當我檢查「在運行上述代碼後,在Firefox中顯示「Cookies」。
  2. 由於使用打印語句設置cookie並再次發送Content-type,因此我在腳本中登錄的頁面在頂部顯示Content-type: text/html Set-Cookie: score=8.76 Set-Cookie: id=12345 Set-Cookie: page=3 ;。發生這種情況時,我的瀏覽器中不存儲cookie。只有在標題中不是Content-type: text/html時纔會存儲Cookie。

有沒有辦法從我的腳本里面設置cookies而不打印Content-type: text/html的另一個副本到瀏覽器?

我還需要一種在用戶在工具中四處移動時可以無縫更新cookie的方式。例如,當他們點擊下一頁時,cookie會更新到下一個頁碼。

我在Windows 10上使用Python 2.7,並使用Firefox作爲我的測試瀏覽器。

回答

0

我設法解決了這兩個問題。

問題#1:上面顯示的三個c值中只有兩個存儲爲cookie。

解決方案:我設置了我的cookie,以便在一個cookie中傳遞三個值。例如:

import Cookie 
c = Cookie.SimpleCookie() 
c['id'] = '12345|score=8.76|page=3' 

# Output the HTTP message containing the cookie BEFORE Content-type text/html! 
print c 
print "Content-type: text/html\r\n" 

問題#2:額外Content-type: text/html頭中的web頁面輸出中:

解決方法:每次服務器響應來自瀏覽器的GET或POST事件,設置cookie必須在http響應中發生的第一件事。我必須重新排序腳本中使用的邏輯,以確保始終如此。對於每個http響應,通過Content-type: text/html都不會將任何內容打印到瀏覽器,直到cookie被照顧之後。