【问题标题】:Django package to generate random alphanumeric stringDjango包生成随机字母数字字符串
【发布时间】:2014-09-19 23:49:33
【问题描述】:

我正在构建一个具有分离的前端(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 中,或使用可用的 uuid 字段之一(或等待 django 1.8)。

标签: python django


【解决方案1】:

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 模块 - 使用 uuid1 或 uuid4 生成唯一的 UUID,例如

    >>> import uuid
    >>> my_uuid = uuid.uuid4()
    >>> my_uuid
    UUID('8e6eee95-eae1-4fb4-a436-27f68dbcb6d7')
    >>> str(my_uuid)
    '8e6eee95-eae1-4fb4-a436-27f68dbcb6d7'
    
  2. 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 hmac.compare_digest
  • Python 3 删除了 string.uppercase 和 string.lowercase 所以你需要使用 string.ascii_uppercase 和 string.ascii_lowercase 来代替
  • @KrystianC:感谢您注意到这一点。我已经更新了使用string.ascii_letters 的答案,它适用于两个版本的 Python。
  • 呃,关于 random 模块,来自文档:“警告:此模块的伪随机生成器不应用于安全目的。使用 os.urandom() 或 SystemRandom如果您需要加密安全的伪随机数生成器。"
【解决方案2】:

从 python 3.6 开始,有一个secret module,它具有生成安全随机 url 的特定方法。它是token_urlsafe 方法。

【讨论】:

    【解决方案3】:

    您可以使用nanoid:

    https://github.com/puyuan/py-nanoid

    from nanoid import generate
    
    generate() # => NDzkGoTCdRcaRyt7GOepg
    

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 2015-11-09
      • 2021-04-05
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      相关资源
      最近更新 更多