首页 > 解决方案 > SSLContext 超过最大递归深度(eventlet、flask、flask-socketio、tweepy)

问题描述

我正在构建一个烧瓶应用程序,它根据用户输入显示推文的实时数据可视化。现在,客户端仍然在本地托管,我只是想达到一个单一的推文的 json 从服务器发送到客户端的地步。这也是我第一次自己构建烧瓶应用程序,所以我一直在学习 HTML/CSS/node.js/JS(对我温柔一点)。

我的问题是后端/服务器。这是相关的烧瓶代码:

from flask import Flask, request, render_template, session
from flask_socketio import SocketIO, emit
from time import sleep
import threading
from threading import Thread, Event, Lock
import eventlet
import json
import TweePoll_API_nostream

eventlet.monkey_patch(socket=True)
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socket = SocketIO(app, async_mode=None, logger=True, engineio_logger=True)
streamer2 = TweePoll_API_nostream.getTweet()
thread = None
thread_lock = Lock()

def background_thread():
    count = 0
    while True:
        socket.sleep(10)
        x = streamer2.main(v)
        count += 1
        socket.emit('my_response',
            {'data': x, 'count': count},
            namespace='/output')

@app.route('/', methods = ['GET','POST'])
def index():
    return(render_template("index.html", async_mode = socket.async_mode))

@socket.on('my_event', namespace='/output')
def test_message(message):
    global v
    v = message['data']
    print(v)
    global thread 
    with thread_lock:
        if thread is None:
            thread = socket.start_background_task(background_thread)
    emit('my_response', {'data': v, 'count': 0})

if __name__ == '__main__':
    socket.run(app, port = 5000, debug = True)

错误发生x = streamer2.main(v)background_thread()函数中。以下是 tweepy 流媒体的相关代码:

import tweepy
import config
import TweePoll_NLP_single
import json

MLObj = TweePoll_NLP_single.ReadyForSQL()

class getTweet(object):
    def __init__(self):
        self.auth = tweepy.auth.OAuthHandler(config.ckey, config.csecret)
        self.auth.set_access_token(config.atoken, config.asecret)
        self.api = tweepy.API(self.auth)

    def main(self, keywrd):
        tweet = str()
        user = str()
        time = str()
        status = self.api.search(q = [keywrd + " @realDonaldTrump", keywrd + " @JoeBiden"], count = 1, result_type = "recent", lang = 'en')[0]

        if hasattr(status, "retweeted_status"):  # Check if Retweet
            try:
                tweet = status.retweeted_status.extended_tweet["full_text"]
            except AttributeError:
                tweet = status.retweeted_status.text
        else:
            try:
                tweet = status.extended_tweet["full_text"]
            except AttributeError:
                tweet = status.text

        user = status.author.screen_name
        time = str(status.created_at)
        prez = MLObj.whichPrez(tweet)
        clean = MLObj.kleenex(tweet)
        NRCemo = MLObj.NRCEmo(clean)

        printDF = json.dumps({"tweet":tweet, "clean":clean,
            "prez":prez, "NRCEmo":NRCemo, "time":time, "username":user})

        return(printDF)

此代码不可重现,因为它连接到另一个用于 NLP/情感标记的文件,而且不包括前端。让我知道是否需要发送指向我的 github 的链接或其他东西来解决这个问题。

这是错误输出:

Exception in thread Thread-6:
Traceback (most recent call last):
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\tweepy\binder.py", line 183, in execute
    resp = self.session.request(self.method,
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\sessions.py", line 530, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\sessions.py", line 643, in send
    r = adapter.send(request, **kwargs)
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\adapters.py", line 439, in send
    resp = conn.urlopen(
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\connectionpool.py", line 670, in urlopen
    httplib_response = self._make_request(
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\connectionpool.py", line 381, in _make_request
    self._validate_conn(conn)
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\connectionpool.py", line 976, in _validate_conn
    conn.connect()
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\connection.py", line 342, in connect
    self.ssl_context = create_urllib3_context(
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\util\ssl_.py", line 276, in create_urllib3_context
    context.options |= options
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\ssl.py", line 602, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\ssl.py", line 602, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\ssl.py", line 602, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  [Previous line repeated 481 more times]
RecursionError: maximum recursion depth exceeded

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\swagj\Documents\GitHub\TweePoll\TweePoll_Server_V2.py", line 28, in background_thread
    x = streamer2.main(v)
  File "C:\Users\swagj\Documents\GitHub\TweePoll\TweePoll_API_nostream.py", line 21, in main
    status = self.api.search(q = [keywrd + " @realDonaldTrump", keywrd + " @JoeBiden"], count = 1, result_type = "recent", lang = 'en')[0]
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\tweepy\binder.py", line 250, in _call
    return method.execute()
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\tweepy\binder.py", line 191, in execute
    six.reraise(TweepError, TweepError('Failed to send request: %s' % e), sys.exc_info()[2])
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\six.py", line 702, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\tweepy\binder.py", line 183, in execute
    resp = self.session.request(self.method,
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\sessions.py", line 530, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\sessions.py", line 643, in send
    r = adapter.send(request, **kwargs)
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\adapters.py", line 439, in send
    resp = conn.urlopen(
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\connectionpool.py", line 670, in urlopen
    httplib_response = self._make_request(
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\connectionpool.py", line 381, in _make_request
    self._validate_conn(conn)
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\connectionpool.py", line 976, in _validate_conn
    conn.connect()
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\connection.py", line 342, in connect
    self.ssl_context = create_urllib3_context(
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\util\ssl_.py", line 276, in create_urllib3_context
    context.options |= options
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\ssl.py", line 602, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\ssl.py", line 602, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "C:\Users\swagj\AppData\Local\Programs\Python\Python38\lib\ssl.py", line 602, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  [Previous line repeated 481 more times]
tweepy.error.TweepError: Failed to send request: maximum recursion depth exceeded

最后转储,这是我的信息:

Windows 10
python = 3.8.3
eventlet = 0.25.2
tweepy = 3.8.0
websocket-client = 0.57.0
websockets = 8.1
Flask = 1.1.2
Flask-SocketIO = 4.3.0

我不知道为什么这不起作用,但我觉得它与 eventlet 有关。有什么线索吗?如果需要,很高兴提供更多信息:)

标签: pythonflasktweepyflask-socketioeventlet

解决方案


推荐阅读