簡體   English   中英

Django 視圖 - 使用請求

[英]Django views - Using requests

如果我在這里有一個像這樣的 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 atm。 可能我在這里錯過了一些明顯的東西:D

如果我想添加 10-15 個類似的請求,如何提高代碼的靈活性和效率?

我對效率知之甚少,但是您可以做一些小技巧來“自動化”編碼請求,而不是復制粘貼它們,它涉及數組和 string_replacements

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,應該有一些庫來優化大量請求,但是如果你不想 lib-hunt 你總是可以考慮異步請求的並行性,但是我仍然是一個菜鳥在這個區域。

編輯:再試一次:

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() 是否適用於列表理解)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM