django - 如何在Django中生成临时URL

标签 django url

想知道是否有很好的方法可以生成在X天内到期的临时URL。希望通过电子邮件发送一个URL,收件人可以单击该URL以访问站点的一部分,然后在一段时间后无法通过该URL访问该站点的一部分。不知道如何使用Django,Python或其他方式执行此操作。

最佳答案

如果您不希望获得很高的响应率,则应尝试将所有数据存储在URL本身中。这样,您无需在数据库中存储任何内容,并且将与响应(而不是发送的电子邮件)成比例地存储数据。

已更新:假设您有两个对于每个用户都是唯一的字符串。您可以打包它们并使用保护性哈希将它们解包,如下所示:

import hashlib, zlib
import cPickle as pickle
import urllib

my_secret = "michnorts"

def encode_data(data):
    """Turn `data` into a hash and an encoded string, suitable for use with `decode_data`."""
    text = zlib.compress(pickle.dumps(data, 0)).encode('base64').replace('\n', '')
    m = hashlib.md5(my_secret + text).hexdigest()[:12]
    return m, text

def decode_data(hash, enc):
    """The inverse of `encode_data`."""
    text = urllib.unquote(enc)
    m = hashlib.md5(my_secret + text).hexdigest()[:12]
    if m != hash:
        raise Exception("Bad hash!")
    data = pickle.loads(zlib.decompress(text.decode('base64')))
    return data

hash, enc = encode_data(['Hello', 'Goodbye'])
print hash, enc
print decode_data(hash, enc)

这将产生:
849e77ae1b3c eJzTyCkw5ApW90jNyclX5yow4koMVnfPz09JqkwFco25EvUAqXwJnA==
['Hello', 'Goodbye']

在您的电子邮件中,包含一个既具有哈希值又具有enc值的URL(正确引用了URL)。在您的 View 函数中,将这两个值与解码_数据一起使用以检索原始数据。

zlib.compress可能没有那么大的帮助,根据您的数据,您可以尝试查看哪种方法最适合您。

关于django - 如何在Django中生成临时URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1360101/

相关文章:

python - 升级到 1.10 或 1.11 后,Django 命名 URL 参数不再起作用

django - django-elasticsearch-dsl建议无效

python - 在 Django 的模板加载器中预处理 SHPAML?

php - 防止将链接添加到另一个链接

html - 为什么这个相对 URL 有效?

html - URL 哈希格式,什么是允许的,什么是不允许的?

django - 使用 self.add_error() 和引发 ValidationError() 之间有什么区别?

python - 在 Django 的父模型中更新 auto_now DateTimeField

vb.net - 将 URL 拆分为不同的部分 VB.Net

url - 创建 AS3 URL 链接按钮。出现错误 : 1046