2016-11-08 3 views
0

Я использую Python 2.7.5 с web.py (v0.38), установленным на машине Linux. Ниже мой код в самой основной форме (webhooks.py)Как включить HTTPS на Python 2.7 web.py?

#!/usr/bin/python 

import web 

urls = ('/.*','WebHooks') 
app = web.application(urls, globals()) 

class WebHooks: 
    def POST(self): 
     raw_payload = web.data() 
     json_encode = json.loads(raw_payload) 

if __name__ == '__main__': 
    app.run() 
  1. исполняю python webhooks.py 9999
  2. Это открывает локальный порт http://0.0.0.0:9999/

Мой вопрос: Я прочитали документацию, расположенную here, и я в тупике. Кто-нибудь сможет помочь мне открыть URL-адрес HTTPS? https://0.0.0.0:9999/

То, что я пытался

Добавьте следующее в мой код для тестирования:

response = app.request("/.*", https=True) 

Я получаю сообщение об ошибке: AttributeError: 'module' object has no attribute 'request'

Я решил эту проблему с pip install urllib.py, а затем добавив import urllib в начало моего кода, но я закончил с кучей ошибок:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/site-packages/web/application.py", line 239, in process 
    return self.handle() 
    File "/usr/lib/python2.7/site-packages/web/application.py", line 230, in handle 
    return self._delegate(fn, self.fvars, args) 
    File "/usr/lib/python2.7/site-packages/web/application.py", line 461, in _delegate 
    cls = fvars[f] 
KeyError: u'WebHooks' 

Traceback (most recent call last): 
    File "/usr/lib/python2.7/site-packages/web/application.py", line 239, in process 
    return self.handle() 
    File "/usr/lib/python2.7/site-packages/web/application.py", line 229, in handle 
    fn, args = self._match(self.mapping, web.ctx.path) 
AttributeError: 'ThreadedDict' object has no attribute 'path' 

ответ

2

Вы идете по неверному пути, но не беспокойтесь. Используемый бит response = app.request("/.*", https=True) относится к вашей заявке , делая запрос https, а не обработки запрос https.

См http://webpy.org/cookbook/ssl

Внутренне web.py использует CherryPyWSGIServer. Чтобы обрабатывать https, вам необходимо предоставить серверу ssl_certificate и ssl_key. Очень просто, добавьте несколько строк, прежде чем вызвать app.run():

if __name__ == '__main__': 
    from web.wsgiserver import CherryPyWSGIServer 
    ssl_cert = '/path-to-cert.crt' 
    ssl_key = '/path-to-cert.key' 
    CherryPyWSGIServer.ssl_certificate = ssl_cert 
    CherryPyWSGIServer.ssl_private_key = ssl_key 
    app.run() 

Конечно, в полном решении, вы, вероятно, хотите апаш или Nginx обрабатывать часть протокола HTTPS, но выше идеально подходит для небольших приложений и тестирование.

+0

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

+1

Обновление: ваше решение сработало! Для других читателей, которые также пытаются это сделать, я должен был убедиться, что у меня есть две вещи до того, как он работает. Во-первых, вам нужно установить openssl-devel в вашу систему, а второй - использовать pip для установки pyOpenSSL. –