Я установил приложение-колбу, работающее на Heroku, которое проверяет API на информацию о поезде с помощью параметров, передаваемых в URL.
Основная поисковая часть функции находится в этой функции:
train_service_data = {}
train_station_data = {}
dest = 0
origin = 0
mytimes = 0
myurl = 0
def checker():
global mytrains # modifies the global copy of mytrains otherwise a new variable is created
global myurl
global mytimes
# myurl = f"http://huxley.apphb.com/all/{origin}/to/{dest}/{mytimes}"
response = requests.get(myurl, params={"accessToken": SECRET_KEY})
response.raise_for_status() # this makes an error if something failed
data1 = response.json()
mytrains['departure'] = str(data1['crs'])
mytrains['arrival'] = str(data1['filtercrs'])
try:
found_service = 0
for index, service in enumerate(data1['trainServices']): # indexes data for pulling of previous values
if service['std'].replace(':', '') in mytimes:n
found_service += 1
train = SimpleNamespace(
serviceID=str(service['serviceID']),
arrival_time=str(service['std']),
estimated_arrival=str(service['etd']),
status='On time'
)
prior_service = data1['trainServices'][index - 1]
if train.estimated_arrival == 'Cancelled':
train.status = 'Cancelled'
train.alternate_service = str(prior_service['std'])
train.alternate_status = str(prior_service['etd'])
elif train.estimated_arrival != 'On time':
train.status = 'Delayed'
write_index = index
for i, v in mytrains.items():
if isinstance(v, dict) and v['arrival_time'] == train.arrival_time:
write_index = i
mytrains[write_index] = train.__dict__
elif found_service == 0: # if no service is found
mytrains['state'] = 'The services currently available are not specified in user_time.'
except (TypeError, AttributeError) as error:
mytrains['errorMessage'] = 'There is no train service data'
try:
NRCCRegex = re.compile('^(.*?)[\.!\?](?:\s|$)') # regex pulls all characters until hitting a . or ! or ?
myline = NRCCRegex.search(data1['nrccMessages'][0]['value']) # regex searches through nrccMessages
mytrains['nrcc'] = myline.group(1) # prints parsed NRCC message
except (TypeError, AttributeError) as error: # tuple catches multiple errors, AttributeError for None value
mytrains['nrcc'] = 'No NRCC'
return mytrains
Затем он разделяется на сообщения о местонахождении и фактические сервисы с помощью следующих двух функций:
def time_trains_services(): # splits data into train services lookup
global train_service_data
train_service_data = [j for i, j in mytrains.items() if isinstance(j, dict)] # grabs train service data into dict
return train_service_data
def time_trains_location(): # splits data into crs, filtercrs and nrcc queries
global train_station_data
train_station_data = {i: j for i, j in mytrains.items() if not isinstance(j, dict)} # grabs [0] data into separate dict
return train_station_data
Эти функции предоставляют подсказки, которые вводятся во Flask, но при обновлении страницы отображаются другие значения в json, которые не являются теми, которые я специально выделил для if service['std'].replace(':', '') in mytimes:
Моя шаблонная логика выглядит следующим образом:
<div class="train_times">
{% for services in trainservices %}
{% if services.status != 'On time' and services.status != 'Cancelled' %}
<p>{{services.arrival_time}} -> {{services.estimated_arrival}}</p>
{% if not loop.last %}
|
{% endif %}
{% endif %}
{% if services.status == 'On time' %}
<p>{{services.arrival_time}} ({{services.status}})</p>
{% if not loop.last %}
|
{% endif %}
{% endif %}
{% if traindata.status == 'Cancelled' %}
<p>The previous service is: <span>{{ trainsevices.alternate_service }}</span></p>
<p>The previous train arrives at: <span>{{ alternate_status }}</span></p>
{% endif %}
{% endfor %}
</div>
Почему появляются другие моменты, которые я не определил? Как я могу предотвратить это, я подумал dict.clear()
, но я не уверен, что это правильный путь.
Время также остается на странице, когда json больше не содержит их, когда я обновляю страницу, я пытался настроить APScheduler для запуска каждую минуту, но это не решило мою проблему.
Любая помощь очень ценится! Как всегда, я могу предоставить больше кода, если что-то неясно.
РЕДАКТИРОВАТЬ: Добавлен полный код, как сейчас, чтобы заполнить все пропущенные пробелы: https://paste.pydis.com/inudurodah.py