2011-08-22 16 views
6

Kullanıcının tarayıcısından gelen tanımlama bilgilerini yüklemek için cookie.SimpleCookie sınıfını dahili olarak kullanan web.py kullanıyorum.CookieError: Geçersiz anahtar değeri

Bazen, ben gibi istisnalar olsun: kusurlu karakteri görünüyor

... 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/Cookie.py", line 455, in set 
    raise CookieError("Illegal key value: %s" % key) 
CookieError: Illegal key value: SinaRot/g/news.sina.com.cn 

eğik çizgi (/), olmak benim RFC 2109 (çerezler) okunması ve RFC 2068 (HTTP 1.1) olmalıdır göre, hangi izin verilmedi, bu yüzden sorun yok.

Bu çerezi ayarlamam ve etki alanım için neden veya nasıl ayarlandığından emin değilim (bir vekil, belki?), Ancak bu alakasız; Daha büyük sorun, bu çerezle karşılaştığında simplecookie'nin zor bir şekilde başarısız olması ve kullanıcıya bir hata döndürmesidir.

Yani, sorum şu: SimpleCookie numaralı soruyu geçersiz olan çerezleri yok saymak, ancak geri kalanını iade etmenin bir yolu var mı? Bunu yapmak için dokümanlarda açık bir şey bulamadım.

+0

CookieError istisnasını yakalayamıyor musunuz? – GWW

+0

Yapabilirim (ve yapmalıyım), ancak bu bir istisna olduğundan, oturum çerezimiz de dahil olmak üzere diğer çerezlere erişemiyorum. Ve sonraki istekler yine de hataya neden olan aynı çerezi içerecektir. Dahası, bir vekilden geliyorsa, proxy'nin bir dahaki sefere yeniden ayarlayacağından, onu unsetmeye çalışmak muhtemelen boşuna olacaktır. – dcrosta

cevap

0

Webpy uygulamam, Firefox tarayıcısında Google Analytics tarafından belirlenen CookieError: Illegal key value:)|utmcmd deneyimini yaşattı. Düzeltmek için doğru değeri ayarlamaya çalışırken yönlendirmeyi yayınlarım.

def myinternalerror(): 
    try: 
     web.cookies() 
    except CookieError: 
     if not "cookie_err" in web.input(): 
      web.setcookie("__utmz", None, domain=web.ctx.host) 
      raise web.seeother(web.changequery(cookie_err=1)) 
    return web.internalerror(render.site.e500()) 

if not web.config.debug: 
    app.internalerror = myinternalerror 
+0

Ne yazık ki bu benim için işe yaramaz çünkü adı yasadışı olan bir çerez ayarlamaya çalışmak çerez hatasını atmaya devam edecektir. Bu da, çerezi silmez ve sorun bir dahaki sefere geri döner. – dcrosta

+0

Tanımlama bilgisinin adı veya değeri geçersiz karakterler içeriyor mu? Benim durumumda bu değerdir, bu yüzden doğru değerle sıfırladım ve aynı URL'ye yeniden yönlendirme yapıyorum - böylece yanlış çerez düzeltildi. –

+0

İleri eğik çizgileri yasa dışı olduğunu düşünüyorum. Her tarayıcıyı bu çerezi iyi bir şekilde ekledim, ancak "Çerez" modülü tarayıcılardan daha akılda kalıcı görünüyor. – dcrosta

3

Bu benim için çalışır.

def get_cookies(): 
    import Cookie 
    ans = Cookie.SimpleCookie() 
    for bit in os.environ.get('HTTP_COOKIE', '').split('; '): 
     try: 
      ans.load(bit) 
     except Cookie.CookieError: 
      pass 
    return ans