我使用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
...如何解决此问题?
答案 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()