2015-06-02 70 views
1

我正在寫一個金字塔應用程序,允許在數據庫表中註冊任意數量的用戶。這是我的登錄代碼:從金字塔(Python)中的cookie獲取用戶名信息

@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獲取「當前」用戶名?

還是我比我意識到更困惑?

+0

PS,我知道我在psycopg2.Error的情況下提出了錯誤的錯誤信息。這只是一個錯字。 –

回答

0

您可以通過調用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__

+0

我能夠使折舊的金字塔.security.authenticated_userid(請求)返回我正在尋找的東西。然而,較新的pyramid.request.Request.authenticated_userid返回一個'屬性對象',我不知道該怎麼處理。我想我可能會說錯了(但它的財產不是一種方法,所以我不完全稱它)。你可以使用pyramid.request.Request.authenticated_userid正確顯示代碼片段嗎? –

+0

沒關係。得到它了。謝謝! –