Python Ошибка рекурсии SSL -> super (SSLContext, SSLContext) .options .__ set __ (self, value) requests: RecursionError: превышена максимальная глубина рекурсии - PullRequest
0 голосов
/ 19 июня 2020

Я использую Python 3.8.3
Моя программа - это чат-приложение, использующее python -socketio с очередью redis, использующее сервер событий в контейнере docker и балансировку нагрузки с помощью nginx
Программа отлично работает на моем локальном компьютере
, но когда я пытаюсь запустить экземпляр AWS EC2 linux, библиотека pyfcm при попытке отправить уведомление Pu sh не работает, и я получаю ssl ошибка.
Я использую eventlet.monkeypatch (socket = True) в начале программы

Это ошибка

Exception in thread Thread-8:
    container    | Traceback (most recent call last):
    container    |   File "/usr/local/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    container    |     self.run()
    container    |   File "/usr/local/lib/python3.8/threading.py", line 870, in run
    container    |     self._target(*self._args, **self._kwargs)
    container    |   File "/usr/local/lib/python3.8/site-packages/socketio/server.py", line 679, in _handle_event_internal
    container    |     r = server._trigger_event(data[0], namespace, sid, *data[1:])
    container    |   File "/usr/local/lib/python3.8/site-packages/socketio/server.py", line 708, in _trigger_event
    container    |     return self.handlers[namespace][event](*args)
    container    |   File "server.py", line 37, in send_message_event
    container    |     result = push_service.notify_single_device(registration_id=mid['apns_result']['registration_id'], message_title=mid['apns_result']['message_title'], message_body=mid['apns_result']['message_body'])
    container    |   File "/usr/local/lib/python3.8/site-packages/pyfcm/fcm.py", line 116, in notify_single_device
    container    |     self.send_request([payload], timeout)
    container    |   File "/usr/local/lib/python3.8/site-packages/pyfcm/baseapi.py", line 312, in send_request
    container    |     response = self.do_request(payload, timeout)
    container    |   File "/usr/local/lib/python3.8/site-packages/pyfcm/baseapi.py", line 302, in do_request
    container    |     response = self.requests_session.post(self.FCM_END_POINT, data=payload, timeout=timeout)
    container    |   File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 578, in post
    container    |     return self.request('POST', url, data=data, json=json, **kwargs)
    container    |   File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 530, in request
    container    |     resp = self.send(prep, **send_kwargs)
    container    |   File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 643, in send
    container    |     r = adapter.send(request, **kwargs)
    container    |   File "/usr/local/lib/python3.8/site-packages/requests/adapters.py", line 439, in send
    container    |     resp = conn.urlopen(
    container    |   File "/usr/local/lib/python3.8/site-packages/urllib3/connectionpool.py", line 670, in urlopen
    container    |     httplib_response = self._make_request(
    container    |   File "/usr/local/lib/python3.8/site-packages/urllib3/connectionpool.py", line 381, in _make_request
    container    |     self._validate_conn(conn)
    container    |   File "/usr/local/lib/python3.8/site-packages/urllib3/connectionpool.py", line 976, in _validate_conn
    container    |     conn.connect()
    container    |   File "/usr/local/lib/python3.8/site-packages/urllib3/connection.py", line 342, in connect
    container    |     self.ssl_context = create_urllib3_context(
    container    |   File "/usr/local/lib/python3.8/site-packages/urllib3/util/ssl_.py", line 276, in create_urllib3_context
    container    |     context.options |= options
    container    |   File "/usr/local/lib/python3.8/ssl.py", line 602, in options
    container    |     super(SSLContext, SSLContext).options.__set__(self, value)
    container    |   File "/usr/local/lib/python3.8/ssl.py", line 602, in options
    container    |     super(SSLContext, SSLContext).options.__set__(self, value)
    container    |   File "/usr/local/lib/python3.8/ssl.py", line 602, in options
    container    |     super(SSLContext, SSLContext).options.__set__(self, value)
    container    |   [Previous line repeated 481 more times]
    container    | RecursionError: maximum recursion depth exceeded

Моя программа,
Я пробовал monkeypatching () перед любым другим импортом, но тогда мои подключения к веб-сокетам не работают, а также истекает время ожидания подключения к базе данных. Я также пробовал импортировать pyfcm до и после monkeypatch, но ничего не работает

import eventlet, socketio, save_history, pyfcm
from pyfcm import FCMNotification
eventlet.monkey_patch(socket= True)

#sio = socketio.Server()
mgr = socketio.RedisManager('redis://redis:PORT/0')
sio = socketio.Server(client_manager=mgr, async_mode='eventlet', logger=True)
app = socketio.WSGIApp(sio)

# Join Room when client comes online
@sio.on('subscribe')
def join_room_event(sid,data):
    user = data['user_id']
    channel = data['channel']
    if save_history.check_user_channel(channel, user):
        sio.enter_room(sid,channel)
        sio.logger.log (level=20,msg="User " + str(user) + " in channel: " + str(channel) + " Joined and Verified with SID " + str(sid))
        return True
    else:
        sio.logger.log (level=20,msg="User " + str(user) + " NOT in channel: " + str(channel) + " with SID " + str(sid))
        return False

@sio.on('send_message')
def send_message_event(sid, data):
    channel_id = data['channel']
    user = data['user_id']
    message = data['message']
    if user and channel_id and message:

    mid = save_history.save_message(channel_id, int(user), message)
    data['message_id'] = mid['message_id']
    data['time_sent'] = mid['time_sent']
    sio.logger.log (level=20,msg='{Message: ' + message + ' with MID: ' +str(mid)+ ' sent by ' + str(user) + ' in channel ' + str(channel_id) + '}')
    if mid['apns_result'] != 'no_apns':
        push_service = FCMNotification(api_key='<api-key>')
        result = push_service.notify_single_device(registration_id=mid['apns_result']['registration_id'], message_title=mid['apns_result']['message_title'], message_body=mid['apns_result']['message_body'])
        sio.logger.log (level=20,msg=result)
    sio.emit('receive_message', data, room=channel_id)
    return data 
else:
    sio.emit('receive_message', { 'message' : "All params not present" } , room=channel_id)
    return { 'message' : "All params not present" }

Любые решения будут очень признательны! Спасибо

...