在Python中使用Cookies存储搜索记录

0 投票
2 回答
1366 浏览
提问于 2025-04-15 11:53

你好,我有一个网页是用来搜索数据库的。我想用Python来实现 cookies,这样可以记录用户搜索过的内容,当他们再次访问时,可以显示最近搜索的记录。请问有没有办法使用Python的Cookie库来实现这个功能呢?

2 个回答

0

要使用 cookies,你可以根据你所用的框架选择相应的 cookies API。

这里有一个 CherryPy 的完整示例,展示了如何存储搜索记录并在之后提供这些记录。

import cherrypy
import json

class Root(object):
    def index(self):
        last_search = cherrypy.request.cookie.get('terms', None)
        if last_search: 
            last_search = ','.join(json.loads(last_search.value))
        else:
            last_search = 'None'
        return """
<html>
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title>Search</title>
</head>
<body>
    <h1>Search</h1>
    <form action="do_search" method="get">
        <p>Please type your search terms: 
        <input type="text" name="query" /></p>
        <p>Hint: Last 5 used terms: %s</p>
        <p><input type="submit" value="Search &rarr;" /></p>
    </form>
</body>
""" % (last_search,)
    index.exposed = True

    def do_search(self, query):
        results = ['some', 'results', 'here', 'simulating', 'a', 'search']
        print cherrypy.request.cookie
        last_search = cherrypy.request.cookie.get('terms', None)
        if last_search:
            last_search = json.loads(last_search.value)[-4:] # get last 4
        else:
            last_search = []
        last_search.append(query) # append new term
        cherrypy.response.cookie['terms'] = json.dumps(last_search)
        return """
<html>
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title>Search</title>
</head>
<body>
    <h1>Search Results for %r</h1>
    <p>%s</p>
    <p><a href="%s">click here to search again</a>
    </p>
</body>
""" % (query, ', '.join(results), cherrypy.url('/'))
    do_search.exposed = True

application = cherrypy.tree.mount(Root(), '/')

if __name__ == '__main__':
    cherrypy.quickstart()

注意事项:

这个示例使用了 json 来把列表转换成字符串,并存储在 cookie 中。Python 的 json 是在 2.6 版本中引入的,所以如果你使用的是 2.6 之前的版本,可以用 simplejson 来运行这个示例。

抱歉代码中有 HTML 部分。理想情况下,这些内容应该放在代码之外,使用像 jinja2 这样的模板引擎放在模板文件中。

1

通常,我们会这样做:

  1. 使用一个框架。

  2. 建立一个会话。理想情况下,询问用户的某种用户名。如果你不想问名字或者其他信息,可以尝试用浏览器的IP地址作为会话的标识(这可能会变得很麻烦,但你可以试试)。

  3. 利用会话标识(用户名或IP地址),把搜索记录保存在你服务器上的数据库里。

  4. 当这个人再次登录时,从你的本地数据库中获取他们的查询信息。

这个故事的教训是:不要指望cookie里有任何东西,除了会话标识。而且即使有,也可能会被恶意或意外地盗用。

  • 恶意盗用是指一个人假装成另一个人。

  • 意外盗用发生在多个用户共享同一个IP地址时(因为他们使用同一台电脑)。

撰写回答