Bottle Cork会创建一个用户,但它不会将其保存到数据库中

时间:2014-07-13 10:05:38

标签: python sqlite bottle

我使用Bottle Cork与SQLite后端进行身份验证并尝试创建用户:

@bottle.post('/ajax/users/create/')
def create_user():
    response.content_type = 'application/json'
    password = bottle.request.forms.get('password')
    username = bottle.request.forms.get('username')
    role = bottle.request.forms.get('role')
    ret = create_user_by_admin(username, password, role)
    response.content_type = 'application/json'
    return dumps({"status": ret.get('ok')})

def create_user_by_admin(username, password, role):
    try:
        auth.create_user(username, role, password)
        return dict(ok=True, msg='')
    except Exception, e:
        return dict(ok=False, msg=e.message)

瓶子应用日志:

127.0.0.1 - - [13/Jul/2014 13:56:38] "POST /ajax/users/create/ HTTP/1.1" 200 16

jQuery帖子回复:{" status":true}

如果我是第一次创建用户,则响应为True(用户已成功创建),但数据库中没有新用户。下一个响应将返回False并显示错误消息:

127.0.0.1 - - [13/Jul/2014 13:56:38] "POST /ajax/users/create/ HTTP/1.1" 200 16
/home/art/projects/leggera/app/views.py:33: DeprecationWarning: BaseException.message        has been deprecated as of Python 2.6
return dict(ok=False, msg=e.message)

这意味着,用户已创建,但......数据库中仍然没有新用户(我使用SQLiteMan查看数据库的内容)!
数据库未锁定,chmod +rwx ...如何解决此问题?

2 个答案:

答案 0 :(得分:1)

后端实现并未提交事务。

Cork问题跟踪器中有两个问题显示了人们如何解决这个问题:

  • Issue 66是一个拉取请求,用于更新示例以添加backend.connection.commit()次来电:

    auth.create_user(username, role, password)
    auth._store.connection.commit()
    
  • Issue 63是关于SQLite后端的线程问题;但是包含的代码使用后端的子类来设置隔离级别以强制自动提交。

请注意,问题63表明后端完全不适合多线程环境;我使用SQLAlchemy后端,因为它正确处理SQLite和线程。

快速粗略地看一眼该后端也会让它看起来像是不会处理提交。

答案 1 :(得分:1)

我认为该解决方案是在sqlite_backend.py中重新定义函数(save_users,save_roles,save_pending_registrations):

def save_users(self): self.connection.commit() def save_roles(self): self.connection.commit() def save_pending_registrations(self): self.connection.commit()