Estou tentando executar uma corrotina que obtém dados com um clique de botão. Ele usa aiohttp
para obter os dados. O botão é decorado com @asyncSlot()
from qasync
Porém, quando clico no botão, nada acontece, nem mesmo um print. Não acho que os exemplos de asyncio correspondam ao meu caso de uso. Eu tentei me mover quando o asyncio corre para ver se isso ajuda. Estou um pouco perplexo porque não tenho erros para trabalhar. Por que minha função não está funcionando?
Meu código:
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.container = QWidget() # Controls container widget.
self.controlsLayout = QVBoxLayout()
# -- Search bar and settings button
self.search_layout = QHBoxLayout()
self.search_bar = QLineEdit()
self.search_button = QPushButton("Search")
self.search_button.clicked.connect(self.update_data) # search by entered text
self.search_layout.addWidget(self.search_button)
self.controlsLayout.addLayout(self.search_layout)
# Our tab container with adjustable number of tabs
self.tab_container = TabContainer()
# Add out tabs widget
self.controlsLayout.addWidget(self.tab_container)
self.container.setLayout(self.controlsLayout)
self.setCentralWidget(self.container
@asyncSlot()
async def update_data(self):
stock_tickers = self.search_bar.text()
print("Entered tickers: ", stock_tickers)
short_interest = asyncio.create_task(self.setup_data(stock))
short_interest = await short_interest
print('SHORT INTEREST:', short_interest)
# Make a table in a new tab here
# ..............................
async def setup_data(self, stock):
short_interest = await get_data(stock) # this function is our main coroutine
# process the data here ...... as previous method return json
async def main():
app = QApplication(sys.argv)
loop = qasync.QEventLoop(app)
asyncio.set_event_loop(loop)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec())
if __name__ == '__main__':
asyncio.run(main())
onde my get_data(stock)
, que podemos considerar uma chamada aiohttp json básica , é definido como
async def get_data(stock_ticker):
async with aiohttp.ClientSession() as session:
async with session.get('https://www.finra.org/finra-data/browse-catalog/equity-short-interest/data') as response:
cfruid = session.cookie_jar.filter_cookies('https://www.finra.org/')["__cfruid"].value
print("CFRUID", cfruid)
five_months_date = date.today() + relativedelta(months=-5)
headers = {
'authority': 'services-dynarep.ddwa.finra.org',
'accept': 'application/json, text/plain, */*',
'accept-language': 'en-US,en;q=0.6',
'content-type': 'application/json',
'cookie': f'XSRF-TOKEN={cfruid};',
'origin': 'https://www.finra.org',
'referer': 'https://www.finra.org/',
'x-xsrf-token': cfruid,
}
json_data = {
'fields': [
'settlementDate',
'issueName',
'symbolCode',
'marketClassCode',
'currentShortPositionQuantity',
'previousShortPositionQuantity',
'changePreviousNumber',
'changePercent',
'averageDailyVolumeQuantity',
'daysToCoverQuantity',
'revisionFlag',
],
'dateRangeFilters': [],
'domainFilters': [],
'compareFilters': [
{
'fieldName': 'symbolCode',
'fieldValue': 'GME',
'compareType': 'EQUAL',
},
{
'fieldName': 'settlementDate',
'fieldValue': str(five_months_date),
'compareType': 'GREATER',
},
],
'multiFieldMatchFilters': [],
'orFilters': [],
'aggregationFilter': None,
'sortFields': [
'-settlementDate',
'+issueName',
],
'limit': 50,
'offset': 0,
'delimiter': None,
'quoteValues': False,
}
async with session.post('https://services-dynarep.ddwa.finra.org/public/reporting/v2/data/group/OTCMarket/name/ConsolidatedShortInterest',
headers=headers, json=json_data) as response2:
short_interest_data = await response2.json()
return short_interest_data
Consegui fazer a corrotina funcionar e retornar dados em seu próprio arquivo criando uma tarefa e aguardando-a. Eu também tentei usar o loop
em vez disso. o que estou perdendo? Observe que outros métodos regulares funcionam quando o botão é clicado, então sei que é apenas um asyncio que se recusa a ser executado.
Editar: parece travar no início da aiohttp
parte, não executando a instrução print que tenho dentroget_data