生成随机字母数字字符串的Django包

67
我正在构建一个应用程序,它具有分离的前端(Angular或其他JS库)和后端(Django)。为了确保向服务器发送的请求的安全性,我想附加一个url参数,例如server/someurl?unique_id=Something-unique
我将这个唯一代码存储在机器的localStorage中一段时间。但是,我希望使用某种在服务器端设置此代码的函数,该函数不仅会生成此随机字母数字文本,还会根据传入的请求进行验证。
例如:
当用户打开应用程序时,它将发送一个server/setCode的请求,该请求将响应此随机生成的字符串,我将使用JS将其存储到Local Storage中。
对于一个出站请求,例如server/getdata?someparameter=some_data&unique_id=string_from_local_storage,服务器可以根据生成函数验证并仅在通过验证后处理剩余的url。
是否有一个包或模块可以帮助我实现生成和验证?我希望我能够传达我的意思,因为我找不到解决方案,除了编写自己的生成和测试函数。

如果你只需要一个随机字符串,你可以使用stdlib中的uuid包。然后你可以将该值存储在足够长的CharField中,或者使用其中一个可用的uuidfields(或等待django 1.8)。 - Matthew Schinckel
3个回答

196

Django提供了get_random_string()函数,可满足生成字母数字字符串的需求。由于它在django.utils.crypto模块中,所以您不需要任何额外的包。

>>> from django.utils.crypto import get_random_string
>>> unique_id = get_random_string(length=32)
>>> unique_id
u'rRXVe68NO7m3mHoBS488KdHaqQPD6Ofv'

您还可以使用allowed_chars来改变字符集:

>>> short_genome = get_random_string(length=32, allowed_chars='ACTG')
>>> short_genome
u'CCCAAAAGTACGTCCGGCATTTGTCCACCCCT'

除了使用字母数字组合生成唯一ID的方法之外,还有许多其他方法:

  1. uuid模块 - 使用uuid1uuid4生成唯一的UUID,例如:

>>> import uuid
>>> my_uuid = uuid.uuid4()
>>> my_uuid
UUID('8e6eee95-eae1-4fb4-a436-27f68dbcb6d7')
>>> str(my_uuid)
'8e6eee95-eae1-4fb4-a436-27f68dbcb6d7'
  • 随机数模块:random

  • >>> import random
    >>> import string
    >>> allowed_chars = ''.join((string.ascii_letters, string.digits))
    >>> unique_id = ''.join(random.choice(allowed_chars) for _ in range(32))
    >>> unique_id
    '121CyaSHHzX8cqbgLnIg1C5qNrnv21uo'
    

    或者,如果您不在意字母表:

    >>> unique_id = '%32x' % random.getrandbits(16*8)
    >>> unique_id
    '5133d2d79ce518113474d8e9f3702638'
    

    哦,哇!谢谢!我怎样才能对传入请求的这个字符串进行验证? - Newtt
    @Newtt hmac.compare_digest - Aaron Zinman
    Python 3 移除了 string.uppercase 和 string.lowercase,因此您需要使用 string.ascii_uppercase 和 string.ascii_lowercase。 - KrystianC
    1
    @KrystianC:感谢您注意到这一点。我已经更新了答案,使用string.ascii_letters适用于Python的所有版本。 - mhawke
    1
    关于random模块,从文档中可以看到:“警告:本模块的伪随机生成器不应用于安全目的。如果需要加密安全的伪随机数生成器,请使用os.urandom()或SystemRandom。” - mlissner
    @mlissner:这取决于应用程序,但OP提到使用随机字符串进行安全目的,所以您的评论是有效的。您可以像Django的get_random_string()一样使用random.SystemRandom()来使用操作系统提供的随机源。只需在调用random.choice()之前添加random = random.SystemRandom()即可。 - mhawke

    8
    自 Python 3.6 版本开始,有一个名为“secret”的模块,其中包含一种特定的方法用于生成安全随机 URL。该方法是token_urlsafe 方法。

    0

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接