【问题标题】:Get username information from a cookie in Pyramid (Python)从 Pyramid (Python) 中的 cookie 获取用户名信息
【发布时间】:2015-06-03 18:37:45
【问题描述】:

我正在编写一个 Pyramid 应用程序,它允许在数据库表中注册任意数量的用户。这是我的登录代码:

@view_config(route_name='login', renderer='templates/login.jinja2')
def login(request):
    username = request.params.get('username', '')
    error = ''
    if request.method == 'POST':
        error = 'Login Failed'
        authenticated = False
        try:
            authenticated = do_login(request)
        except ValueError as e:
            error = str(e)
        if authenticated:
            headers = remember(request, username)
            return HTTPFound(request.route_url('home'), headers=headers)
    return {'error': error, 'username': username}

在哪里

def do_login(request):
    username = request.params.get('username', None)
    password = request.params.get('password', None)
    if not (username and password):
        raise ValueError('both username and password required')
    manager = BCRYPTPasswordManager()
    cur = request.db.cursor()
    try:
        cur.execute("SELECT password FROM users WHERE username=%s", [username])
    except psycopg2.Error:
        raise ValueError("That username already exists!")
    actual_password = cur.fetchall()[0][0]  # Extrrrract the data
    return manager.check(actual_password, password)

一旦给定用户通过身份验证,我想在所有视图上显示用户名。我的理解是身份验证信息存储在cookie中,并且该cookie看起来像(auth_tkt =“”)。如何从此 cookie 中获取“当前”用户名?

还是我比我意识到的更困惑?

【问题讨论】:

  • PS,我知道我会在 psycopg2.Error 的情况下引发错误的错误消息。这只是一个错字。

标签: python authentication cookies pyramid


【解决方案1】:

您可以通过调用request.authenticated_userid 获取经过身份验证的用户名。您可以在official docs 中找到更多相关信息。

我也倾向于将整个user 对象(和dbsession)存储在request 中,如下所示:

def includeme(config):
    from .models.user import User

    settings = config.get_settings()
    dbsession_factory = get_dbsession_factory(settings)
    config.add_request_method(
        lambda request: dbsession_factory(),
        'dbsession',
        reify=True)
    config.add_request_method(
        lambda request: User.get_by_username(
            request.dbsession,
            request.authenticated_userid),
        'user',
        reify=True)

def get_dbsession_factory(settings):
    engine = engine_from_config(settings, 'sqlalchemy.')
    dbsession_factory = sessionmaker()
    register(dbsession_factory)
    dbsession_factory.configure(bind=engine)
    return dbsession_factory 

然后您只需在您的应用程序中调用config.include('your_app.models') __init__

【讨论】:

  • 我能够使折旧的 pyramid.security.authenticated_userid(request) 返回我正在寻找的东西。然而,较新的 pyramid.request.Request.authenticated_userid 返回一个我不知道如何处理的“属性对象”。我想我可能把它叫错了(但它是一个属性而不是一个方法,所以我没有完全调用它)。你能用 pyramid.request.Request.authenticated_userid 给我看一段代码吗?
猜你喜欢
  • 2019-05-30
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多