背景

最近做博客想加入注册邀请码的功能 总结如下:

  • 注册码要在服务器端生成
  • 不能重复
  • 每次注册需要消耗掉一个邀请码

今天主要来看邀请码的生成代码

python 生成邀请码

import random
import string
s_set = string.ascii_letters + string.digits
raw_code_len = 8


class Code(models.Model):
    raw_code = fields.Char(string=u'原始码', index=True)

    @property
    def code(self):
        id_str = '{:0>8x}'.format(self.id)  # 转换为16进制,并用0填充至8位,故最大值为16**8 - 1
        return ''.join(''.join(i) for i in zip(id_str, self.raw_code))  # 在id的每个数字后填充随机字符,构成最终的码

    def check_code(self, code):
        id_str = code[::2]
        raw_code = code[1::2]
        try:
            int(id_str, 16)
        except ValueError, e:
            return False
        c = self.sudo().browse(int(id_str, 16))
        if c.exists() and c.raw_code == raw_code:
            return c
        else:
            return False

    @classmethod
    def generate_raw_code(cls):
        return ''.join(random.choice(s_set) for i in range(raw_code_len))

    def create(self, vals):
        c = super(Code, self).create(vals)
        c.raw_code = c.generate_raw_code()
        return c