【问题标题】:Using cookies with python to store searches使用 cookie 和 python 来存储搜索
【发布时间】:2010-10-29 13:10:26
【问题描述】:

嘿,我有一个用于搜索数据库的网页。我希望能够使用 python 实现 cookie 来存储用户搜索的内容,并在他们返回时为他们提供最近搜索的字段。有没有办法使用 python Cookie 库来实现这一点??

【问题讨论】:

  • 是的。您使用的是哪个网络框架?

标签: python cookies


【解决方案1】:

通常,我们会执行以下操作。

  1. 使用框架。

  2. 建立一个会话。理想情况下,要求提供某种用户名。如果您不想询问姓名或任何内容,可以尝试将浏览器的 IP 地址作为会话的密钥(这可能会变成一场噩梦,但您可以尝试一下。)

  3. 使用会话标识(用户名或 IP 地址),将搜索保存在服务器上的数据库中。

  4. 当此人再次登录时,从您的本地数据库中检索他们的查询信息。

故事的寓意。不要相信 cookie 除了会话标识之外有任何东西。即便如此,它也会被有意或无意地劫持。

  • 故意劫持是一个人冒充另一个人的方式。

  • 当多人共享同一个 IP 地址(因为他们共享同一台计算机)时,就会发生意外劫持。

【讨论】:

  • 同意,但您关于意外劫持的说明除外。共享相同 IP(即通过代理/NAT)的用户不会意外地互相劫持。 cookie 与每个 http 请求一起发送 - IP 地址成为问题的唯一方法是在处理响应的应用程序中。
【解决方案2】:

要使用 cookie,您可以使用框架使用的任何 cookie 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 是在python 2.6 中引入的,所以如果你在2.6 之前需要它,那么如果你没有2.6 可以使用simplejson 代替运行示例。

对代码中的 HTML 感到抱歉。理想情况下,这将在代码之外,在模板文件中,使用 jinja2 等模板引擎。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    相关资源
    最近更新 更多