2

我使用i18n進行本地化,就像django使用自定義請求處理程序在不同語言之間切換並升級到python 2.7一樣,由於它使用的是來自django.utils.translation的cookie,因此存在麻煩。在最壞的情況下,我必須從我們的自定義請求處理程序轉移到其他可以爲我們切換語言的系統。你有什麼想法如何解決這個錯誤? django語言cookie仍然像以前一樣可用嗎?我的其他本地化選擇不依賴於django嗎?通天塔?我仍然可以使用舊的.po和.mo文件嗎?我應該使用其他一些Cookie類嗎?我的自定義請求處理程序類:我可以使用GAE + python 2.7 + django.utils.translation嗎?

from django.utils import translation 

class I18NHandler(webapp.RequestHandler): 

    def initialize(self, request, response): 
     webapp.RequestHandler.initialize(self, request, response) 
     self.request.COOKIES = Cookies(self) 
     self.request.META = os.environ 
     self.reset_language() 

    def reset_language(self): 

     # Decide the language from Cookies/Headers 

     language = translation.get_language_from_request(self.request) 
     translation.activate(language) 
     self.request.LANGUAGE_CODE = translation.get_language() 

     # Set headers in response 

     self.response.headers['Content-Language'] = \ 
      translation.get_language() 


class Cookies(UserDict.DictMixin): 

    def __init__(self, handler, **policy): 
     self.response = handler.response 
     self._in = handler.request.cookies 
     self.policy = policy 
     if 'secure' not in policy \ 
      and handler.request.environ.get('HTTPS', '').lower() \ 
      in ['on', 'true']: 
      policy['secure'] = True 
     self._out = {} 

    def __getitem__(self, key): 
     if key in self._out: 
      return self._out[key] 
     if key in self._in: 
      return self._in[key] 
     raise KeyError(key) 

    def __setitem__(self, key, item): 
     self._out[key] = item 
     self.set_cookie(key, item, **self.policy) 

    def __contains__(self, key): 
     return key in self._in or key in self._out 

    def keys(self): 
     return self._in.keys() + self._out.keys() 

    def __delitem__(self, key): 
     if key in self._out: 
      del self._out[key] 
      self.unset_cookie(key) 
     if key in self._in: 
      del self._in[key] 
      p = {} 
      if 'path' in self.policy: 
       p['path'] = self.policy['path'] 
      if 'domain' in self.policy: 
       p['domain'] = self.policy['domain'] 
      self.delete_cookie(key, **p) 

    # begin WebOb functions 

    def set_cookie(
     self, 
     key, 
     value='', 
     max_age=None, 
     path='/', 
     domain=None, 
     secure=None, 
     httponly=False, 
     version=None, 
     comment=None, 
     ): 
     """ 
     Set (add) a cookie for the response 
     """ 

     cookies = BaseCookie() 
     cookies[key] = value 
     for (var_name, var_value) in [ 
      ('max-age', max_age), 
      ('path', path), 
      ('domain', domain), 
      ('secure', secure), 
      ('HttpOnly', httponly), 
      ('version', version), 
      ('comment', comment), 
      ]: 
      if var_value is not None and var_value is not False: 
       cookies[key][var_name] = str(var_value) 
      if max_age is not None: 
       cookies[key]['expires'] = max_age 
     header_value = cookies[key].output(header='').lstrip() 
     self.response.headers._headers.append(('Set-Cookie', 
       header_value)) 

    def delete_cookie(
     self, 
     key, 
     path='/', 
     domain=None, 
     ): 
     """ 
     Delete a cookie from the client. Note that path and domain must match 
     how the cookie was originally set. 
     This sets the cookie to the empty string, and max_age=0 so 
     that it should expire immediately. 
     """ 

     self.set_cookie(key, '', path=path, domain=domain, max_age=0) 

    def unset_cookie(self, key): 
     """ 
     Unset a cookie with the given name (remove it from the 
     response). If there are multiple cookies (e.g., two cookies 
     with the same name and different paths or domains), all such 
     cookies will be deleted. 
     """ 

     existing = self.response.headers.get_all('Set-Cookie') 
     if not existing: 
      raise KeyError('No cookies at all have been set') 
     del self.response.headers['Set-Cookie'] 
     found = False 
     for header in existing: 
      cookies = BaseCookie() 
      cookies.load(header) 
      if key in cookies: 
       found = True 
       del cookies[key] 
      header = cookies.output(header='').lstrip() 
      if header: 
       self.response.headers.add('Set-Cookie', header) 
     if not found: 
      raise KeyError('No cookie has been set with the name %r' 
          % key) 

錯誤 跟蹤:

Traceback (most recent call last): 
    File "/base/data/home/apps/s~montaoproject/main.354356023835363013/webapp2.py", line 545, in dispatch 
    return method(*args, **kwargs) 
    File "/base/data/home/apps/s~montaoproject/main.354356023835363013/i18n.py", line 781, in get 
    cookie_django_language 
    File "/base/data/home/apps/s~montaoproject/main.354356023835363013/util.py", line 65, in __setitem__ 
    self.set_cookie(key, item, **self.policy) 
    File "/base/data/home/apps/s~montaoproject/main.354356023835363013/util.py", line 120, in set_cookie 
    self.response.headers._headers.append(('Set-Cookie', 
AttributeError: ResponseHeaders instance has no attribute '_headers' 

先感謝您的任何建議。

回答

3

我相信這是因爲WebOb已經升級了新的Python 2.7運行時。

你應該使用:

res.headers.add('Set-Cookie', header_value) 

如的WebOb documentation

注意,web應用也被換成了webapp2指出。

+0

謝謝我會遵循這些指示。 –

相關問題