Я пытаюсь использовать Twitter API для создания собственного частного API только для локального запуска на моем ПК.
См. код ниже:
from flask import Flask
import tweepy, json
from tweepy import Stream
from tweepy.streaming import StreamListener
app = Flask(__name__)
@app.route('/')
def example():
global clean_data
class StdOutListener(StreamListener):
def on_data(self, data):
global clean_data
clean_data = json.loads(data)
return clean_data
def setUpAuth():
# authentication and stuff here
def followStream():
api, auth = setUpAuth()
listener = StdOutListener()
stream = Stream(auth, listener)
stream.filter(track=["@user"], is_async=True, stall_warnings=True)
followStream()
return clean_data
if __name__ == '__main__':
app.run()
clean_data
- это JSON, который возвращает твиттер, и это то, что я хочу отобразить во фляге, но он продолжает возвращать ошибку 500, а консоль выводит clean_data is not defined
Это очень упрощенная версия моего кода, но ее достаточно, чтобы продемонстрировать ошибку, которую я получаю. Что я делаю не так?
То же самое произойдет, если я просто определяю clean_data
как случайную строку.
Вызов on_data
асинхронный, он может вызываться или не вызываться сразу после followStream()
.
Возможно, проблема связана с первым global clean_data
. Не могли бы вы попробовать изменить его на что-то вроде clean_data = None
(без global
) и сообщить нам, сохраняется ли проблема?
@DiegoMiguel хорошо, это приведет к назначению on_data
совершенно другой переменной, а затем. example
всегда вернется None
. Тем не менее, это не решит фундаментальную проблему, заключающуюся в том, что OP полагается на асинхронный вызов, работающий как синхронный.
Проблема в том, что StdOutListener.on_data
— это своего рода функция обратного вызова в асинхронном коде, поэтому вы не знаете, когда именно (конкретное время) она будет вызвана, она будет вызвана, когда будут получены какие-то данные, поэтому вам нужно переосмыслить и перепроектируйте свой код с помощью промисов или других функций обратного вызова/асинхронного вызова, если вы хотите обрабатывать те данные, которые вы получаете внутри StdOutListener.on_data
clean_data
не определен до тех пор, пока не будет вызванon_data()
, но вы возвращаете его из функции (возможно, до этого). Итак, вам нужно спросить, когда эта переменная будет определена?