pickle错误:not pickle请求对象

2024-10-01 17:39:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道不可能pickle一个金字塔请求对象,但我似乎找不到要将Request对象发送到哪里。在

考虑以下因素:

@task
def do_consignment_task(store, agent):
    print "GOTHERE IN TASK"
    s = sqlahelper.get_session()
    consign = store.gen_consignment()
    ca = Agents.by_id(store.consignment_agents_id)
    consign.consignment_agents_id = ca.id
    consign.consignment_teamleader_id = ca.ou[0].lead_agents_id
    consign.consignment_timestamp = func.now()
    consign.created_by_agent_id = agent.id
    consign.complete_stamp = func.now()
    consign.sims =  store.sims
    consign.status = "SUCCESS"
    print "GOT BEFORE LOOP " 
    for sim in store.sims:
        if sim in consign.sims:
            continue
        else:
            consign.sims.append(sim)
    s.add(consign)
    transaction.savepoint()
    print "GOT AFTER SAVEPOINT"
    for sim in consign.sims:
        is_reconsign = sim.consignment_agent or sim.consignment_teamlead
        if is_reconsign:
            if not sim.consignment_history:
                sim.consignment_history = []
            sim.consignment_history.append(dict(
                stamp=sim.consignment_timestamp,
                consignment_agent_id=sim.consignment_agents_id,
                consignment_teamleader_id=sim.consignment_teamleader_id,
                by_agent_id=agent.id
            ))
        s.query(
            Sims
        ).filter(
            Sims.iccid == sim.iccid
        ).update(
            {
                "consignment_agents_id": consign.consignment_agents_id,
                "consignment_history": sim.consignment_history,
                "consignment_teamleader_id": ca.ou[0].lead_agents_id,
                "consignment_timestamp": func.now(),
                "modify_stamp": func.now(),
                "consignments_id": consign.id

            },
            synchronize_session=False
        )
        print "GOT BEFORE COMMIT"
        transaction.savepoint()
    print "THIS IS THE ID ID ID ID ID ID : ", consign.id

我把这个函数叫做:

^{pr2}$

运行此代码时,出现以下错误:

EncodeError: Can't pickle <class 'pyramid.util.Request'>: attribute lookup pyramid.util.Request failed

我不会发送selfrequest对象,至少我看不到。 如何解决这个问题?我是否因为看不到请求对象而发送请求对象?在

回溯可以看到here

编辑:

好的,我已经尝试更改发送给函数的数据-我没有传递sqlalchemy对象,我正在复制store对象,它将我的代码更改为:

@task
def do_consignment_task(agent_id, **store):
    print "GOTHERE IN TASK"
    s = sqlahelper.get_session()
    cObj = USSDConsignmentsObject()
    consign = cObj.gen_consignment()
    ca = Agents.by_id(store.consignment_agents_id)
    consign.consignment_agents_id = ca.id
    consign.consignment_teamleader_id = ca.ou[0].lead_agents_id
    consign.consignment_timestamp = func.now()
    consign.created_by_agent_id = agent_id
    # etc

以及:

if self.store.finalise:
    try:
        # del self.service
        store = self.store.__dict__.copy()
        agent_id = self.agent.id
        print store
        print agent_id
        # print help(store)
        do_consignment_task.delay(agent_id, **store)
        transaction.commit()
        #etc

但是这仍然给我同样的错误:|


Tags: 对象storeidtaskbysimcaagent
1条回答
网友
1楼 · 发布于 2024-10-01 17:39:02

尽量不要序列化金字塔请求对象。当你与芹菜任务交互时,你应该把它看作一个独立的过程。在

给它提供所有它需要的信息来完成它的工作。请注意,您需要将这些信息序列化。在

所以自助商店可能包含不现实的属性引用。在

也许在store对象上创建一个方法,该方法返回一个干净的dictionary对象。在

def serialize(self):
    data = {}
    data["element1"] = self.element1
    data["element2"] = self.element2
    data["element3"] = self.element3
    return data

那么当你想调用delay方法时,一定要使用存储.序列化()而不是存储或dict。在

相关问题 更多 >

    热门问题