小编Car*_*l G的帖子

模型方法的装饰器Django信号?

我正在尝试做这些提议的信号装饰器.除了有一个装饰器将装饰方法连接到一个信号(信号的发送者作为装饰器的参数),我想在类方法上使用装饰器.

我想像这样使用装饰器:

class ModelA(Model):

    @connect.post_save(ModelB)
    @classmethod
    def observe_model_b_saved(cls, sender, instance, created, **kwargs):
        # do some stuff
        pass
Run Code Online (Sandbox Code Playgroud)

装饰者是:

from django.db.models import signals
def post_save(sender):
    def decorator(view):
        signals.post_save.connect(sender=sender, receiver=view)
        return view
    return decorator
Run Code Online (Sandbox Code Playgroud)

我这样做的错误是:

File "/Library/Python/2.6/site-packages//lib/python2.6/site-packages/django/dispatch/dispatcher.py", line 78, in connect
AssertionError: Signal receivers must be callable.

我想问题是@classmethod返回一个不可调用的类方法对象.我真的不明白它是如何classmethod工作的,但我从这个参考页面推测,类方法对象在从类中访问之前不会被转换为可调用的,例如ModelA.observe_model_b_saved.有没有什么办法我可以(1)将我的方法定义为模型上的类或实例方法,以及(2)直接在方法定义上使用装饰器将其连接到信号?谢谢!

python django decorator django-signals django-models

8
推荐指数
1
解决办法
4598
查看次数

为什么我的 Lambda 函数连接到 SES VPC 端点时超时?

自 2020 年 4 月起,AWS 支持 SES(简单电子邮件服务)的 VPC 终端节点。尽管如此,我还是无法使用该终端节点让 Lambda 与 SES 进行通信。它总是超时。也许这是因为 SES VPC Endpoints 仅支持 VPC 中的 EC2 实例,而不支持 Lambdas?

我使用 Terraform 描述了我的基础设施,如本要点中所述ses_lambda.tf定义基础设施并基本实现本指南sesTest.js是我的 Lambda 函数。terraform-show.out显示terraform show只限于由 定义的资源的结果ses_lambda.tf

正如您在 中看到的ses_lambda.tf,SES 端点的安全组允许来自 VPC 的 CIDR 块中任何 IP 的任何 SMTP 端口(25、465、587、2465 或 2587)上的所有流量。所以我很困惑为什么这不起作用......

amazon-ses amazon-vpc aws-lambda

7
推荐指数
2
解决办法
1332
查看次数

通过其pIDL识别Windows Shell特殊文件夹(即获取其CSIDL)(现在确定pIDL是否与C#相等)

我有一种情况,我想在一些Windows shell特殊文件夹(对应于CSIDL枚举中的值)上执行特殊处理.(我的解决方案必须与WinXP兼容.)我遇到的问题是当我遇到IShellFolders时我沿着heirarchy工作,我找不到将IShellFolders与CSIDL相匹配的方法.

这是我目前的做法:

csidlToFromFullPIdl所有CSIDL 的静态一对一数据结构()初始化为其返回的pIDL SHGetSpecialFolderLocation.

foreach (CSIDL csidl in Enum.GetValues(typeof(CSIDL))
{
    IntPtr fullPIdl = IntPtr.Zero;
    int hResult = ShellApi.SHGetSpecialFolderLocation(IntPtr.Zero, csidl, ref fullPIdl);
    if (hResult != 0)
        Marshal.ThrowExceptionForHR(hResult);
    csidlToFromFullPIdl.Add(csidl, fullPIdl);
}
Run Code Online (Sandbox Code Playgroud)

使用Desktop IShellFolder启动heirarchy:

int hResult = ShellApi.SHGetDesktopFolder(ref _shellFolder);
hResult = ShellApi.SHGetSpecialFolderLocation(IntPtr.Zero, CSIDL.CSIDL_DESKTOP, ref _fullPIdl);
Run Code Online (Sandbox Code Playgroud)

像这样检索孩子:

hResult = _shellFolder.EnumObjects(IntPtr.Zero, SHCONTF.SHCONTF_FOLDERS, out pEnum);

// Then repeatedly call:
pEnum.Next(1, out childRelativePIdl, out numberGotten);
Run Code Online (Sandbox Code Playgroud)

为孩子们构建新的完全合格的pIDL,如下所示:

_fullPIdl = ShellApi.ILCombine(parentFullPIdl, childRelativePIdl);
Run Code Online (Sandbox Code Playgroud)

(最后,使用:)检索孩子的IShellFolder

hResultUint = parentShellItem.ShellFolder.BindToObject(childRelativePIdl, IntPtr.Zero, ShellApi.IID_IShellFolder, out _shellFolder);
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是childRelativePIdl和_fullPIdl都不对应于任何pIDL csidlToFromFullPIdl.

TIA. …

c# windows-shell

6
推荐指数
1
解决办法
2247
查看次数

Django管理界面不使用子类的__unicode __()

(Django 1.x,Python 2.6.x)

我有以下模型:

class Animal(models.Model):
  pass

class Cat(Animal):
  def __unicode__(self):
    return "This is a cat"

class Dog(Animal):
  def __unicode__(self):
    return "This is a dog"

class AnimalHome(models.Model):
  animal = models.ForeignKey(Animal)
Run Code Online (Sandbox Code Playgroud)

我没有实例化动物,因为这应该是一个虚拟类.我已经实例化了Cats and Dogs,但是在AnimalHome的Admin Page中,我对Animal的选择显示为"Animal object"(我猜是默认的__unicode __()),而不是我为两个子类定义的__unicode__.救命.


我想,抽象的基类问题是这个问题的一个问题.即使Animal不应该是抽象的,我仍然有一个问题,由于某种原因,由于ForeignKey是在Animal上定义的而不是其子类之一,因此调用了超类方法而不是子类.在OO编程中,当你调用object.method()时,你应该得到最低子类的实现,你必须做额外的工作来获得任何超类的实现.那么为什么在子类上定义__unicode__是不够的---实际上问题可能是__unicode__根本没有被调用,因为对Animal类的内省显示它没有被定义.所以,如果我为Animal定义__unicode__并让它调用子类'


好的,我认为我理解ORM问题.这两个答案都帮助我理解了这一点,谢谢.在尝试这个时,我发现当Django保存子类模型时,它会做两件事:(1)它为超类表中的子类对象创建一行,(2)它使子类表中的PK与超类表中指定的PK.子类表中的这个PK名为superclass_ptr.基于此,我编造了以下内容.我很感激反馈.

Class Animal(models.Model)
  def __unicode__(self):
    if Dog.objects.filter(pk=self.pk).count() > 0:
      return unicode(Dog.objects.get(pk=self.pk))
    elif Cat.objects.filter(pk=self.pk).count() > 0:
      return unicode(Cat.objects.get(pk=self.pk))
    else:
      return "An Animal!"
Run Code Online (Sandbox Code Playgroud)

劳伦斯似乎最关注这个问题.Cat和Dog将有不相交的PK集(并且Animal的任何子类将具有与其超类的记录相同的PK),但不幸的是Django不会在幕后执行任何工作:"我是动物.我知道动物有狗和猫的子类.具体来说,我是动物3号,而且我刚刚检查过,它也是一个Cat 3号.这意味着我实际上是Cat 3号.尽管这看起来完全可能且非常合理(因为Cat不会做任何动物无法做到的事情)使用Python的内省.谢谢你们.

python django django-admin

4
推荐指数
2
解决办法
4787
查看次数