我正在使用AWS S3 REST API,在解决了一些令人烦恼的签名问题之后,它似乎有效.但是,当我使用正确的REST动词创建资源时POST,我得到了405 method not allowed.相同的请求与方法一起工作PUT并创建资源.
我做错了什么,或者AWS S3 REST API不完全符合REST标准吗?
我有两个Flask-SQLAlchemy模型,具有简单的一对多关系,如下面的最小示例:
class School(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
address = db.Column(db.String(30))
class Teacher(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
id_school = db.Column(db.Integer, db.ForeignKey(School.id))
school = relationship('School', backref='teachers')
Run Code Online (Sandbox Code Playgroud)
然后我向使用该关系的教师添加混合属性,如:
@hybrid_property
def school_name(self):
return self.school.name
Run Code Online (Sandbox Code Playgroud)
当我使用它时,该属性工作得很好teacher_instance.school_name.但是,我也想提出类似的查询Teacher.query.filter(Teacher.school_name == 'x'),但这给了我一个错误:
`AttributeError: Neither 'InstrumentedAttribute' object nor
'Comparator' object has an attribute 'school_name'`.
Run Code Online (Sandbox Code Playgroud)
在SQLAlchemy文档之后,我添加了一个简单的混合表达式,如下所示:
@school_name.expression
def school_name(cls):
return School.name
Run Code Online (Sandbox Code Playgroud)
但是,当我再次尝试相同的查询时,它会生成一个没有join子句的SQL查询,因此我获得了School中所有可用的行,而不仅仅是那些与Teacher中的外键匹配的行.
从SQLAlchemy文档中我意识到表达式需要一个已经存在连接的上下文,所以我再次尝试查询:
Teacher.query.join(School).filter(Teacher.school_name == 'x')
这实际上是有效的,但是如果我需要学校模型的知识来实现这一目的,那就首先试图在那里试图获得语法糖.我希望有一种方法可以在表达式中加入,但我无法在任何地方找到它.该文档有一个示例,表达式返回一个直接用它构建的子查询select(),但即使这对我没用.
有任何想法吗?
UPDATE
在下面的Eevee回答之后,我使用了建议的关联代理并且它有效,但我也对它应该与select()子查询一起工作的评论感到好奇,并试图弄清楚我做错了什么.我最初的尝试是:
@school_name.expression
def school_name(cls):
return select(School.name).where(cls.id_school == School.id).as_scalar() …Run Code Online (Sandbox Code Playgroud) Amazon S3 REST API文档表示在PUT操作中上传的大小限制为5gb.大于此的文件必须使用multipart上传.精细.
但是,我本质上需要的是重命名可能比这更大的文件.据我所知,没有重命名或移动操作,因此我必须将文件复制到新位置并删除旧位置.如何使用大于5gb的文件完成这项工作?我必须从存储桶到自身进行分段上传吗?在这种情况下,如何拆分部分文件?
从阅读boto的源代码来看,对于大于5gb的文件,它似乎不会自动执行此类操作.我错过了任何内置支持吗?
我使用Django与MySQL 5.5.22有以下问题.
给定一个具有列id,level和2x2矩阵的表,存储为a11,a12,a21,a22,我有这一行:
id a11 a12 a21 a22 level
324 3 2 5 3 2
Run Code Online (Sandbox Code Playgroud)
给定一个queryset qs,我做了以下更新:
qs.update(
a11=(b12 * a21 - b11 * a22) * F('a11') + (b11 * a12 - b12 * a11) * F('a21'),
a12=(b12 * a21 - b11 * a22) * F('a12') + (b11 * a12 - b12 * a11) * F('a22'),
a21=(b22 * a21 - b21 * a22) * F('a11') + (b21 * a12 - b22 * a11) * F('a21'),
a22=(b22 * a21 - b21 …Run Code Online (Sandbox Code Playgroud) 我有一个模型XYZ,我需要获得给定查询集的字段a,b和表达式x/y的最大值.
它适用于田野.就像是:
>>> XYZ.all().aggregate(Max('a'))
... {'a__max': 10}
Run Code Online (Sandbox Code Playgroud)
但是,我无法找到表达式的方法.尝试类似的东西:
>>> XYZ.all().aggregate(Max('x/y'))
Run Code Online (Sandbox Code Playgroud)
给出错误:
*** FieldError: Cannot resolve keyword 'x/y' into field. Choices are: a, b, x, y, id
Run Code Online (Sandbox Code Playgroud)
尝试类似的东西:
>>> XYZ.all().aggregate(Max(F('x')/F('y')))
Run Code Online (Sandbox Code Playgroud)
给出错误:
*** AttributeError: 'ExpressionNode' object has no attribute 'split'
Run Code Online (Sandbox Code Playgroud)
甚至是这样的:
XYZ.all().extra(select={'z':'x/y'}).aggregate(Max('z'))
Run Code Online (Sandbox Code Playgroud)
也不起作用,并给出与上面相同的错误:
FieldError: Cannot resolve keyword 'z' into field. Choices are: a, b, x, y, id
Run Code Online (Sandbox Code Playgroud)
我发现这样做的一个黑客是:
XYZ.all().extra(select={'z':'MAX(x/y)'})[0].z
Run Code Online (Sandbox Code Playgroud)
这实际上是有效的,因为它生成了正确的SQL,但它令人困惑,因为我确实在z atttribute获得了正确的值,但没有正确的实例,即具有该最大值的实例.
当然,我也可以使用带有extra()和order_by()的原始查询或技巧,但是我真的没理由Django以一种很好的方式支持聚合查询,但不能支持表达式甚至有自己的F表达式.
有什么办法吗?
我有一个特定实体的数据,这些实体在多个相同的表中分区,通常按时间顺序或按数字范围分隔.例如,我可能有一个名为mytable的表用于当前数据,mytable_2013用于去年的数据,mytable_2012等等.
只写当前表.其他人只是咨询.使用SQLAlchemy,有什么方法可以指定要在使用声明性模型时查询的表吗?
具有不完整的资源表示的PUT所期望的标准行为是什么?
举例来说,我有一个User在/api/users/1多数民众赞成由以下HAL JSON表示:
{'id': 1,
'username': 'joedoe',
'email': 'joe@doe.com',
'password_hash': '9039dmk38f84uf4029i339kf32f0932i',
'last_visit': '2013-11-04 21:09:01',
'public': true,
'_links': {'self': {'href': 'http://foo.bar.com/api/users/1'}}
}
Run Code Online (Sandbox Code Playgroud)
然后,我做一个PUT请求变更username和email,以表示缺少其他属性:
PUT /api/users/1
{'username': 'joeydoey',
'email': 'joey@doey.com'}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我一直认为这应该被视为一个错误,因为它意味着部分更新,但这个答案让我思考它,并且说不完整的表示仍然是给服务器的完全替代是有道理的.自由填写默认的空白.
我在HTTP标准上找不到任何与此相关的内容,所以我不得不问,在这种情况下预期的标准化行为是什么?
它应该导致错误,因为它意味着部分更新.PUT有效负载的模式应与使用GET检索到的相同资源和媒体类型的模式相同.
它应该成功,因为服务器可以使用该媒体类型的默认值自由填充空白.在这种情况下,它会将密码重置为空密码或默认密码并相应地刷新散列,并将last_visit和公共值设置为默认值.当您考虑HATEOAS时,如果客户端提交服务器返回的相同媒体类型,则此选项更有意义,因为它无法预测超媒体控件将如何更改,每次客户端时,表示都必须不完整发送所有超链接,服务器必须相应地重置它们.
1和2都是有效的,因为没有标准化的行为,并且由媒体类型决定如何处理它.这感觉不对,因为PUT不是从属于资源本身,而是替换它.
请记住,我不是在问什么是正确的或什么是有道理的.我问的是哪一个是由标准支持的.
我有一个在客户端之间共享的活动队列,捕获用户活动并由另一个站点上的机器人执行.活动的一个例子可能是:
CREATE FOLDER /docs
CREATE FILE /docs/journal.txt
DELETE FILE /docs/blog.txt
MOVE FOLDER /docs/images /docs/photos
...
Run Code Online (Sandbox Code Playgroud)
通常有活动可以减少到一个或没有.例如:
CREATE FOLDER /docs
RENAME FOLDER /docs /documents
Run Code Online (Sandbox Code Playgroud)
可以简单地改为:
CREATE FOLDER /documents
Run Code Online (Sandbox Code Playgroud)
类似的东西:
CREATE FOLDER /docs
RENAME FOLDER /documents
DELETE FOLDER /documents
Run Code Online (Sandbox Code Playgroud)
可以从队列中完全删除.
这种减少/优化似乎是一个非常普遍的问题,在攻击它之前,我想尝试一些通用的解决方案.它看起来像一个寻路优化问题.
有任何想法吗?
我在一些 Python 应用程序中使用 ZMQ 已经有一段时间了,但直到最近我才决定在 Go 中重新实现其中之一,我意识到 ZMQ 套接字不是线程安全的。
原始 Python 实现使用如下所示的事件循环:
while running:
socks = dict(poller.poll(TIMEOUT))
if socks.get(router) == zmq.POLLIN:
client_id = router.recv()
_ = router.recv()
data = router.recv()
requests.append((client_id, data))
for req in requests:
rep = handle_request(req)
if rep:
replies.append(rep)
requests.remove(req)
for client_id, data in replies:
router.send(client_id, zmq.SNDMORE)
router.send(b'', zmq.SNDMORE)
router.send(data)
del replies[:]
Run Code Online (Sandbox Code Playgroud)
问题是第一次通过时回复可能没有准备好,所以每当我有待处理的请求时,我必须以非常短的超时时间进行轮询,否则客户端将等待超过他们应该等待的时间,并且应用程序最终会使用很多用于轮询的 CPU。
当我决定在 Go 中重新实现它时,我认为它会像这样简单,通过在轮询中使用无限超时来避免问题:
for {
sockets, _ := poller.Poll(-1)
for _, socket := range sockets {
switch s := socket.Socket; s {
case …Run Code Online (Sandbox Code Playgroud) 我有一个工作流程,它接收S3存储桶中的文件,并根据文件内容进行大量处理和进一步请求.目前,客户端必须在上传文件后手动触发工作流程.这对我来说似乎是一个非常常见的用例,所以有没有办法在文件上传后立即触发工作流程?
我想在它们之间应该有一个SNS通知,但有没有办法将通知直接发送到SWF,而没有服务消耗它们并启动工作流程?
我有一个兔子和芹菜的设置,工人在4台机器上运行,每台机器有4个实例.我定义了两个任务函数,它们基本上调用相同的后端函数,但其中一个名为"process_transaction",没有定义rate_limit,另一个名为"slow_process_transaction",rate_limit ="6/m".任务在rabbitmq上进入不同的队列,缓慢和正常.
奇怪的是,rate_limit正在为两个任务执行.如果我尝试使用celery.control.rate_limit更改rate_limit,则使用"process_transaction"执行此操作不会产生任何结果,并且使用"slow_process_transaction"名称会更改两者的rate_limit.
什么是错的?