- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用字符串作为自定义 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 模型字符串。我尝试过 str
、repr
、encode('UTF-8')
、django.util.encodings
,一切都无济于事。
此时我已经实现了一种解决方法,但我仍然想了解发生了什么...任何意见将不胜感激!
最佳答案
我遇到了类似的信号问题,并找到了我认为更好的解决方案。
如果可能的话,我绝对更喜欢使用 connect
的 sender
参数来检查处理程序内部。
正如你所说的问题是对象id()
:具有相同内容的两个字符串(甚至不仅仅是unicode字符串!)可能有不同的对象id。解决方案是 intern()
内置的,它将给定的字符串输入到 python 的内部标识符表中(这与 ruby 的 Symbol
非常相似)。
如果您在 send()
和 connect()
上使用 sender=intern(sender_string)
,事情应该按预期工作。
两个重要的警告:
intern()
仅适用于 str
,不适用于 unicode
- 您必须将编码处理回 str
,并且您必须对 send()
和 connect()
执行相同的编码。处理这两个问题的一个好方法是,您可能只对来自一些预定义字符串的信号感兴趣,因此只需将它们放在已经驻留的配置常量中即可。
例如:
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/
我是iOS的新手,我想更新ViewDidLoad()函数中的文本。 这是我的按钮功能,单击按钮时会发生动画,并将值“1”添加到“resultText.text” - (IBAction)oneB
做了什么 我有一个名为 MyUser 的自定义 User 模型,如 full example for an custom user model 中所述。在文档和一个所谓的 UserProfile 上,
我有一个 NSMenu(应用程序停靠菜单),其中有几个具有相同操作的项目。 如何找出发件人项目(触发操作的项目)在其容器菜单中的索引? (我对标题不感兴趣,因为它可能是重复的) 这就是我尝试过的,但它
我正在开发一个带有 NSTableView 的 macOS 应用程序,我希望能够在用户选择一行时使用 Cmd+C 快捷键复制单元格的内容。我已经实现了该方法 copy(sender: AnyObjec
我一直在使用 MVVM 的 RelayCommand 成功地将操作绑定(bind)到 XAML,但是我的 ItemsControl 有一个小问题。
我的 C# Winform 面板中有一堆文本框。每行文本框的命名如下: tb1 tbNickName1 comboBox1 tb2 tbNickName2 comboBox2 tb3 tbNickNa
我有一个IBAction,例如: - (IBAction)thisThing:(id)sender { [self doSomething]; } 我想这样做(手动调用 IBAction): [s
我知道如何通过 zeromq 将字符串消息从 C++ 发送到 Python。 这是我知道的发送字符串消息的代码: C++ 发件人代码: void *context = zmq_ctx_new(); v
我是一名优秀的程序员,十分优秀!