gpt4 book ai didi

python - 使用 django 编码字符串作为 django 信号的发送者

转载 作者:行者123 更新时间:2023-12-01 06:12:44 24 4
gpt4 key购买 nike

我想使用字符串作为自定义 Django 信号的发送者,但遇到了一些与 Django 如何对模型字符串进行 unicode 编码相关的问题。这是一个有望有效说明问题的简短示例:

from django.dispatch import Signal
from django.db import models

example_signal = Signal(providing_args=["data"])

class Example(models.Model):
example_field = models.CharField(max_length=32)
def send_signal(self):
example_signal.send(sender=self.example_field, data=self) # (arbitrarily using self as the signal payload)

def example_handler(sender, data=None):
print "received data %s" % data

example_signal.connect(example_handler, sender=u'boogat')


... (after entering the django shell and importing the models)
>>> t = Example.objects.create(example_field='boogat')
>>> t.send_signal()
>>>

我浏览过 Django 的 dispatcher.py代码 - 在这种情况下,信号调度程序似乎使用 Python builtin id函数为用作发送者的任何对象生成唯一的 id。但是,我似乎无法弄清楚我需要做什么来以编程方式生成一个字符串,当发送到 id() 时,该字符串相当于 Django 的 unicode 模型字符串。我尝试过 strreprencode('UTF-8')django.util.encodings ,一切都无济于事。

此时我已经实现了一种解决方法,但我仍然想了解发生了什么...任何意见将不胜感激!

最佳答案

我遇到了类似的信号问题,并找到了我认为更好的解决方案。

如果可能的话,我绝对更喜欢使用 connectsender 参数来检查处理程序内部。

正如你所说的问题是对象id():具有相同内容的两个字符串(甚至不仅仅是unicode字符串!)可能有不同的对象id。解决方案是 intern()内置的,它将给定的字符串输入到 python 的内部标识符表中(这与 ruby​​ 的 Symbol 非常相似)。

如果您在 send()connect() 上使用 sender=intern(sender_string) ,事情应该按预期工作。

两个重要的警告:

  1. intern() 仅适用于 str,不适用于 unicode - 您必须将编码处理回 str,并且您必须对 send()connect() 执行相同的编码。
  2. 当垃圾收集器丢弃对驻留字符串的引用时,Python 的驻留字符串的内部记录可能会被丢弃,因此您必须确保保留它。

处理这两个问题的一个好方法是,您可能只对来自一些预定义字符串的信号感兴趣,因此只需将它们放在已经驻留的配置常量中即可。

例如:

user_did_something = Signal(providing_args=["data"])

class User(models.Model):
identifier = models.CharField(max_length=32)
def send_signal(self):
user_did_something.send(sender=intern(self.example_field.encode('utf8')), data=self)


ADMIN_USER = intern('admin')
BIG_ADMIN_USER = intern(u'größer admin'.encode('utf8'))


user_did_something.connect(admin_behavior, sender=ADMIN_USER)
user_did_something.connect(big_admin_behavior, sender=BIG_ADMIN_USER)

BIG_ADMIN_USER 如果没有解码回 unicode 字符串,将会打印出乱码,但我怀疑大多数此类标识符都是 ascii。

关于python - 使用 django 编码字符串作为 django 信号的发送者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4858661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com