在一些Django视图中,我使用这样的模式来保存对模型的更改,然后根据新的模型数据进行一些异步更新(例如生成图像,进一步更改模型). mytask是一个芹菜任务:
with transaction.atomic():
mymodel.save()
mytask.delay(mymodel.id).get()
Run Code Online (Sandbox Code Playgroud)
问题是任务永远不会返回.查看芹菜的日志,任务排队(我在日志中看到"已接收的任务"),但它永远不会完成.如果我将mytask.delay...get呼叫移出事务,则会成功完成.
transaction.atomic芹菜和芹菜之间是否有一些不相容之处?在Django 1.6或1.7中,我可以在一次交易中同时进行常规模型更新和单独任务流程的更新吗?
我的数据库是postgresql 9.1.我正在使用celery == 3.1.16/django-celery 3.1.16,amqp == 1.4.6,Django == 1.6.7,kombu == 3.0.23.代理后端是amqp,rabitmq是队列.
我正在尝试在两个django安装(生产和测试)之间同步数据.我正在使用./manage.py dumpdata --natural生产,然后./manage.py loaddata进入一个新syncdb的测试数据库.
在我添加新的自定义权限之前,一切正常.生产syncdb以不同的顺序(使用不同的主键)加载此新权限,而不是syncdb空数据库上的新权限.因此,它获得了不同的ID.因此,尽管使用自然键,当我尝试加载数据时,我在加载第一个无序权限对象时收到此错误:
IntegrityError: duplicate key value violates unique constraint "auth_permission_content_type_id_codename_key"
Run Code Online (Sandbox Code Playgroud)
我能想到解决这个问题的最简单方法是从测试安装中的每个表中删除所有数据 - 也就是说,syncdb仅用于创建表,而不是用于加载初始数据.但是syncdb不要让你跳过初始数据/信号步骤.如果没有明确枚举每个模型或表名,如何在调用后删除所有初始数据syncdb?或者有没有办法只使用空表创建syncdb?
./manage.py flush 不是我所追求的 - 它重新加载初始数据并触发syncdb信号.
我需要在Django中提供Web请求时启动pdftk进程,并等待它完成.我目前的pdftk代码如下所示:
proc = subprocess.Popen(["/usr/bin/pdftk",
"/tmp/infile1.pdf",
"/tmp/infile2.pdf",
"cat", "output", "/tmp/outfile.pdf"])
proc.communicate()
Run Code Online (Sandbox Code Playgroud)
只要我在开发服务器(以用户身份运行www-data)下执行,这样就可以正常工作.但是一旦我切换到mod_wsgi,不改变其他任何东西,代码挂起proc.communicate(),并且"outfile.pdf"保留为零长度的打开文件句柄.
我已经尝试了几个子进程调用的变种(以及普通的旧的os.system) - 将stdin/stdout/stderr设置为PIPE或各种文件句柄没有任何改变.使用"shell = True"可以防止proc.communicate()挂起,但是pdftk无法在devserver或mod_wsgi下创建输出文件. 这个讨论似乎表明可能存在一些更深层次的巫术信号和我不理解的pdftk.
是否有任何变通方法可以让这样的子进程调用在wsgi下正常工作?我正在避免使用PyPDF来组合pdf文件,因为我必须组合足够大量的文件(数百个),这些文件耗尽了内存(PyPDF需要在组合它们时保持每个源pdf文件在内存中打开).
我在最近的Ubuntu,pythons 2.6和2.7下做这个.
我刚刚了解了vim 真正令人敬畏的对象选择功能.将光标放在某个"文本对象"中,一组简单的动词可以选择或操作整个对象.例如,将光标放在下面引号内的任何位置(例如,在'o'上):
print "Hello, world"
^
Run Code Online (Sandbox Code Playgroud)
该命令vi"将选择引号内的整个短语.相同的功能适用于vim定义的许多" 文本对象 ",包括用引号,括号和大括号括起来的单词,句子,段落和字符.
但是现在我想要一个"文本对象"的概念来了解我正在编写的语言.例如,考虑以下python:
re.sub("[^A-Z ]", " ", string)
Run Code Online (Sandbox Code Playgroud)
我希望能够将光标放在某处,并选择整个事物.函数调用是一个定义明确的语法结构,但它不是"单词","句子","段落",或用引号或括号括起来.
是否有任何插件或vimrc hacks定义了这些与语言相关的"文本对象"?
我需要在openFrameworks应用程序中实现色度键控(删除纯色背景).
我将同时播放许多(10个或更多)视频(在同一帧中),并将它们与替代背景一起绘制到屏幕上.我可以通过迭代每个帧的像素并根据绿色阈值为每个像素设置alpha值来实现类似色度键的效果,但是同时有如此多的视频,这种像素敲击变得令人望而却步.
是否有一个简单的OpenGL混合模式或屏蔽操作,可以避免绘制某个颜色值的所有像素?或者是否有另一个openFrameworks或openFrameworks兼容的C++库可以有效地执行此操作?
或者,是否有一种良好(节省空间)的方式在快速兼容的视频文件中存储alpha通道?我们将存储数TB的视频(连续录制数周),因此我们使用节省空间的格式非常重要.
一个注意事项:源文件中的色度键颜色将是"完美的" - 它是以数字方式添加的.因此,如果有某种阈值处理或按位逻辑技巧可以做到这一点,那也可以.
编辑:这是有效的,遵循VJo的像素着色器的建议.我们使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)了以下像素着色器(洋红色作为替换颜色):
"数据/着色器/ chromakey.frag":
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect src_tex_unit0;
vec4 color;
void main( void )
{
vec2 st = gl_TexCoord[0].st;
vec4 sample = texture2DRect(src_tex_unit0, st );
gl_FragColor = sample;
if((sample.r > 0.5) && (sample.g < 0.5) && (sample.b > 0.5)) {
gl_FragColor.a = 0.0;
}
}
Run Code Online (Sandbox Code Playgroud)
"数据/着色器/ chromakey.vert":
void main()
{
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord[0];
}
Run Code Online (Sandbox Code Playgroud)
着色器的C++代理类 - shaderChromakey.h:
#include "ofMain.h"
#include "ofxShader.h"
#include "ofxFBOTexture.h"
class …Run Code Online (Sandbox Code Playgroud) 在 node.js 0.8 下,我在“路由器表”模式下使用 node-http-proxy,配置如下:
var httpProxy = require("http-proxy");
var config = require("./config");
proxyServer = httpProxy.createServer({
hostnameOnly: true,
router: {
"one.example.com": "localhost:9000",
"two.example.com": "localhost:9001"
},
https: {
key: config.key,
cert: config.cert,
// mitigate BEAST: https://community.qualys.com/blogs/securitylabs/2011/10/17/mitigating-the-beast-attack-on-tls
honorCipherOrder: true,
ciphers: "ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH"
}
})
proxyServer.listen(8000)
Run Code Online (Sandbox Code Playgroud)
我想添加HSTS(HTTP 严格传输安全),以便兼容的浏览器被告知始终使用 SSL。为此,我需要让 http-proxy 添加标头:
Strict-Transport-Security: max-age=60000
Run Code Online (Sandbox Code Playgroud)
(或其他最大年龄)。我怎样才能让 node-http-proxy 有效地附加这个标头?
正如 Sentry 的文档[1] [2]为其新的统一 python sdk ( sentry_sdk) 所推荐的那样,我已经使用我的 Django 应用程序对其进行了配置,以捕获所有异常或“错误”级日志上的事件:
import sentry_sdk
import logging
from sentry_sdk.integrations.django import DjangoIntegration
from sentry_sdk.integrations.logging import LoggingIntegration
sentry_logging = LoggingIntegration(
level=logging.DEBUG,
event_level=logging.ERROR
)
sentry_sdk.init(
dsn="{{sentry_dsn}}",
integrations=[DjangoIntegration(), sentry_logging]
)
Run Code Online (Sandbox Code Playgroud)
然而,由于这直接与 python 的日志模块和内部异常处理挂钩,这意味着任何使用这个 Django 环境的东西都会将事件发送到哨兵。有一些任务(例如交互式 manage.py 命令,或在 REPL 中工作)需要 Django 环境,但我不希望在 Sentry 中创建事件。
有没有办法向哨兵表明我希望它不从异常或logging当前任务的调用中捕获事件?或者在全局配置后暂时禁用它的方法?
作为聚合管道的一部分,我想将一个新字段投影到文档上,该文档是两个现有字段中的最小值。
鉴于这样的文件:
{
_id: "big1",
size: "big",
distances: { big: 0, medium: 0.5, small: 1 }
}
{
_id: "med1",
size: "medium",
distances: { big: 0.5, medium: 0, small: 0.5 }
}
{
_id: "small1",
size: "small",
distances: { big: 1, medium: 0.5, small: 0 }
}
Run Code Online (Sandbox Code Playgroud)
“距离”子文档显示文档大小与其他可能大小的“距离”。
我希望积累文档的排序分数,以显示它与一组参数的接近程度。如果我只是寻找“大”文档,我可以这样做:
aggregate([
{$project: {"score": "$distances.big"}}
{$sort: {"score": 1}}
]);
Run Code Online (Sandbox Code Playgroud)
但假设我想对“大”或“中”文档进行同等排序。我想要的是这样的:
aggregate([
{$project: {"score": {$min: ["$distances.big", "$distances.medium"]}}},
{$sort: {"score": 1}}
])
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为 $min 仅对 $group 查询中的相邻文档进行操作。
有没有办法将两个现有字段中的最小值投影为排序参数?
有时需要对 Django 中的数据库操作使用比默认的“已提交读”更高的隔离级别。 文档警告说:
在更高的隔离级别下,您的应用程序应该准备好处理因序列化失败而引发的异常。
但是哪些特定的异常表示序列化失败,而不是查询或事务的一些其他问题?
序列化失败后的简单重试机制可能如下所示:
for retries in range(0, 3):
try:
with transaction.atomic():
MyModel.objects.update(foo='bar')
except StuffHappened:
continue
else:
break
Run Code Online (Sandbox Code Playgroud)
应该替换哪些特定异常,StuffHappened以便只有序列化失败而不是其他异常会导致重试?
Django 有多种数据库异常和事务异常。其中一个/一些可能代表序列化失败?
为此,我对 postgresql 特别感兴趣。
django postgresql transactions exception-handling isolation-level
我在mongodb中有一组文档,每个文档都有一个"组"字段,该字段指的是拥有该文档的组.文件看起来像这样:
{
group: <objectID>
name: <string>
contents: <string>
date: <Date>
}
Run Code Online (Sandbox Code Playgroud)
我想构建一个查询,它返回每个组的最新N个文档.例如,假设有5个组,每个组有20个文档.我想编写一个查询,它将返回每个组的前3个,这将返回15个文档,每组3个.每组获得3分,即使另一组有最近的第4组.
在SQL世界中,我相信这种类型的查询是通过"分区依据"和计数器来完成的.在mongodb中是否存在这样的事情,而不是对N组进行N + 1个单独的查询?