2010-07-28 60 views
0

我正在使用Web服務後端爲Django提供身份驗證,並且get_user方法必須保留由Web服務提供的cookie以便與會話關聯。現在,我只需撥打urllib2.urlopen(myTargetService)即可撥打遠程電話,但這並不會傳遞當前會話的Cookie。如何在Django中創建會話本地的Cookie感知HTTP客戶端?

我創建了一個會話訪問中間件存儲在設置會話:

class SessionAccessMiddleware: 

    def process_request(self, request): 
    settings.current_session = request.session 

所以,我可以在get_request和post_request訪問請求會話,但我不知道如何有記憶的urllib2我的cookies以會話特定的方式。

我該怎麼做?

回答

0

這裏:http://docs.python.org/library/cookielib.html#examples是正在做的事情的例子,你試圖用urllib2cookielib。因此根據文檔,您需要創建cookielib.CookieJar,使用正確的數據(來自會話)設置cookie,使用您的CookieJar構建一個opener並使用它獲取yourTargetService

如果你的中間件代碼中的settings意味着from django.conf import settings這不是個好主意。查看http://github.com/svetlyak40wt/django-globals/,您可以安全地存儲請求範圍的數據,以便在無法訪問對象的地方訪問。此外,編寫自定義身份驗證後端並與django.contrib.auth一起使用它可能是個好主意 - 而不是從頭開始構建自己的身份驗證系統 - 此處涵蓋的內容如下:http://docs.djangoproject.com/en/dev/topics/auth/#writing-an-authentication-backend

+0

實際上,我寫了一個使用這些的自定義auth後端,所以我們對此很滿意。 django-globals似乎沒有增加太多的黨;我會考慮它,如果設置給我麻煩。 我不完全理解的是開瓶器;我可以保留那些人多久?例如,我可以創建一個並在會話中存儲_that_嗎? – 2010-07-29 03:25:40

+0

我剛剛檢查 - 看來你不能,對不起。 opener和cookiejar對象不可pickleable('UnpickleableError:不能pickle 對象'),所以它們不能存儲在會話中。但是,我可以醃製Cookie,因爲每次創建開罐器時都可以將其存儲並添加到CookieJar(使用'set_cookie')。 – cji 2010-07-29 05:37:14