我的应用程序使用范围会话和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)
这里的问题是,由于很多,这是通过异步工人完成的,它是可能的一个工作是,虽然中途插入Bike有id=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) 我对如何做一些我认为非常简单的事情感到有些困惑.我有一个简单的应用程序使用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(来自Java背景),我对我在Java中使用线程的问题有疑问.
我的程序将使用工作人员定期从一些Web服务中读取一些数据.每个工作人员将定期在不同时间呼叫Web服务.
根据我的阅读,最好使用该multiprocessing模块并将工作人员设置为继续执行数据收集任务的独立流程.在Java上我会做一些概念上类似的东西,但是使用线程.虽然看起来我可以在Python中使用线程,但我将失去多CPU利用率.
这是我的问题的核心:网络服务受到限制,即工人不得每秒呼叫超过x次.工人检查他们是否可以请求数据的最佳方式是什么?
我很困惑是否应该使用以下方法实现:
nmap,在进程之间共享一些数据/值,描述它们是否可以调用Web服务.Manager()对象,监视每秒的呼叫,并通知工作人员是否有权进行呼叫.当然,我想这可能归结为我如何跟踪每秒的呼叫数.我想一个选项是让工作人员在某个其他对象上调用一个函数,这会调用Web服务并记录当前的调用次数/秒.另一种选择是调用Web服务的函数在每个worker中生存,并且每次调用Web服务时都要向管理对象发送消息.
欢迎思考!
我想从Python模块开始Scrapy中的爬虫.我想基本上模仿的本质$ scrapy crawl my_crawler -a some_arg=value -L DEBUG
我有以下几点:
我可以很高兴使用scrapy上面指定的命令运行我的项目,但是我正在编写集成测试,我想以编程方式:
settings.py具有my_crawlername属性的设置和具有name属性的爬虫启动爬网(我可以从我的测试模块轻松实例化此类.settings.py.那么,任何人都可以帮助我吗?我在网上看到过一些例子,但它们要么是针对多个蜘蛛的黑客,要么是绕过Twisted's阻挡自然,或者不使用Scrapy 0.14或更高版本.我只需要一些非常简单的东西.:-)
我正在进行一些初步的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我已经连接NSMenu到statusMenu的应用程序委托(因此菜单下的所有显示出来NSStatusBar …
我会把它放在那里:我对正则表达式很糟糕.我试图想出一个来解决我的问题,但我真的不太了解它们...
想象一下以下几句话:
- 你好,等等.它大约是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盎司相匹配.
这些应该导致以下结果(#表示什么都不匹配): …
我正在使用Fabric自动化我的一些工作流程,其中大部分涉及操纵EC2实例.
我正在寻找一种方法来保持我的.ssh/config文件是最新的,因为我经常启动并关闭EC2实例,如果我可以轻松地调试它们以进行调试等,这对我很有帮助.
我的SSH配置文件中的条目如下所示
Host ins_id
Hostname xxxxxxxx.com
User ubuntu
IdentityFile ~/.ssh/kp.pem
Run Code Online (Sandbox Code Playgroud)
目前,我正在做类似以下的事情(利用Fabric和boto),坦率地说这是一种垃圾方法:
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视为字典并抽象出文件读/写,那将是非常棒的...
谢谢你的任何建议!
我正在使用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不要担心,并且类定义将很快出现?
我在修补课程时遇到了麻烦.我正在尝试修补属于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库教程中的例子差不多.知道为什么它不起作用吗?
我是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) 我正在努力让以下模型协同工作.首先,情景如下:
电子邮件地址是用户的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) 我真的很难让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 ×10
pyramid ×2
scrapy ×2
sqlalchemy ×2
amazon-ec2 ×1
celery ×1
chameleon ×1
class ×1
cocoa ×1
concurrency ×1
database ×1
fabric ×1
flask ×1
html ×1
ibaction ×1
import ×1
mocking ×1
mongodb ×1
mysql ×1
nlp ×1
nsmenuitem ×1
nsstatusitem ×1
parsing ×1
python-mock ×1
regex ×1
ssh ×1
template-tal ×1
text ×1
unit-testing ×1
web-scraping ×1
werkzeug ×1