我正在尝试为我的api创建一个api键的实现,这样外部人员就可以请求一个api键,并且可以访问我的资源。现在我正在使用django管理来显示和创建这些api键
class External(models.Model):
id = models.UUIDField(primary_key=True, default=uuid4)
name = models.CharField(max_length=255, null=False, blank=False)
is_enabled = models.BooleanField(default=True)
revenue_percentage = models.FloatField()
created = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.name
class ApiToken(models.Model):
id = models.UUIDField(primary_key=True, default=uuid4)
name = models.CharField(max_length=255, null=False, blank=False)
external = models.ForeignKey(External, on_delete=models.CASCADE)
token_hash = models.CharField(max_length=128)
token = models.CharField(max_length=128)
created = models.DateTimeField(default=timezone.now)
def save(self, *args,**kwargs):
if self._state.adding: # In order to know if it's being created
api_key = get_random_string(length=32)
concat = f'{self.id}:{api_key}'
key_bytes = concat.encode('ascii')
base = base64.b64encode(key_bytes)
token = base.decode('ascii')
self.token = token
self.token_hash = make_password(api_key)
super(ApiToken, self).save(*args,**kwargs)
这是管理员
class ApiTokenAdmin(admin.TabularInline):
model = ApiToken
extra = 0
fields = ('id', 'name', 'token', 'created')
readonly_fields = ('created', 'token')
exclude = ('id',)
class ExternalAdmin(admin.ModelAdmin):
search_fields = ('id', 'name',)
list_display = ('id', 'name', 'revenue_percentage', 'is_enabled',)
list_filter = ('is_enabled',)
fields = ('id', 'name', 'is_enabled', 'revenue_percentage')
readonly_fields = ('id', 'created')
inlines = [ApiTokenAdmin]
admin.site.register(External, ExternalAdmin)
如你所见,我正在存储我想要共享的令牌
self.token = token
问题是我不想把这个令牌存储在数据库中,我只想在创建一个新的api密钥之后计算并显示一次,然后管理员可以复制并与外部共享它。
有什么办法吗,我试着推翻 save_model
以及 save_formset
但是它们只是不返回新对象,所以我不能在 save
方法被调用。
1条答案
按热度按时间sqxo8psd1#
我想你可以使用django信号在对象创建后立即从数据库中删除值。我猜pre\u save或post\u save可以做到这一点