Представления Django - Использование запросов

Если у меня есть функция views.py, подобная вот этой:

#imports

env = environ.Env()
environ.Env.read_env()

 def stocks(request):
    input_ticker = request.POST['ticker']
    response = requests.get(f"https://cloud.iexapis.com/v1/stock/" + 
    input_ticker + "/quote?displayPercent=true&token=" + env('API_IEX'))

    parsed = response.json()

return render(request, 'result_api.html', {'api': parsed})

Как я могу увеличить гибкость и эффективность моего кода, если я хочу добавить около 10-15 подобных запросов?

(...)
response2 = requests.get(f"https://cloud.iexapis.com/anything/anything/" + 
    input_ticker + "/anything=true&token=" + env('API_IEX'))

response3 = requests.get(f"https://cloud.iexapis.com/anything/anything2/" + 
         input_ticker + "/anything2=true&token=" + env('API_IEX'))
(...)

parsed2 = response2.json()
parsed3 = response2.json()
(...)

return render(request, 'result_api.html', {'api': parsed,
                                           'api2': parsed2,
                                           'api3': parsed3 ,            })

Это было бы довольно муторно повторять, поэтому я думаю, что должен быть лучший способ решения этой проблемы.

PS: На данный момент я больше увлечен Django, чем Python. Возможно, я упускаю что-то очевидное :D

Как я могу увеличить гибкость и эффективность моего кода, если я хочу добавить 10-15 подобных запросов?

Я не знаю много об эффективности, но есть небольшой трюк, который можно сделать, чтобы "автоматизировать" кодирование запросов вместо того, чтобы копировать-вставлять их все. Это связано с массивами и заменой строк

max_requests=15 #change it to N

response_list=[]
#note that this loop goes 0-14 but you can change it if you like
for i in range(0,max_requests):
    response_list.append( requests.get(f"https://cloud.iexapis.com/anything/anything{i}/" +
         input_ticker + "/anything{i}=true&token=" + env('API_IEX')) )
    

parsed_list=[]
for i in range(0,max_requests):
    parsed_list.append( response_list[i].json() )

return_dict={}
for i in range(0, max_requests):
    return_dict[f"api{i}"]=parsed_list[i]
    #the end result will have api0,api1 instead of api,api1
    
return render(request, 'result_api.html',return_dict)

Есть еще способы сделать этот код более читабельным и все такое, но это то, что я смог придумать перед отъездом.

Что касается эффективности, похоже, что вы используете DJango, там должны быть некоторые либы для оптимизации множества запросов, НО если вы не хотите искать либы, вы всегда можете подумать о паралельности асинхронных запросов, однако я все еще ноб в этой области.

EDIT: еще одна попытка:

max_requests=15 #change it to whatever you like
return_dict=dict(zip([f"api{i}" for i in range(0,max_requests)],[request.json() for request in [requests.get(f"https://cloud.iexapis.com/anything/anything{i}/" +
     input_ticker + "/anything{i}=true&token=" + env('API_IEX')) for i in range(0,max_requests)]]))
return render(request, 'result_api.html',return_dict)

если это работает, то было бы хорошо (но я не уверен, что request.get() работает над list comprehension)

Вернуться на верх