小编Blu*_*ber的帖子

从嵌套的链和和弦中获取所有任务ID

我正在使用带有Redis后端的Celery 3.1.9.我正在运行的工作由几个以和弦和链条运行的子任务组成.结构如下所示:

  1. 准备
  2. 下载数据(2名工人的和弦)
  3. 解析并存储下载的数据
  4. 4名工人的长期和弦
  5. 敲定
  6. 生成报告

列表中的每个项目都是一个子任务,它们都链接在一起.第2步和第4步是和弦.通过为第4步创建和弦来连接整个事情,其中​​回调是4 - > 6的链,然后为第2步创建和弦,其回调是3 - >第一和弦.然后,最后创建一个链 - >第二个和弦.然后使用delay()启动该链,并将其ID存储在数据库中.

问题是双重的,首先我希望能够撤销整个事情,其次我希望在我的Task类上有一个自定义的on_failure来进行一些清理,并向用户报告失败.

目前我存储了链的任务ID,我想我可以用它来撤销链.此外,如果出现错误,我想将链路连接到它的根(在on_failure处理程序中)以从数据库中检索相关记录.这不起作用,因为当您仅使用任务的ID重新创建AsyncResult实例时,它的父属性为None.

我尝试的第二件事是存储在外链的结果上调用的serializable()的结果.但是,这不返回整个AsyncResult对象树,它只返回链中第一级的ID(因此不是和弦中子项的ID.)

我尝试的第三件事就是基本上自己实现serializable(),但事实证明,原始方法不会超过2级的原因是因为链的子节点是celery.canvas.chord对象,而不是AsyncResult实例.

问题的例证:

chord([
    foo.si(),
    foo.si(),
    foo.si(),
], bar.si() | bar.si())
res = chord.apply_async()
pprint(res.serializable())
Run Code Online (Sandbox Code Playgroud)

打印以下内容:

(('50c9eb94-7a63-49dc-b491-6fce5fed3713',
  ('d95a82b7-c107-4a2c-81eb-296dc3fb88c3',
   [(('7c72310b-afc7-4010-9de4-e64cd9d30281', None), None),
    (('2cb80041-ff29-45fe-b40c-2781b17e59dd', None), None),
    (('e85ab83d-dd44-44b5-b79a-2bbf83c4332f', None), None)])),
 None)
Run Code Online (Sandbox Code Playgroud)

第一个ID是回调链的id,第二个ID来自和弦任务本身,后三个是和弦内的实际任务.但是我无法从回调链中的任务得到结果(即两个bar.si()调用的ID).

有没有办法获得实际的任务ID?

python redis celery

15
推荐指数
1
解决办法
1131
查看次数

如何在Sphinx中创建自定义指令

我目前正在记录用Python编写的rest API.所有项目的文档都是使用Sphinx创建的,对于REST API,我想创建一些特殊的指令.例如,假设我已定义此资源:

@resource("/user/<email>", method="GET")
def user_details (email):
    """ Returns detailed information about a user account.

    :resource GET: /user/<email>
    :query_param a_param: Some kind of query param.
    """
    # Do stuff and return user details
Run Code Online (Sandbox Code Playgroud)

这基本上就是文档目前的样子.我希望能够为Sphinx创建一个指令,:query_param ...:它可以像使用常规格式那样格式化一个或多个:param:.

我已经找到了如何制作角色,但它们只能内联工作,而不能用于数据块.

应该怎么做呢?

python documentation restructuredtext python-sphinx

14
推荐指数
1
解决办法
6853
查看次数

Unittesting cherrypy webapp

我最近不得不重写我们的rest api,并从Flask切换到Cherrypy(主要是因为兼容Python 3).但现在我不得不尝试编写我的单元测试,Flask有一个非常漂亮的内置测试客户端,你可以使用它向你的应用程序发送虚假请求(无需启动服务器.)我找不到任何类似的功能对于Cherrypy,是否有这样的功能,或者我是不是在启动服务器并对它做实际请求?

python unit-testing cherrypy

12
推荐指数
1
解决办法
3141
查看次数

Apache Bench显示高'连接'时间

我正在尝试使用apache bench在我们的API服务器上进行一些非常简单的基准测试,我知道它不是加载测试web服务器的理想工具,但这不是重点.

我们有几台服务器和几台虚拟机(托管在这些服务器上).所有这些都运行相同的nginx,uwsgi和一个cherrypy webapp堆栈.我可以在新服务器(没有VM)上使用apachebench,结果如下:

Server Software:        CherryPy/3.2.2
Server Hostname:        10.0.2.4
Server Port:            5000

Document Path:          /api/v4/ping
Document Length:        245 bytes

Concurrency Level:      1
Time taken for tests:   10.100 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      397000 bytes
HTML transferred:       245000 bytes
Requests per second:    99.01 [#/sec] (mean)
Time per request:       10.100 [ms] (mean)
Time per request:       10.100 [ms] (mean, across all concurrent requests)
Transfer rate:          38.38 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max …
Run Code Online (Sandbox Code Playgroud)

linux performance networking tcp apachebench

7
推荐指数
0
解决办法
762
查看次数

分离业务逻辑和模型

我有这个问题一直困扰着我一段时间.乍一看,它似乎是一个相当基本的问题,但似乎没有一个明确的答案.我提出这个问题的基础是一个通过SQLAlchemy使用PostgreSQL的Python项目,但使用的特定语言和工具并不重要.

基本问题是在使用ORM时放置逻辑?更具体地说,我的映射类的方法应该采用什么逻辑?

似乎有一些明确的案例,例如,属性的基本验证,例如最小长度或某些电子邮件地址是否属于ORM层(甚至是数据库本身).

一个简单的具体示例是有序的,因此我们假设我们正在存储用户对象,用户有一个电子邮件地址(这是他们唯一的ID),一个密码和一个激活ID.创建帐户时,会分配激活ID并将其邮寄给用户,然后使用该ID设置密码.

我们来看几个场景:

  • 用户创建一个帐户;
  • 用户激活帐户(即设置密码).

因此,当用户创建帐户时,我们需要运行一些基本验证:

  • 电子邮件地址正确=> ORM;
  • 电子邮件地址unique => ORM或数据库(唯一约束);
  • 设置随机激活id => ORM

当用户激活她的帐户时,我遇到了问题.我想验证提供的密码(例如足够长?足够的数字?),但模型应使用某种散列或加密算法存储密码.似乎有两种选择:

1:检查模型之外的激活ID和密码有效性,散列密码然后将User.password设置为散列,并将User.activation id设置为null(以指示活动帐户).

2:创建一个User.activate(activation_id,password)方法,该方法验证每个并相应地设置User.password和User.activation_id属性.

3:混合选项,执行选项1,但在设置密码时设置某种挂钩或事件激活_id = null(如果我们假设可以设置激活ID或密码,则此挂钩满足基本一致性属性该模型).

我在互联网上搜索过,有些消息来源谈论这个问题(包括一些SO问题),但没有人真正回答这个问题.

python orm sqlalchemy separation-of-concerns

6
推荐指数
0
解决办法
1419
查看次数

用于Celery堆栈跟踪的Logstash多行编解码器

尝试为logstash创建正确解析Celery日志格式的配置,包括多行堆栈跟踪.记录输出的示例可能如下所示:

[2014-04-15 15:11:27,350: DEBUG/Worker-4] Doing some work.
[2014-04-15 15:11:27,362: ERROR/MainProcess] Task core.tasks.sometask[92dc34bd-8139-4f98-b359-d78caf68381d] raised unexpected: ValueError('Foobar',)
Traceback (most recent call last):
  File "./venvs/backend-33/lib/python3.4/site-packages/celery/app/trace.py", line 238, in trace_task
    R = retval = fun(*args, **kwargs)
  File "./venvs/backend-33/lib/python3.4/site-packages/celery/app/trace.py", line 416, in __protected_call__
    return self.run(*args, **kwargs)
  File "util.py", line 151, in wrapper
    rv = func(self, *args, **kwargs)
  File "tasks.py", line 104, in do_something_useful
    raise ValueError('Foobar')
ValueError: Foobar
Run Code Online (Sandbox Code Playgroud)

在某些时候,我让Grok准备解析单行输出,但多行是一个问题.这个配置:

input {
    stdin {
        codec => multiline {
            'negate' => true
            'pattern' => '^\['
            'what' => 'previous' …
Run Code Online (Sandbox Code Playgroud)

python celery logstash

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

uwsgi 指定 python 二进制文件

在我们的生产服务器上,我们运行的是 Ubuntu 12.04,为了确保我们的应用程序在预定义的一致环境中运行,我们使用 Pythonbrew 来编译自定义 Python。我创建了一个将运行我们的 API 服务器的用户,该用户使用 Pythonbrew 创建了自己的 Python 2.7.2 环境,并使用 pip 安装了必要的包。

我还在系统上安装了 uWSGI,它将封装 API 应用程序并通过 mod_wsgi 将其提供给 Apache。问题是我无法让 uWSGI 使用正确的 python 二进制文件。当前配置如下所示:

[uwsgi]
socket = 127.0.0.1:3031
processes = 4
chdir = /home/app/
pythonpath = /home/app
gid = 1002
uid = 1002
module = api
callable = APP
enable-threads = true
Run Code Online (Sandbox Code Playgroud)

当我尝试在终端上运行此配置时:

uwsgi --ini app.ini
Run Code Online (Sandbox Code Playgroud)

它无法导入某些模块。此模块仅安装在 API 用户使用的 Pythonbrew 环境中。问题是 uWSGI 使用 /usr/bin 中的默认 python 二进制文件。

一种解决方案是在API用户的环境中使用pip安装的单独uWSGI,但我真的想使用系统的uWSGI,因为它与操作系统更好地集成。

有没有办法指定应该使用哪个 Python 二进制 uWSGI,然后安装一个单独的?如果我必须安装一个单独的 uWSGI 实例,让它在系统启动时启动的最佳方法是什么?

编辑:刚刚意识到它可能没有使用 python 二进制文件,而只是针对它的库,所以我无法使用 wsgi …

python ubuntu uwsgi

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

以可测试的方式连接到mongodb

我打算使用Flask和MongoDB(可能是Ming作为ODM)在python中编写一个webapp.问题是我想保持我的模型和控制器真正分离,其中一个原因是能够在单独的组件上运行简单的单元测试.

现在这是我的问题,在我需要连接到MongoDB的请求生命周期中的某个时刻.每个请求都有一个单独的连接.Flask提供了一个线程本地对象,它可以包含请求的全局变量,这似乎是放置mongo连接的好地方.但是,这会在数据层和Flask之间产生一种硬依赖关系,这将使得单独测试或运行它们非常困难.

所以我的问题是,是否有一个优雅的解决方案.我自己想出了几个选项,但它们远非优雅.

首先,我可以给数据模块一个函数,告诉它从哪里获取连接对象.或者类似地将它交给一个可以用来获取新连接的函数.

第二个选项是创建一个类,模块可以使用它来获取与MongoDB的连接,然后创建此类的两个版本,一个使用Flask的全局对象,另一个只是明显连接到MongoDB.

这些对我来说似乎都不健壮或优雅,有没有办法更好地做到这一点?

python mongodb pymongo flask ming

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

使用nextLink属性获取下一个结果页面

我正在使用Google API python客户端从Google Analytics下载一些数据.我基本上复制了他们的一个示例并修改它以完全按照我的需要进行操作.

我从示例中获取了这段代码:

   request = service.data().ga().get(
       ids=ids,
       start_date=str(start_date),
       end_date=str(end_date),
       dimensions=','.join(dimensions),
       filters=filters,
       sort="ga:date",
       metrics=','.join(metrics))
Run Code Online (Sandbox Code Playgroud)

然后将其添加到批处理对象,并在收集10个请求后执行它.这一切都运行良好,但问题是,其中一些请求返回"nextLink".现在我可以使用不同的start-index创建一个新的请求对象(带有上面的代码),但是不是更好的方法吗?

有没有办法将nextLink解析为新的请求对象?

python google-analytics google-api

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

如何进行国际化?

我正在构建一个在发布时使用单一语言(荷兰语)的Web应用程序.但是,在某些时候它也可能被翻译成其他语言,这就是为什么我想从一开始就建立国际化的原因.

问题是目前有3个单独的地方显示字符串,即模板,python后端和一些javascript.由于我从未将任何类型的应用程序国际化,我想知道是否有某种方法可以避免这种传播?而且,实现国际化的最佳方式是什么?

编辑:作为一点澄清,我使用以下部分:Jinja2,Flask,WTForms jQuery,以及一堆Python和Javascript代码.

javascript python internationalization jinja2 flask

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

pymongo 64位无符号整数

我正在尝试使用pymongo在mongodb中插入一个64位无符号整数.整数是CRC64算法的输出.我试着跟随:

long(crc64(unicode(kw).encode('unicode-escape'))))
Run Code Online (Sandbox Code Playgroud)

如果我将其插入mongodb,它开始抱怨mongodb只支持64位整数.接下来我尝试将其转换为带符号的64位int,如下所示:

ctypes.c_int64(crc64(unicode(kw).encode('unicode-escape')))).value
Run Code Online (Sandbox Code Playgroud)

哪种工作,mongodb停止抱怨我的int的大小,但是当我看到mongodb中的数据时,我得到了这个:

{
    "_id" : {
        "floatApprox" : -5307924876159732000,
        "top" : 3059119730,
        "bottom" : 2651469802 },
    "keyword" : "redacted",
    "normal_hash" : { 
        "floatApprox" : -671156942315906300,
        "top" : 4138701393,
        "bottom" : 549001936
    } 
}
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?有没有办法将64位int作为一个int放入db(不关心它是有符号还是无符号.)

python unsigned mongodb pymongo

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