如何开始使用带有MongoDB的Bottle-Cork?

时间:2015-04-06 23:18:35

标签: python mongodb bottle web-frameworks

我对瓶子和软木很新。我正在使用Bottle作为框架并使用MongoDB作为后端的Web应用程序。我想弄清楚如何使用Cork实现用户登录系统。

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

我阅读了所有Cork方法的源代码,它们对我都有意义。但是他们中的很多人需要让具有足够角色级别的用户被称为“list_roles()”或“create_users()”。我知道它们的设计目的是由管理员调用。但我的问题是,当我最初没有用户时,如何开始创建一些用户并进行测试?

以下是我到目前为止所做的,我只需要一些简单的指导或示例代码即可开始。我真的很感激任何帮助!

filename: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)

1 个答案:

答案 0 :(得分:2)

好吧,我从来没有想到我要在Stackoverflow上发布的第一个答案是我自己的问题的答案,但我碰巧想出来了,我真的想分享它!

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

我使用了在此链接中找到的代码:

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

(我不想直接使用我在上面注释掉的代码创建管理员用户,因为如果我这样做,我将无法轻易地知道密码,哈希是直接传入的,所以我无法登录该用户)

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

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

populate_mongodb_backend()

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

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()

然后你只需要转到你的电子邮件并点击链接完成注册,然后你就可以通过执行来检查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)

您可以参考以下问题了解更多详情,我在这里找到了有关电子邮件设置的信息:

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