小编Edw*_*rdr的帖子

处理SQLAlchemy中插入的重复主键(声明式样式)

我的应用程序使用范围会话和SQLALchemy的声明式样式.它是一个Web应用程序,许多数据库插入由Celery任务调度程序执行.

通常,在决定插入对象时,我的代码可能会执行以下操作:

from schema import Session
from schema.models import Bike

pk = 123 # primary key
bike = Session.query(Bike).filter_by(bike_id=pk).first()
if not bike: # no bike in DB
    new_bike = Bike(pk, "shiny", "bike")
    Session.add(new_bike)
    Session.commit()
Run Code Online (Sandbox Code Playgroud)

这里的问题是,由于很多,这是通过异步工人完成的,它是可能的一个工作是,虽然中途插入Bikeid=123,而另一个正在检查它的存在.在这种情况下,第二个worker将尝试插入一个具有相同主键的行,SQLAlchemy将引发一个IntegrityError.

我不能为我的生活找到一个很好的方法来处理这个问题,除了交换Session.commit():

'''schema/__init__.py'''
from sqlalchemy.orm import scoped_session, sessionmaker
Session = scoped_session(sessionmaker())

def commit(ignore=False):
    try:
        Session.commit()
    except IntegrityError as e:
        reason = e.message
        logger.warning(reason)

        if not ignore:
            raise e

        if "Duplicate entry" in reason:
            logger.info("%s already in …
Run Code Online (Sandbox Code Playgroud)

python mysql sqlalchemy celery

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

在运行烧瓶应用程序后调用函数的正确方法是什么?

我对如何做一些我认为非常简单的事情感到有些困惑.我有一个简单的应用程序使用Flask.它看起来像这样:

from flask import Flask

app = Flask(__name__)

def _run_on_start(a_string):
    print "doing something important with %s" % a_string

@app.route('/')
def root():
    return 'hello world'

if __name__ == "__main__":
    if len(sys.argv) < 2:
        raise Exception("Must provide domain for application execution.")
    else:
        DOM = sys.argv[1]
        _run_on_start("%s" % DOM)
        app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

我发现我的终端输出的是打印语句,_run_on_start而不是其他常用的Flask app调试代码.如果我在app.run之前删除了调用,则输出正常.此外,我发现_run_on_start在启动时重复输出两次,但我不知道它是否是一些奇怪的输出,或者该函数实际上被调用了两次.

我假设这不是在你打电话之前添加函数调用的正确方法app.run.我查看了Flask文档并发现了可以使用的各种装饰器的提及,它允许您在某些请求之前/之后执行一个函数,但我想在运行应用服务器时执行调用.

此外,我意识到,如果我从另一个模块调用此模块,即,当__name__ != "__main__"我不接听我的电话时_run_on_start.

这里有什么正确的方法?在这两种情况下,当我从CL和另一个模块开始?

python web-frameworks werkzeug flask

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

什么是处理必须协调其任务的工作进程的pythonic方法?

我目前正在学习Python(来自Java背景),我对我在Java中使用线程的问题有疑问.

我的程序将使用工作人员定期从一些Web服务中读取一些数据.每个工作人员将定期在不同时间呼叫Web服务.

根据我的阅读,最好使用该multiprocessing模块并将工作人员设置为继续执行数据收集任务的独立流程.在Java上我会做一些概念上类似的东西,但是使用线程.虽然看起来我可以在Python中使用线程,但我将失去多CPU利用率.

这是我的问题的核心:网络服务受到限制,即工人不得每秒呼叫超过x次.工人检查他们是否可以请求数据的最佳方式是什么?

我很困惑是否应该使用以下方法实现:

  • 管道作为一种与其他"管理对象"进行通信的方式,它监视每秒的总呼叫数.
  • 类似的东西nmap,在进程之间共享一些数据/值,描述它们是否可以调用Web服务.
  • 一个Manager()对象,监视每秒的呼叫,并通知工作人员是否有权进行呼叫.

当然,我想这可能归结为我如何跟踪每秒的呼叫数.我想一个选项是让工作人员在某个其他对象上调用一个函数,这会调用Web服务并记录当前的调用次数/秒.另一种选择是调用Web服务的函数在每个worker中生存,并且每次调用Web服务时都要向管理对象发送消息.

欢迎思考!

python concurrency multiprocessing

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

在Scrapy> = 0.14中以编程方式启动爬虫的最简单方法是什么?

我想从Python模块开始Scrapy中的爬虫.我想基本上模仿的本质$ scrapy crawl my_crawler -a some_arg=value -L DEBUG

我有以下几点:

  • 该项目的settings.py文件
  • 物品和管道
  • 一个爬虫类,它扩展了BaseSpider并在初始化时需要参数.

我可以很高兴使用scrapy上面指定的命令运行我的项目,但是我正在编写集成测试,我想以编程方式:

  • 使用settings.py具有my_crawlername属性的设置和具有name属性的爬虫启动爬网(我可以从我的测试模块轻松实例化此类.
  • 我希望所有的管道和中间件都按照规范使用settings.py.
  • 在抓取器完成之前,我很高兴阻止该进程.管道将数据转储到数据库中,这是在我完成爬网以完成测试后我将要检查的数据库的内容.

那么,任何人都可以帮助我吗?我在网上看到过一些例子,但它们要么是针对多个蜘蛛的黑客,要么是绕过Twisted's阻挡自然,或者不使用Scrapy 0.14或更高版本.我只需要一些非常简单的东西.:-)

python scrapy web-scraping

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

在Cocoa中为NSMenuItem设置目标/操作的正确方法?

我正在进行一些初步的Cocoa编程,我遇到了一些真正的困难.

从本质上讲,我有一个NSStatusBar与项目NSMenu相连的菜单.菜单有一个NMMenuItem.在IB中,我将NSMenuItem连接到一个NSObject本身设置为ApplicationDelegate类的NSMenuItem ; 然后,我将Received Actions设置IBAction为ApplicationDelegate中的方法.我认为一切都正确连接,除非我运行程序并单击菜单项时IBAction不调用该方法.我真的无法解决这个问题.这是相关的代码.

应用程序委托h文件:

#import <Cocoa/Cocoa.h>

@interface sssAppDelegate : NSObject <NSApplicationDelegate> {
    IBOutlet NSMenu *statusMenu;
    NSStatusItem *statusItem;
}

- (IBAction)showPreferencePanel:(id)sender;

@end
Run Code Online (Sandbox Code Playgroud)

应用程序委托m文件:

#import "sssAppDelegate.h"
@implementation sssAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application 
}

-(void)awakeFromNib{
    statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength] retain];
    [statusItem setMenu:statusMenu];
    [statusItem setTitle:@"Status"];
    [statusItem setHighlightMode:YES];
}


- (IBAction)showPreferencePanel:(id)sender {
    NSLog(@"Hello World!");
}

@end 
Run Code Online (Sandbox Code Playgroud)

正如我所说,在IB我已经连接NSMenustatusMenu的应用程序委托(因此菜单下的所有显示出来NSStatusBar …

cocoa interface-builder nsstatusitem nsmenuitem ibaction

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

正则表达式匹配对象尺寸

我会把它放在那里:我对正则表达式很糟糕.我试图想出一个来解决我的问题,但我真的不太了解它们...

想象一下以下几句话:

  • 你好,等等.它大约是11 1/2"x 32".
  • 尺寸为8 x 10-3/5!
  • 可能在22"x 17"区域的某个地方.
  • 卷很大:42 1/2"x 60码.
  • 它们都是5.76乘8帧.
  • 是的,也许它长约84厘米.
  • 我想13/19".
  • 不,它实际上可能是86厘米.

我希望尽可能干净地从这些句子中提取项目维度.在完美的世界中,正则表达式将输出以下内容:

  • 11 1/2"x 32"
  • 8 x 10-3/5
  • 22"x 17"
  • 42 1/2"x 60码
  • 5.76乘8
  • 84厘米
  • 13/19"
  • 86厘米

我想象一个适用以下规则的世界:

  • 以下是有效单位:{cm, mm, yd, yards, ", ', feet}虽然我更喜欢考虑任意一组单位的解决方案,而不是上述单位的明确解决方案.
  • 尺寸总是以数字形式描述,可能有也可能没有跟随它的单位,可能有也可能没有小数或小数部分.例如,允许由其自身的小数部分组成4/5".
  • 小数部分总是/将分子/分母分开,人们可以假设各部分之间没有空间(尽管如果有人认为这很好!).
  • 尺寸可以是一维的或二维的,在这种情况下,人们可以假定以下两种尺寸可以接受:{x, by}.如果一个维度只是一维的,那么它必须具有上述集合中的单位,即,22 cm是,.333不是,也不是4.33 oz.

为了向你展示我对正则表达式的无用(并告诉我至少尝试过!),我就这么做了...

[1-9]+[/ ][x1-9]
Run Code Online (Sandbox Code Playgroud)

更新(2)

你们这些人非常快速有效!我将添加一些以下正则表达式未涵盖的测试用例:

  • 最后一个测试用例是12码x.
  • 最后一个测试案例是99厘米.
  • 这句话没有尺寸:342/5553/222.
  • 三个维度?22"x 17"x 12 cm
  • 这是一个产品代码:c720与另一个数字83 x更好.
  • 一个数字本身21.
  • 体积不应与0.332盎司相匹配.

这些应该导致以下结果(#表示什么都不匹配): …

regex parsing text nlp text-extraction

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

使用Python自动更新SSH配置文件的优选方法?

我正在使用Fabric自动化我的一些工作流程,其中大部分涉及操纵EC2实例.

我正在寻找一种方法来保持我的.ssh/config文件是最新的,因为我经常启动并关闭EC2实例,如果我可以轻松地调试它们以进行调试等,这对我很有帮助.

我的SSH配置文件中的条目如下所示

Host ins_id
Hostname xxxxxxxx.com
User ubuntu
IdentityFile ~/.ssh/kp.pem
Run Code Online (Sandbox Code Playgroud)

目前,我正在做类似以下的事情(利用Fabricboto),坦率地说这是一种垃圾方法:

def my_cool_spin_up_function(self):
    . . .
    . . .
    ssh_conf = os.path.join(homedir, '.ssh/config')
    ssh_info = '\n'.join(['Host %s'         % name,
                          'Hostname %s'     % ins.dns_name,
                          'User %s'         % env.user,
                          'IdentityFile %s' % kp_loc,
                          '\n'])
    w_com = 'echo %s | cat - %s | tee %s > /dev/null' % (ssh_info, ssh_conf, ssh_conf)
    local(w_com)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这只会在每次调用时都保留在我的配置文件之前,这很好,因为SSH在配置中为每个主机获取第一部分,但这意味着文件会逐渐增加...

我想知道是否有任何Python库允许将其.ssh/config视为更多的配置文件,其相关部分可以随时更新.例如,如果您可以简单地将其.ssh/config视为字典并抽象出文件读/写,那将是非常棒的...

谢谢你的任何建议!

python ssh configuration amazon-ec2 fabric

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

你如何相互依赖处理同一模块中的多个Python类?

我正在使用ODM库,并且当它们相关时,我将文档定义为同一模块中的类.我遇到了一个循环依赖问题,因为我之前在Python中没有遇到过这个问题,我不知道如何告知类别彼此的存在.例:

''' docs.py '''
from mongoengine import Document
from mongoengine.fields import StringField, ReferenceField, ListField


class Base(Document):
    some_field      = StringField()


class Foo(Base):
    other_field     = StringField()
    another_field   = ReferenceField(Bar)


class Bar(Base):
    other_field     = StringField()
    another_field   = ListField(ReferenceField(Foo))
Run Code Online (Sandbox Code Playgroud)

就目前而言,Python将抛出一个NameError因为Bar当解释器在类中的文件中获取对它的引用时没有定义Foo.我如何告诉Python不要担心,并且类定义将很快出现?

python import class

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

如何使用Mock库修补Python类

我在修补课程时遇到了麻烦.我正在尝试修补属于Scrapy的东西 - 一个HtmlXpathSelector类.

这是一些代码:

from scrapy.selector import HtmlXPathSelector
from mock import MagicMock, patch

with patch('scrapy.selector.HtmlXPathSelector') as MockHtml:
    instance = MockHtml.return_value
    instance.method.return_value = 'foo'
    example = HtmlXPathSelector()
    print type(example)
    assert example is instance
    assert example.method == 'foo'
Run Code Online (Sandbox Code Playgroud)

结果是:

<class 'scrapy.selector.lxmlsel.HtmlXPathSelector'>
Traceback (most recent call last):
  File "<stdin>", line 6, in <module>
AssertionError
>>>
Run Code Online (Sandbox Code Playgroud)

这个例子和Mock库教程中的例子差不多.知道为什么它不起作用吗?

python unit-testing mocking scrapy python-mock

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

在Pyramid中,如何从视图中返回原始HTML?

我是Pyramid的新手(对于一般的Web框架来说还是个新手).

我正试图进入可以从视图中返回原始HTML的阶段,以便我可以标记从我的mongoDB存储返回的数据.

__init__.py的金字塔项目是标准的:

def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
config = Configurator(root_factory = Root, settings = settings)
config.add_view('hermesweb.views.my_view',
                context = 'hermesweb:resources.Root',
                renderer = 'hermesweb:templates/mytemplate.pt')
config.add_static_view('static', 'hermesweb:static', cache_max_age = 3600)
views.myDB = connect() # connect to my mongoDB
Run Code Online (Sandbox Code Playgroud)

templates/mytemplate.pt看起来像这样:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal">
<head><title>My test title. . . </title></head>
<body>
    <div>
        <h2>Perform a search</h2>
        <form method="GET" action="">
            <div>
                <input type="text" name="id"/>
            </div>
            <input …
Run Code Online (Sandbox Code Playgroud)

html python mongodb pyramid

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

一对多的关系SQLAlchemy相互依赖

我正在努力让以下模型协同工作.首先,情景如下:

  1. 用户可以拥有多个电子邮件地址,但每个电子邮件地址只能与一个用户关联;
  2. 每个用户只能有一个主电子邮件地址(将其视为当前的电子邮件地址).

电子邮件地址是用户的ID,因此他们必须始终拥有一个,但是当他们更改它时,我想跟踪他们过去使用过的其他内容.到目前为止,设置是有一个帮助表user_emails,在电子邮件和用户之间保持联系,我听说不应该将其设置为使用声明性SQLAlchemy方法的类(虽然我不知道为什么).另外,我认为我需要使用是正确的,use_alter=True因为在插入之前users表不会知道外键email_id吗?

models.py 看起来像这样:

"""models.py"""
user_emails = Table('user_emails', Base.metadata,
                Column('user_id', Integer, ForeignKey('users.id'),
                       primary_key=True),
                Column('email', String(50), ForeignKey('emails.address'),
                       primary_key=True))

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('usr_id_seq', start=100, increment=1), 
                primary_key=True)
    email_id = Column(String(50),
                      ForeignKey('emails.address', use_alter=True, name='fk_email_id'),              
                      unique=True, nullable=False)
    first = Column(String(25), unique=True, nullable=False)
    last = Column(String(25), unique=True, nullable=False)

    def __init__(self, first, last):
        self.first = first
        self.last = last

class Email(Base):
    __tablename__ = 'emails'
    address = Column(String(50), unique=True, primary_key=True)
    user …
Run Code Online (Sandbox Code Playgroud)

python database database-design sqlalchemy

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

使用TAL,变色龙和金字塔的麻烦重复元素

我真的很难让TAL和Chameleon / Pyramid表现出色。。。

我在Pyramid中有一个视图,该视图返回例如以下内容:

def view(request):
    return {'results' : [ {'name':'alice', 'value':22}, 
                          {'name':'bob', 'value':11},
                          {'name':'charlie', 'value':33} ] }
Run Code Online (Sandbox Code Playgroud)

我有一个包含以下HTML模板:

<!DOCTYPE html>
<html>
<head></head>
<body>
<table>
    <thead>
        <tr>
            <td>Keyword</td>
            <td class="center">Mean Position</td>
        </tr>
    </thead>
    <tbody>
        <tr tal:repeat"row results">
            <td>${row.name}</td>
            <td>${row.value}</td>
        </tr>
    </tbody>
</table>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我希望以下内容的HTML输出:

<table>
    <thead>
    <tr class="odd">
        <td>Name</td>
        <td class="centre">Age</td>
    </tr>
    </thead>
    <tbody>
        <tr>
            <td>alice</td>
            <td>22</td>
        </tr>
        <tr>
            <td>bob</td>
            <td>11</td>
        </tr>            
        <tr>
            <td>charlie</td>
            <td>33</td>
        </tr>
    </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行此命令时,Pyramid引发错误:

raise ParseError("Unexpected end tag.", token)
ParseError: Unexpected end tag.
- …
Run Code Online (Sandbox Code Playgroud)

python pyramid chameleon template-tal

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