Авторизация тестирования подразделения в приложении Pylons не удается; Печенье не были правильно установлены или записаны

StackOverflow https://stackoverflow.com/questions/2731907

Вопрос

У меня есть проблемы с тестами под управлением для авторизации в приложении пилонов. Похоже, что определенные файлы cookie, установленные в тестовом случае, могут быть неправильно написаны или анализируются. Печенье работает нормально при ударе приложения с браузером.

Вот мой тестовый корпус внутри генерируемого пасты TestController:

def test_good_login(self):
    r = self.app.post('/dologin', params={'login': self.user['username'], 'password': self.password})
    r = r.follow() # Should only be one redirect to root
    assert 'http://localhost/' == r.request.url
    assert 'Dashboard' in r

Это должно проверить, что логин существующей учетной записи пересылает пользователю на страницу приборной панели. Вместо этого произойдет, что пользователь перенаправляется обратно в логин. Первый пост работает, устанавливает пользователь на сеанс и возвращает cookies. Хотя эти печенья отправляются в следующем запросе, они, кажется, не проанализированы.

Я начинаю, установив точку останова в начале вышеуказанного метода и посмотрите, что возвращает ответ на логин:

> nosetests --pdb --pdb-failure -s foo.tests.functional.test_account:TestMainController.test_good_login
Running setup_config() from foo.websetup
> /Users/istevens/dev/foo/foo/tests/functional/test_account.py(33)test_good_login()
-> r = self.app.post('/dologin', params={'login': self.user['username'], 'password': self.password})
(Pdb) n
> /Users/istevens/dev/foo/foo/tests/functional/test_account.py(34)test_good_login()
-> r = r.follow() # Should only be one redirect to root
(Pdb) p r.cookies_set
{'auth_tkt': '"4c898eb72f7ad38551eb11e1936303374bd871934bd871833d19ad8a79000000!"'}
(Pdb) p r.request.environ['REMOTE_USER']
'4bd871833d19ad8a79000000'
(Pdb) p r.headers['Location']
'http://localhost/?__logins=0'

Создается сеанс, и файл cookie отправляется обратно. Браузер перенаправляется в корню, а не вход в систему, который также указывает на успешный вход в систему. Если я пойду мимо следующего (), я получаю:

> /Users/istevens/dev/foo/foo/tests/functional/test_account.py(35)test_good_login()
-> assert 'http://localhost/' == r.request.url
(Pdb) p r.request.headers
{'Host': 'localhost:80', 'Cookie': 'auth_tkt=""\\"4c898eb72f7ad38551eb11e1936303374bd871934bd871833d19ad8a79000000!\\"""; '}
(Pdb) p r.request.environ['REMOTE_USER']
*** KeyError: KeyError('REMOTE_USER',)
(Pdb) p r.request.environ['HTTP_COOKIE']
'auth_tkt=""\\"4c898eb72f7ad38551eb11e1936303374bd871934bd871833d19ad8a79000000!\\"""; '
(Pdb) p r.request.cookies
{'auth_tkt': ''}
(Pdb) p r
<302 Found text/html location: http://localhost/login?__logins=1&came_from=http%3A%2F%2Flocalhost%2F body='302 Found...y.  '/149>

Это указывает на меня, что печенье было передано по запросу, хотя с сомнительным выбегом. Появляется в среду без сеанса, созданного по предварительному запросу. Печенье было скопировано в среду от заголовков, но файлы cookie в запросе кажутся неправильно установленными. Наконец, пользователь перенаправляется на страницу входа в систему, указывая, что пользователь не вошел в систему.

Авторизация в приложении осуществляется через repoze.who и repoze.who.plugins.ldap с Repoze. Я использую запас tests.TestController Создано в пасте:

class TestController(TestCase):

    def __init__(self, *args, **kwargs):
        if pylons.test.pylonsapp:
            wsgiapp = pylons.test.pylonsapp
        else:
            wsgiapp = loadapp('config:%s' % config['__file__'])
        self.app = TestApp(wsgiapp)
        url._push_object(URLGenerator(config['routes.map'], environ))
        TestCase.__init__(self, *args, **kwargs)

Это webtest.TestApp, Кстати.

Кодировка печенья выполняется в WebTest.testapp с помощью cookie:

>>> from Cookie import _quote
>>> _quote('"84533cf9f661f97239208fb844a09a6d4bd8552d4bd8550c3d19ad8339000000!"')
'"\\"84533cf9f661f97239208fb844a09a6d4bd8552d4bd8550c3d19ad8339000000!\\""'

Я доверяю, что это правильно.

Я предполагаю, что что-то на стороне отклика неверно разбирает данные cookie в cookies В запросе на сервер. Но что? Есть идеи?

Это было полезно?

Решение

Эта проблема исчезла после понижения WebTest с 1,2,1 до 1,2.

Другие советы

Вопрос постоянно появился для меня независимо от версии WebTest. Однако после того, как я заметил, что когда печенье сначала настроен, он использовал 127.0.0.1 в качестве значения Remote_addr, но на втором запросе он изменился на 0,0.0,0.

Если бы я сделал запрос на получение и установить Remote_addr до 127.0.0.1 все было хорошо!

response = response.goto(url('home'), extra_environ=dict(REMOTE_ADDR='127.0.0.1'))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top