小编Ped*_*eck的帖子

S3 REST API和POST方法

我正在使用AWS S3 REST API,在解决了一些令人烦恼的签名问题之后,它似乎有效.但是,当我使用正确的REST动词创建资源时POST,我得到了405 method not allowed.相同的请求与方法一起工作PUT并创建资源.

我做错了什么,或者AWS S3 REST API不完全符合REST标准吗?

rest amazon-s3 amazon-web-services

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

SQLAlchemy:具有关系的混合表达式

我有两个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)

python sqlalchemy flask-sqlalchemy

29
推荐指数
1
解决办法
7215
查看次数

如何在Amazon S3中复制大于5 GB的文件?

Amazon S3 REST API文档表示在PUT操作中上传的大小限制为5gb.大于此的文件必须使用multipart上传.精细.

但是,我本质上需要的是重命名可能比这更大的文件.据我所知,没有重命名或移动操作,因此我必须将文件复制到新位置并删除旧位置.如何使用大于5gb的文件完成这项工作?我必须从存储桶到自身进行分段上传吗?在这种情况下,如何拆分部分文件?

从阅读boto的源代码来看,对于大于5gb的文件,它似乎不会自动执行此类操作.我错过了任何内置支持吗?

python amazon-s3 boto

23
推荐指数
2
解决办法
2万
查看次数

更新多列的MySQL更新是非原子的吗?

我使用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)

mysql sql sqlite django

8
推荐指数
2
解决办法
1133
查看次数

Django使用表达式聚合查询

我有一个模型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表达式.

有什么办法吗?

python sql django django-1.3

7
推荐指数
1
解决办法
6526
查看次数

SQLAlchemy,使用与多个表相同的模型

我有一个特定实体的数据,这些实体在多个相同的表中分区,通常按时间顺序或按数字范围分隔.例如,我可能有一个名为mytable的表用于当前数据,mytable_2013用于去年的数据,mytable_2012等等.

只写当前表.其他人只是咨询.使用SQLAlchemy,有什么方法可以指定要在使用声明性模型时查询的表吗?

python sqlalchemy

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

使用具有不完整表示的PUT方法

具有不完整的资源表示的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请求变更usernameemail,以表示缺少其他属性:

PUT /api/users/1

{'username': 'joeydoey',
 'email': 'joey@doey.com'}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我一直认为这应该被视为一个错误,因为它意味着部分更新,但这个答案让我思考它,并且说不完整的表示仍然是给服务器的完全替代是有道理的.自由填写默认的空白.

我在HTTP标准上找不到任何与此相关的内容,所以我不得不问,在这种情况下预期的标准化行为是什么?

  1. 它应该导致错误,因为它意味着部分更新.PUT有效负载的模式应与使用GET检索到的相同资源和媒体类型的模式相同.

  2. 它应该成功,因为服务器可以使用该媒体类型的默认值自由填充空白.在这种情况下,它会将密码重置为空密码或默认密码并相应地刷新散列,并将last_visit和公共值设置为默认值.当您考虑HATEOAS时,如果客户端提交服务器返回的相同媒体类型,则此选项更有意义,因为它无法预测超媒体控件将如何更改,每次客户端时,表示都必须不完整发送所有超链接,服务器必须相应地重置它们.

  3. 1和2都是有效的,因为没有标准化的行为,并且由媒体类型决定如何处理它.这感觉不对,因为PUT不是从属于资源本身,而是替换它.

请记住,我不是在问什么是正确的或什么是有道理的.我问的是哪一个是由标准支持的.

api rest http

6
推荐指数
2
解决办法
1760
查看次数

队列减少算法?

我有一个在客户端之间共享的活动队列,捕获用户活动并由另一个站点上的机器人执行.活动的一个例子可能是:

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)

可以从队列中完全删除.

这种减少/优化似乎是一个非常普遍的问题,在攻击它之前,我想尝试一些通用的解决方案.它看起来像一个寻路优化问题.

有任何想法吗?

algorithm queue optimization

5
推荐指数
1
解决办法
142
查看次数

如何处理 ZMQ 套接字缺乏线程安全性?

我在一些 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)

sockets go zeromq

4
推荐指数
1
解决办法
1467
查看次数

上传到S3后触发SWF工作流程

我有一个工作流程,它接收S3存储桶中的文件,并根据文件内容进行大量处理和进一步请求.目前,客户端必须在上传文件后手动触发工作流程.这对我来说似乎是一个非常常见的用例,所以有没有办法在文件上传后立即触发工作流程?

我想在它们之间应该有一个SNS通知,但有没有办法将通知直接发送到SWF,而没有服务消耗它们并启动工作流程?

amazon-s3 amazon-web-services amazon-swf

3
推荐指数
1
解决办法
1633
查看次数

芹菜rate_limit影响多个任务

我有一个兔子和芹菜的设置,工人在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.

什么是错的?

python rabbitmq celery

2
推荐指数
1
解决办法
1267
查看次数