2015-05-06 3 views
4

Я пытаюсь создать очень простой вихревой webapp, который будет запрашивать у пользователя имя пользователя и пароль до того, как загрузится первая (и только) страница. Я использовал пример, изложенный в CherryPy документах здесь: http://cherrypy.readthedocs.org/en/latest/basics.html#authenticationBasic Auth for CherryPy webapp

Вот мой конкретный код для wsgi.py:

import cherrypy 
from cherrypy.lib import auth_basic 
from myapp import myapp 

USERS = {'jon': 'secret'} 

def validate_password(username, password): 
    if username in USERS and USERS[username] == password: 
     return True 
    return False 

conf = { 
    '/': { 
     'tools.auth_basic.on': True, 
     'tools.auth_basic.realm': 'localhost', 
     'tools.auth_basic.checkpassword': validate_password 
    } 
} 

if __name__ == '__main__': 

    cherrypy.config.update({ 
     'server.socket_host': '127.0.0.1', 
     'server.socket_port': 8080, 
    }) 

    # Run the application using CherryPy's HTTP Web Server 
    cherrypy.quickstart(myapp(), '/', conf) 

Приведенных выше код будет получить мне браузер пользователя/пасс проворной однако при нажатии кнопки ОК приглашение, я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/site-packages/cherrypy/_cprequest.py", line 667, in respond 
    self.hooks.run('before_handler') 
    File "/usr/local/lib/python2.7/site-packages/cherrypy/_cprequest.py", line 114, in run 
    raise exc 
TypeError: validate_password() takes exactly 2 arguments (3 given) 

я не уверен, где он думает, что это получить, что 3-й аргумент от. Есть предположения? Благодаря!

ответ

3

Из документации CherryPy

checkpassword: a callable which checks the authentication credentials. 
     Its signature is checkpassword(realm, username, password). where 
     username and password are the values obtained from the request's 
     'authorization' header. If authentication succeeds, checkpassword 
     returns True, else it returns False. 

Так что ваша реализация checkpassword должен следовать тем же API, который: checkpassword(realm, username, password), и то, что вы показать нам не хватает первый параметр - область.

+0

Прошу простить мое невежество, но что такое «царство»? – fender4645

+0

@ user3693009 Я могу помиловать невежество, но не лень! Первый ответ в google для 'то, что является основной базой auth'; http://stackoverflow.com/questions/12701085/what-is-the-realm-in-basic-authentication –

+0

Извините ... Я вижу в коде сейчас, где он спрашивает о королевстве (и спасибо, я сделал Google это и теперь понимаю). – fender4645