2017-02-10 8 views
1

Я использую Twisted-Klein в качестве сервера. Вот простой пример:HTTP Basic Auth на сервере Twisted-Klein

from klein import Klein 


app = Klein() 


@app.route('/health', methods=['GET']) 
def health_check(request): 
    return '' 


@app.route('/query/<path:expression>', methods=['GET']) 
def query(request, expression): 
    return 'Expression: {0}'.format(expression) 


if __name__ == '__main__': 
    app.run(host='0.0.0.0', port=8000) 

Как я могу добавить HTTP Basic Auth в query API конечной точки? С Flask это просто: http://flask.pocoo.org/snippets/8/

Но я не могу найти примеры того, как это сделать на сервере Twisted-Klein.

ответ

2

Скрученный сам имеет support for HTTP basic (and digest) authentication, factored как ресурс wrapper, который может быть применен к любому другому ресурсу.

Ваш пример klein не демонстрирует его, но klein может (должен, действительно) create a resource from your app использовать веб-сервер Twisted.

Вы можете объединить их что-то вроде:

import attr 
from zope.interface import implementer 
from twisted.cred.portal import IRealm 
from twisted.internet.defer import succeed 
from twisted.cred.portal import Portal 
from twisted.web.resource import IResource 
from twisted.web.guard import HTTPAuthSessionWrapper, BasicCredentialFactory 
from klein import Klein 

app = Klein() 
# ... define your klein app 

@implementer(IRealm) 
@attr.s 
class TrivialRealm(object): 
    resource = attr.ib() 

    def requestAvatar(self, avatarId, mind, *interfaces): 
     # You could have some more complicated logic here, but ... 
     return succeed((IResource, self.resource, lambda: None)) 

def resource(): 
    realm = TrivialRealm(resource=app.resource()) 
    portal = Portal(realm, [<some credentials checkers>]) 
    credentialFactory = BasicCredentialFactory(b"http auth realm") 
    return HTTPAuthSessionWrapper(portal, [credentialFactory]) 

Вы можете запустить это в соответствии с the klein docs for using twistd web.

+0

Спасибо! Я постараюсь реализовать это. –

+0

Когда я пытаюсь запустить сервер с помощью 'twistd', я получаю следующую ошибку:' no module named 'application''. Должен ли я создавать файл 'setup.py' и как? Может быть, лучше, если я открою еще один вопрос о этом. –

+0

Что вы использовали в командной строке twistd? Ошибка в звуках типа «приложение», например, вы пытаетесь использовать ее функцию WSGI, но в документах klein, которые я связал, предлагается параметр '--class', а не WSGI. –