【问题标题】:How to get started on using Bottle-Cork with MongoDB?如何开始在 MongoDB 中使用 Bottle-Cork?
【发布时间】:2015-05-15 02:59:17
【问题描述】:

我对瓶子和软木塞很陌生。我正在开发一个使用 Bottle 作为框架和 MongoDB 作为后端的 Web 应用程序。我试图弄清楚如何使用 Cork 实现用户登录系统。

我阅读了 Cork 的文档和示例,并尝试进行设置。我已经成功地将 cork 实例与 Mongodb 连接起来,因为我看到了作为参数(后端)传递给 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)

【问题讨论】:

    标签: python mongodb bottle web-frameworks


    【解决方案1】:

    我从没想过我要在 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 在其源代码中使用的相同的哈希方法即可。只需将你的密码传入hash方法并打印出返回的hash。然后将hash传入下面注释掉的代码中以创建用户。这样你就知道密码并能够登录你创建的用户)

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

    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

    【讨论】:

      猜你喜欢
      • 2014-09-03
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      相关资源
      最近更新 更多