MongoDB 如何开始使用 Bottle-Cork?

How to get started on using Bottle-Cork with MongoDB?

我对 Bottle and Cork 还很陌生。我正在开发一个使用 Bottle 作为框架并使用 MongoDB 作为后端的网络应用程序。我想弄清楚如何使用 Cork 实现用户登录系统。

我阅读了 Cork 的文档和示例,并尝试进行设置。我已经成功地用 Mongodb 连接了 cork 实例,因为我看到了数据库名称,我将其作为参数(后端)传递给 Cork() 构造函数,显示在 mongo shell 中.但是后来就不知道怎么继续了。

我阅读了所有 Cork 方法的源代码,它们对我来说都很有意义。但是其中很多都需要有一个具有足够角色级别的用户才能被称为 "list_roles()" 或 "create_users()"。我知道它们旨在由管理员调用。但我的问题是,当我最初根本没有用户时,如何开始创建一些用户并进行测试?

以下是我目前得到的,我只需要一些简单的指导或示例代码即可开始。如果有任何帮助,我将不胜感激!

文件名:api.py

from cork import Cork
from cork.backends import MongoDBBackend
from bottle import Bottle, redirect, static_file, request, response,HTTPResponse, HTTPError, abort, debug,run, route
import bottle
from beaker.middleware import SessionMiddleware
import pymongo

session_opts = {
   'session.type': 'cookie',
   'session.validate_key': True,
   'session.cookie_expires': True,
   'session.timeout': 3600 * 24, # 1 day
   'session.encrypt_key': 'lxy3344',
}
app = bottle.app()
app = SessionMiddleware(app, session_opts)

mb = MongoDBBackend(db_name='corkTry')
aaa = Cork(backend=mb, email_sender='kkgghhyy@gmail.com')

def postd():
    return bottle.request.forms

def post_get(name, default=''):
    return bottle.request.POST.get(name, default).strip()


# LOGIN # # LOGIN # # LOGIN # # LOGIN # # LOGIN # # LOGIN # # LOGIN # 
@bottle.route('/')
@bottle.get('/login')
def login():
    print aaa.current_user()
    redirect('/static/login.html')

@bottle.post('/login')
def login():
    print 'in post login'
    """Authenticate users"""
    username = post_get('username')
    password = post_get('password')
    aaa.login(username, password, success_redirect='/home', fail_redirect='/login')

# REGISTER # # REGISTER # # REGISTER # # REGISTER # # REGISTER # # REGISTER #
@bottle.get('/register')
def register():
    redirect('/static/register.html')

@bottle.post('/register')
def register():
    # Send out register email
    aaa.register(post_get('username'), post_get('password'), post_get('email_address'))
    return 'Please check your mailbox.'

@bottle.route('/validate_registration/:registration_code')
def validate_registration(registration_code):
    # Validate registration, create user account
    aaa.validate_registration(registration_code)
    return 'Thanks. <a href="/login">Go to login</a>'


@bottle.route('/static/<filepath:path>',method='GET')
def serve_static(filepath):
    return static_file(filepath, root='./static/' )

@bottle.route('/home')
def home():
    return '''This is the home page'''

bottle.debug(True)
bottle.run(app=app,reloader = True)

好吧,我从没想过我要在 Whosebug 上 post 的第一个答案就是我自己的问题的答案,但我只是碰巧弄明白了,我真的很想分享它!!

我的第一个问题是我不知道如何在 Mongodb 数据库中创建第一个用户来测试 Cork 的功能。我尝试的第一件事是调用 Cork 提供的 register() 方法。但它引发了异常,因为我没有在数据库中定义任何角色。因此我需要先在数据库中创建角色。

我使用了在此 link:

找到的代码

https://github.com/FedericoCeratto/bottle-cork/blob/master/examples/simple_webapp_using_mongodb.py

我刚刚将方法复制到我的代码中:

def populate_mongodb_backend():
    mb = MongoDBBackend(db_name='corkTry', initialize=True)
    # mb.users._coll.insert({
    # "login": "admin",
    # "email_addr": "admin@localhost.local",
    # "desc": "admin test user",
    # "role": "admin",
    # "hash": "cLzRnzbEwehP6ZzTREh3A4MXJyNo+TV8Hs4//EEbPbiDoo+dmNg22f2RJC282aSwgyWv/O6s3h42qrA6iHx8yfw=",
    # "creation_date": "2012-10-28 20:50:26.286723"
    # })
    mb.roles._coll.insert({'role': 'admin', 'val': 100})
    mb.roles._coll.insert({'role': 'editor', 'val': 60})
    mb.roles._coll.insert({'role': 'user', 'val': 50})
    return mb

(我不想直接使用我上面注释掉的代码创建admin用户,因为如果我那样做,我将无法轻易知道密码,hash是直接传入的,所以我将无法登录该用户)

(但是,如果你想直接使用我上面注释掉的代码创建用户,有一种方法可以做到。你只需要使用与 Cork 在其源代码中使用的相同的哈希方法. 只需将你的密码传入 hash 方法并打印出返回的哈希。然后将哈希传递到以下注释掉的代码中以创建用户。这样你就会知道密码并能够登录你创建的用户)

然后执行方法(只需一次!)在数据库中创建角色:

populate_mongodb_backend()

然后执行Cork提供的register方法注册一个新用户:

aaa.register('yourLogin','yourPassword','yourEmail@example.com',email_template='./views/registration_email.tpl')

registration_email.tpl:

<p>Hi {{username}}! Click <a href="localhost:8080/validate_registration/{{registration_code}}">HERE</a> to finish your registration</p>

然后用户应该在Mongodb中的"pending_registrations"中显示,您可以通过在mongo中执行以下命令来检查 shell:

use corkTry
db.pending_registrations.find()

然后你只需要去你的邮箱点击link完成注册,然后你就可以签入Mongodb执行:

db.users.find()

关于设置电子邮件发送的附加信息(我只试过 Gmail):

您需要先确保您的Gmail账户启用了IMAP,然后进行如下设置:

smtp_url='starttls://yourGmailUsername:yourGmailPassword@smtp.gmail.com:587'
aaa = Cork(backend=mb, email_sender='yourGmailUsername@gmail.com',smtp_url=smtp_url)

你可以参考下面的issue了解更多细节,这是我找到有关电子邮件设置的信息的地方:

https://github.com/FedericoCeratto/bottle-cork/issues/57