6

Google App Engine でアプリを開発していますが、問題が発生しました。現在のユーザーを区別できるように、各ユーザー セッションに Cookie を追加したいと考えています。それらをすべて匿名にしたいので、ログインは必要ありません。そのため、Cookie 用に次のコードを実装しました。

def clear_cookie(self,name,path="/",domain=None):
    """Deletes the cookie with the given name."""
    expires = datetime.datetime.utcnow() - datetime.timedelta(days=365)
    self.set_cookie(name,value="",path=path,expires=expires,
                    domain=domain)    

def clear_all_cookies(self):
    """Deletes all the cookies the user sent with this request."""
    for name in self.cookies.iterkeys():
        self.clear_cookie(name)            

def get_cookie(self,name,default=None):
    """Gets the value of the cookie with the given name,else default."""
    if name in self.request.cookies:
        return self.request.cookies[name]
    return default

def set_cookie(self,name,value,domain=None,expires=None,path="/",expires_days=None):
    """Sets the given cookie name/value with the given options."""

    name = _utf8(name)
    value = _utf8(value)
    if re.search(r"[\x00-\x20]",name + value): # Don't let us accidentally inject bad stuff
        raise ValueError("Invalid cookie %r:%r" % (name,value))
    new_cookie = Cookie.BaseCookie()
    new_cookie[name] = value
    if domain:
        new_cookie[name]["domain"] = domain
    if expires_days is not None and not expires:
        expires = datetime.datetime.utcnow() + datetime.timedelta(days=expires_days)
    if expires:
        timestamp = calendar.timegm(expires.utctimetuple())
        new_cookie[name]["expires"] = email.utils.formatdate(timestamp,localtime=False,usegmt=True)
    if path:
        new_cookie[name]["path"] = path
    for morsel in new_cookie.values():
        self.response.headers.add_header('Set-Cookie',morsel.OutputString(None))

上記のコードをテストするために、次のコードを使用しました。

class HomeHandler(webapp.RequestHandler):
    def get(self):
        self.set_cookie(name="MyCookie",value="NewValue",expires_days=10)
        value1 = str(self.get_cookie('MyCookie'))    
        print value1

これを実行すると、HTML ファイルのヘッダーは次のようになります。

なし ステータス: 200 OK Content-Type: text/html; charset=utf-8 Cache-Control: no-cache Set-Cookie: MyCookie=NewValue; 2012 年 12 月 6 日木曜日 17:55:41 GMT; Path=/ Content-Length: 1199

上記の「なし」は、コードの「value1」を指します。

ヘッダーに追加されているにもかかわらず、Cookie の値が「None」になっている理由を教えてください。

よろしくお願いいたします。

4

1 に答える 1

5

を呼び出すとset_cookie()、準備中の応答に Cookie が設定されます (つまり、関数が返された後、応答が送信されたときに Cookie が設定されます)。への後続の呼び出しget_cookie()は、現在のリクエストのヘッダーから読み取ります。現在のリクエストには、テスト対象の Cookie セットが含まれていないため、読み込まれません。ただし、このページに再度アクセスすると、Cookie がリクエストの一部になるため、別の結果が得られるはずです。

于 2012-11-26T18:35:39.033 に答える