我知道这是一个相当普遍的问题,但我没有找到满足我的答案.
我一直在使用django rest框架一段时间了,但除了给出的例子之外,这几乎是无关紧要的.它的默认行为是在访问具有空列表项的路由时返回带有空列表资源的HTTP 200.例如:如果我们有一个路径,例如/articles/
访问文章列表,但它不包含任何项目,我们会收到如下json的响应:
{"count":0, "next":null, "previous":null, "items": []}
Run Code Online (Sandbox Code Playgroud)
这完全没问题.我们在/ articles /中找到了我们要查找的资源,它恰好没有任何项目.
如果我们访问路线/articles/?page=1
,我们会得到完全相同的响应.
到现在为止还挺好.现在我们尝试访问/articles/?page=2
,响应代码也会发生变化.现在得到一个404
好像无法找到资源的错误消息,说该页面不包含任何结果.哪个是与?page = 1相同的情况......
我对这种行为非常满意,但今天我开始质疑这个设计.是怎样的?page=1
情况不同于?page=2
?而且,在发出HEAD请求时,如何判断请求是否"有效"?在包含任何结果的意义上有效.
这在过滤列表检查某个字段的可用性(例如,发出HEAD
请求/users/?username=ted
)的情况下可能很有用.
这是一个很好的设计吗?为什么大多数人似乎不同意它,它有什么缺点?
最近,亚马逊 AWS 发布了 Spot 车队的 Auto Scaling ( https://aws.amazon.com/blogs/aws/new-auto-scaling-for-ec2-spot-fleets/ )。Auto Scaling 组已经允许您设置 Spot 价格以折扣价获得 Spot 实例而不是预留实例。
据我所知,Spot Fleet 允许您根据 vCPU 定义队列容量,混合不同的实例类型来实现这一点。据我所知,我认为这不能使用 Auto Scaling 来完成。
我的用例非常简单:使用 Spot 队列(或带有 Spot 实例的 Auto Scaling)以更低的价格增加我的集群容量,同时保持最少的预留实例以防万一。我可以复制我的 ASG,设置一个现货价格,然后我就完成了,但显然这个功能现在也作为 Spot Fleet 的一部分存在。
一个比另一个有什么优势?是否有任何重要的原因要切换?
更新 下面发布的代码非常好.我刚刚找到了我的问题的答案:我用另一个在该模块上使用相同名称的处理器覆盖了处理程序,因此weakref被删除了...其他人可以使用下面的代码根据Django文档正确地注册信号.
在我的Django 1.8,Python 2.7.9中,我定义了一个永远不会被调用的信号.看起来由于某种原因它被垃圾收集.处理程序是在模块级别定义的,而不是在函数内部,所以我希望它只要程序运行就会保留在那里.连接信号时使用weak = False可以解决问题,但我想知道这种行为的具体细节.
这大致是我正在使用的代码:
# myapp/apps.py
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = 'myapp'
def ready(self):
import myapp.signals
Run Code Online (Sandbox Code Playgroud)
# myapp/__init__.py
default_app_config = 'myapp.apps.MyAppConfig'
Run Code Online (Sandbox Code Playgroud)
# myapp/signals.py
from django.db.models.signals import post_delete
from django.dispatch import receiver
from otherapp.models import Model
@receiver(post_delete, sender=Model) # weak=True
def post_delete_hype_callback(sender, **kwargs):
# Do stuff here
pass
Run Code Online (Sandbox Code Playgroud)
Model上的post_delete信号永远不会被调用.我甚至无法在连接信号列表中看到它.在接收器装饰器上使用weak = False解决了这个问题.
从我的角度来看,接收器装饰器返回正在装饰的实际函数,因此它应该保持在模块级别并且永远不会被垃圾收集.我还检查了当应用程序调用就绪时(通过使用import myapp.signals
)处理程序连接到信号.
我能想到的唯一合理的解释是,一旦ready()
MyAppConfig 的方法完成,signals.py
模块就会被垃圾收集,因为在任何地方都没有其它的引用,但这不是我期望的行为.
这似乎是根据Django文档连接信号的推荐方法,但似乎并不适合我.
任何人都可以对这种行为有所了解吗?