Le Coronavirus ou COVID-19 est une épidémie qui a touché le monde depuis novembre 2019. En cette période de confinement, rien de mieux que de créer une API des données du Coronavirus.

Les APIs sont considérées comme les moteurs de la transformation digitale. On les utilise tous, chaque jour, dans nos interactions avec des applications sur nos smartphones … On en consomme quotidiennement pour utiliser des fonctionnalités sur un système tiers.

Aujourd’hui et à travers un exemple, on va exposer une API sur Heroku sur les données du COVID-19.

Data

Les données sont publiées à intervalles réguliers par Johns Hopkins University sur leur repository Github dédié au COVID-19. Bon nombre de​ personnes les utilisent à des fins d’analyse.

Technos

Dans cet exemple, Python sera le langage avec lequel les données seront chargées, traitées et formatées.

Le serveur que nous allons créer sera écrit également en Python avec la librairie Flask ( semblable à Express pour les adeptes de NodeJS ). 

Heroku sera la plateforme sur laquelle sera hébergé notre web service. C’est une PAAS (Platform As A Service) facile d’utilisation et sur laquelle on peut héberger différents types d’applications basées sur plusieurs langages dont GoLang, Ruby, Python, Java … Heroku donne aussi la possibilité de déployer des images Docker ce qui rend les possibilités infinies ♾

Allez hop! Au code! 👨‍💻

Assez parlé, passons au choses sérieuses !

Etape 1: Traitement des données

Les données sont disponibles sur le repository COVID-19 précédemment cité. J’ai commencé par préparer un fichier country_codes.py qui fera le mapping entre le nom des pays et leurs​ codes.

# Default country code.
default_code = "XX"

# Mapping of country names to alpha-2 codes.
is_3166_1 = {
    "Afghanistan"                                  : "AF",
    "Åland Islands"                                : "AX",
    "Albania"                                      : "AL",
    "Algeria"                                      : "DZ",
    "American Samoa"                               : "AS",
    "Andorra"                                      : "AD",
    "Angola"                                       : "AO",
    "Anguilla"                                     : "AI",
    "Antarctica"                                   : "AQ",
    "Antigua and Barbuda"                          : "AG",
    "Argentina"                                    : "AR",
    "Armenia"                                      : "AM",
    "Aruba"                                        : "AW",
    "Australia"                                    : "AU",
    "Austria"                                      : "AT",
    "Azerbaijan"                                   : "AZ",
    "The Bahamas"                                  : "BS",
    "Bahrain"                                      : "BH",
    "Bangladesh"                                   : "BD",
    "Barbados"                                     : "BB",
    "Belarus"                                      : "BY",
    "Belgium"                                      : "BE",
    "Belize"                                       : "BZ",
    "Benin"                                        : "BJ",
    "Bermuda"                                      : "BM",
    "Bhutan"                                       : "BT",
    "Bolivia"                                      : "BO",
    "Bonaire, Sint Eustatius and Saba"             : "BQ",
    "Bosnia and Herzegovina"                       : "BA",
    "Botswana"                                     : "BW",
    "Bouvet Island"                                : "BV",
    "Brazil"                                       : "BR",
    "British Indian Ocean Territory"               : "IO",
    "Brunei"                                       : "BN",
    "Bulgaria"                                     : "BG",
    "Burkina Faso"                                 : "BF",
    "Burundi"                                      : "BI",
    "Cambodia"                                     : "KH",
    "Cameroon"                                     : "CM",
    "Canada"                                       : "CA",
    "Cape Verde"                                   : "CV",
    "Cayman Islands"                               : "KY",
    "Central African Republic"                     : "CF",
    "Chad"                                         : "TD",
    "Chile"                                        : "CL",
    "China"                                        : "CN",
    "Christmas Island"                             : "CX",
    "Cocos (Keeling) Islands"                      : "CC",
    "Colombia"                                     : "CO",
    "Comoros"                                      : "KM",
    "Congo (Kinshasa)"                             : "CG",
    "Congo (Brazzaville)"                          : "CD",
    "Cook Islands"                                 : "CK",
    "Costa Rica"                                   : "CR",
    "Cote d'Ivoire"                                : "CI",
    "Croatia"                                      : "HR",
    "Cuba"                                         : "CU",
    "Curaçao"                                      : "CW",
    "Cyprus"                                       : "CY",
    "Czech Republic"                               : "CZ",
    "Denmark"                                      : "DK",
    "Djibouti"                                     : "DJ",
    "Dominica"                                     : "DM",
    "Dominican Republic"                           : "DO",
    "Ecuador"                                      : "EC",
    "Egypt"                                        : "EG",
    "El Salvador"                                  : "SV",
    "Equatorial Guinea"                            : "GQ",
    "Eritrea"                                      : "ER",
    "Estonia"                                      : "EE",
    "Ethiopia"                                     : "ET",
    "Falkland Islands (Malvinas)"                  : "FK",
    "Faroe Islands"                                : "FO",
    "Fiji"                                         : "FJ",
    "Finland"                                      : "FI",
    "France"                                       : "FR",
    "French Guiana"                                : "GF",
    "French Polynesia"                             : "PF",
    "French Southern Territories"                  : "TF",
    "Gabon"                                        : "GA",
    "Gambia"                                       : "GM",
    "Georgia"                                      : "GE",
    "Germany"                                      : "DE",
    "Ghana"                                        : "GH",
    "Gibraltar"                                    : "GI",
    "Greece"                                       : "GR",
    "Greenland"                                    : "GL",
    "Grenada"                                      : "GD",
    "Guadeloupe"                                   : "GP",
    "Guam"                                         : "GU",
    "Guatemala"                                    : "GT",
    "Guernsey"                                     : "GG",
    "Guinea"                                       : "GN",
    "Guinea-Bissau"                                : "GW",
    "Guyana"                                       : "GY",
    "Haiti"                                        : "HT",
    "Heard Island and McDonald Islands"            : "HM",
    "Holy See"                                     : "VA",
    "Honduras"                                     : "HN",
    "Hong Kong"                                    : "HK",
    "Hungary"                                      : "HU",
    "Iceland"                                      : "IS",
    "India"                                        : "IN",
    "Indonesia"                                    : "ID",
    "Iran, Islamic Republic of"                    : "IR",
    "Iraq"                                         : "IQ",
    "Ireland"                                      : "IE",
    "Isle of Man"                                  : "IM",
    "Israel"                                       : "IL",
    "Italy"                                        : "IT",
    "Jamaica"                                      : "JM",
    "Japan"                                        : "JP",
    "Jersey"                                       : "JE",
    "Jordan"                                       : "JO",
    "Kazakhstan"                                   : "KZ",
    "Kenya"                                        : "KE",
    "Kiribati"                                     : "KI",
    "Korea, Democratic People's Republic of"       : "KP",
    "Korea, South"                                 : "KR",
    "Kuwait"                                       : "KW",
    "Kyrgyzstan"                                   : "KG",
    "Lao People's Democratic Republic"             : "LA",
    "Latvia"                                       : "LV",
    "Lebanon"                                      : "LB",
    "Lesotho"                                      : "LS",
    "Liberia"                                      : "LR",
    "Libya"                                        : "LY",
    "Liechtenstein"                                : "LI",
    "Lithuania"                                    : "LT",
    "Luxembourg"                                   : "LU",
    "Macao"                                        : "MO",
    "North Macedonia"                              : "MK",
    "Madagascar"                                   : "MG",
    "Malawi"                                       : "MW",
    "Malaysia"                                     : "MY",
    "Maldives"                                     : "MV",
    "Mali"                                         : "ML",
    "Malta"                                        : "MT",
    "Marshall Islands"                             : "MH",
    "Martinique"                                   : "MQ",
    "Mauritania"                                   : "MR",
    "Mauritius"                                    : "MU",
    "Mayotte"                                      : "YT",
    "Mexico"                                       : "MX",
    "Micronesia, Federated States of"              : "FM",
    "Moldova"                                      : "MD",
    "Monaco"                                       : "MC",
    "Mongolia"                                     : "MN",
    "Montenegro"                                   : "ME",
    "Montserrat"                                   : "MS",
    "Morocco"                                      : "MA",
    "Mozambique"                                   : "MZ",
    "Myanmar"                                      : "MM",
    "Namibia"                                      : "NA",
    "Nauru"                                        : "NR",
    "Nepal"                                        : "NP",
    "Netherlands"                                  : "NL",
    "New Caledonia"                                : "NC",
    "New Zealand"                                  : "NZ",
    "Nicaragua"                                    : "NI",
    "Niger"                                        : "NE",
    "Nigeria"                                      : "NG",
    "Niue"                                         : "NU",
    "Norfolk Island"                               : "NF",
    "Northern Mariana Islands"                     : "MP",
    "Norway"                                       : "NO",
    "Oman"                                         : "OM",
    "Pakistan"                                     : "PK",
    "Palau"                                        : "PW",
    "Palestine, State of"                          : "PS",
    "Panama"                                       : "PA",
    "Papua New Guinea"                             : "PG",
    "Paraguay"                                     : "PY",
    "Peru"                                         : "PE",
    "Philippines"                                  : "PH",
    "Pitcairn"                                     : "PN",
    "Poland"                                       : "PL",
    "Portugal"                                     : "PT",
    "Puerto Rico"                                  : "PR",
    "Qatar"                                        : "QA",
    "Réunion"                                      : "RE",
    "Romania"                                      : "RO",
    "Russian Federation"                           : "RU",
    "Rwanda"                                       : "RW",
    "Saint Barthélemy"                             : "BL",
    "Saint Helena, Ascension and Tristan da Cunha" : "SH",
    "Saint Kitts and Nevis"                        : "KN",
    "Saint Lucia"                                  : "LC",
    "Saint Martin (French part)"                   : "MF",
    "Saint Pierre and Miquelon"                    : "PM",
    "Saint Vincent and the Grenadines"             : "VC",
    "Samoa"                                        : "WS",
    "San Marino"                                   : "SM",
    "Sao Tome and Principe"                        : "ST",
    "Saudi Arabia"                                 : "SA",
    "Senegal"                                      : "SN",
    "Serbia"                                       : "RS",
    "Seychelles"                                   : "SC",
    "Sierra Leone"                                 : "SL",
    "Singapore"                                    : "SG",
    "Sint Maarten (Dutch part)"                    : "SX",
    "Slovakia"                                     : "SK",
    "Slovenia"                                     : "SI",
    "Solomon Islands"                              : "SB",
    "Somalia"                                      : "SO",
    "South Africa"                                 : "ZA",
    "South Georgia and the South Sandwich Islands" : "GS",
    "South Sudan"                                  : "SS",
    "Spain"                                        : "ES",
    "Sri Lanka"                                    : "LK",
    "Sudan"                                        : "SD",
    "Suriname"                                     : "SR",
    "Svalbard and Jan Mayen"                       : "SJ",
    "Swaziland"                                    : "SZ",
    "Sweden"                                       : "SE",
    "Switzerland"                                  : "CH",
    "Syrian Arab Republic"                         : "SY",
    "Taiwan*"                                      : "TW",
    "Tajikistan"                                   : "TJ",
    "Tanzania"                                     : "TZ",
    "Thailand"                                     : "TH",
    "Timor-Leste"                                  : "TL",
    "Togo"                                         : "TG",
    "Tokelau"                                      : "TK",
    "Tonga"                                        : "TO",
    "Trinidad and Tobago"                          : "TT",
    "Tunisia"                                      : "TN",
    "Turkey"                                       : "TR",
    "Turkmenist/latestan"                          : "TM",
    "Turks and Caicos Islands"                     : "TC",
    "Tuvalu"                                       : "TV",
    "Uganda"                                       : "UG",
    "Ukraine"                                      : "UA",
    "United Arab Emirates"                         : "AE",
    "United Kingdom"                               : "GB",
    "United States"                                : "US",
    "United States Minor Outlying Islands"         : "UM",
    "Uruguay"                                      : "UY",
    "Uzbekistan"                                   : "UZ",
    "Vanuatu"                                      : "VU",
    "Venezuala"                                    : "VE",
    "Viet Nam"                                     : "VN",
    "Virgin Islands, British"                      : "VG",
    "Virgin Islands, U.S."                         : "VI",
    "Wallis and Futuna"                            : "WF",
    "Western Sahara"                               : "EH",
    "Yemen"                                        : "YE",
    "Zambia"                                       : "ZM",
    "Zimbabwe"                                     : "ZW",
}

# Mapping of alternative names, spelling, typos to the names of countries used
# by the ISO 3166-1 norm
synonyms = {
    "Mainland China"   : "China",
    "Czechia"          : "Czech Republic",
    "South Korea"      : "Korea, Republic of",
    "Taiwan"           : "Taiwan, Province of China",
    "US"               : "United States",
    # TODO Macau is probably a typo. Report it to CSSEGISandData/COVID-19
    "Macau"            : "Macao",
    "Vietnam"          : "Viet Nam",
    "UK"               : "United Kingdom",
    "Russia"           : "Russian Federation",
    "Iran"             : "Iran, Islamic Republic of",
    "Saint Barthelemy" : "Saint Barthélemy",
    "Palestine"        : "Palestine, State of",
    "Vatican City"     : "Holy See (Vatican City State)",
    # "Others" has no mapping
}

def country_code(country):
    """
    Return two letter country code (Alpha-2) according to
    https://en.wikipedia.org/wiki/ISO_3166-1
    Defaults to "XX".
    """
    if country in is_3166_1:
        return is_3166_1[country]
    else:
        if country in synonyms:
            synonym = synonyms[country]
            return is_3166_1[synonym]
        else:
            #print ("No country_code found for '" + country + "'. Using '" + default_code + "'")
            return default_code

Commençons par créer un fichier ​refresh.py​ sur lequel il existe une fonction update, c’est là où la logique de l’application sera décrite. Sur le ​refresh.py​, on commence par importer les bibliothèques : 

import pandas as pd
import io
import requests
import json
import sys
import os

from country_codes import country_code 

On initialise ensuite les URLs des données à traiter : 

url_confirmed="https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
url_deaths="https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv"
url_recovered ="https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv"

Au niveau de la fonction update, on commence par initialiser l’objet JSON qui contiendra les données des trois requêtes pour créer les trois dataframes pandas.

Pour une meilleure gestion des problèmes qui peuvent survenir en lançant nos requêtes, il faudra bien veiller à utiliser des blocs try/catch !

def update():

    # Initialise the json object
    json_data_final = {}

    # Get content using http request
    try:
        confirmed_=requests.get(url_confirmed).content
    except requests.exceptions.RequestException as e:
        print("Fatal error on confirmed cases request")
        raise SystemExit(e)

    try:
        deaths_=requests.get(url_deaths).content
    except requests.exceptions.RequestException as e:
        print("Fatal error on deaths cases request")
        raise SystemExit(e)

    try:
        recovered_=requests.get(url_recovered).content
    except requests.exceptions.RequestException as e:
        print("Fatal error on recovered cases request")
        raise SystemExit(e)

On définit par la suite la fonction populate qui va se charger de remplir le document JSON par les données des trois dataframes, ainsi que leurs différents champs. Cette fonction prends en entrée le document JSON, le dataframe et le type des données sur ce dernier ( confirmed, deaths ou recovered ).

Le CSV comporte toujours en dernière colonne la dernière date d’observation. Il serait intéressant de stocker les dernières données en sommant la dernière colonne de ce CSV.

def populate(json, df, dftype):

    json[dftype] = {}
    json[dftype]['locations'] = []
    
    tmp_latest_confirmed = int(df.sum(axis=0)[-1])

Par la suite, on réitère ligne par ligne du fichier CSV tout en stockant les données sur un élément temporaire de façon structurée. En terminant par ajouter l’élément temporaire au document JSON final et, en fin de boucle, mettre à jour le dernier nombre de cas.

    for index, row in df.iterrows():

        tmp_element = {}
        
        tmp_province = str(row['Province/State'])
        tmp_country_name = row['Country/Region']

        tmp_country_code = country_code(tmp_country_name)
        tmp_country_latest = row[-1]

        tmp_country_position = {}
        tmp_country_position['latitude'] = row['Lat']
        tmp_country_position['longitude'] = row['Long']

        tmp_country_history = {}

        for i in range (4,df.shape[1]):
            tmp_country_history[list(df.columns.values)[i]] = row[i]

        tmp_element['coordinates'] = tmp_country_position
        tmp_element['country'] = tmp_country_name
        tmp_element['country_code'] = tmp_country_code
        tmp_element['history'] = tmp_country_history
        tmp_element['latest'] = tmp_country_latest
        tmp_element['province'] = tmp_province
        
        json[dftype]['locations'].append(tmp_element)

    json[dftype]['latest'] = tmp_latest

    return json

On continue par créer les 3 dataframes sur la fonction update, tout en remplissant le document JSON final par les données correspondantes. On rajoute un champ tableau pour stocker les derniers chiffres concernant le nombre de cas à l’échelle mondiale. Et enfin un champ texte qui contiendra la date au format UTC (Universal Time Coordinated).

    # Confirmed cases
    df_confirmed=pd.read_csv(io.StringIO(confirmed_.decode('utf-8')))
    json_data_final = populate(json_data_final,df_confirmed,"confirmed")

    # Deaths cases
    df_deaths=pd.read_csv(io.StringIO(deaths_.decode('utf-8')))
    json_data_final = populate(json_data_final,df_deaths,"deaths")

    # Recovered cases
    df_recovered=pd.read_csv(io.StringIO(recovered_.decode('utf-8')))
    json_data_final = populate(json_data_final,df_recovered,"recovered")

    # Latest cases
    json_data_final['latest'] = {}
    json_data_final['latest']['confirmed'] = json_data_final['confirmed']['latest']
    json_data_final['latest']['deaths'] = json_data_final['deaths']['latest']
    json_data_final['latest']['recovered'] = json_data_final['recovered']['latest']

    # Update datetime
    json_data_final['updatedAt'] = str(datetime.datetime.utcnow())

L’application est censée interroger les fichiers CSV à intervalles très réguliers pour mettre à jour les données. Les nouvelles données sont remises au fichier data.json​ en écrasant les anciennes. 

    with open('data.json', 'w') as f:
        json.dump(json_data_final, f)
        sys.stdout.flush()
        print("Data Updated !")

    return 0

Le fichier refresh.py complet est le suivant :

import pandas as pd
import io
import requests
import json
import sys
import os
import datetime

from country_codes import country_code

url_confirmed="https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
url_deaths="https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv"
url_recovered ="https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv"

def populate(json, df, dftype):

    json[dftype] = {}
    json[dftype]['locations'] = []
    
    tmp_latest = int(df.sum(axis=0)[-1])

    for index, row in df.iterrows():

        tmp_element = {}
        
        tmp_province = str(row['Province/State'])
        tmp_country_name = row['Country/Region']

        tmp_country_code = country_code(tmp_country_name)
        tmp_country_latest = row[-1]

        tmp_country_position = {}
        tmp_country_position['latitude'] = row['Lat']
        tmp_country_position['longitude'] = row['Long']

        tmp_country_history = {}

        for i in range (4,df.shape[1]):
            tmp_country_history[list(df.columns.values)[i]] = row[i]

        tmp_element['coordinates'] = tmp_country_position
        tmp_element['country'] = tmp_country_name
        tmp_element['country_code'] = tmp_country_code
        tmp_element['history'] = tmp_country_history
        tmp_element['latest'] = tmp_country_latest
        tmp_element['province'] = tmp_province

        json[dftype]['locations'].append(tmp_element)

    json[dftype]['latest'] = tmp_latest

    return json

def update():

    # Initialise the json object
    json_data_final = {}

    # Get content using http request
    try:
        confirmed_=requests.get(url_confirmed).content
    except requests.exceptions.RequestException as e:
        print("Fatal error on confirmed cases request")
        raise SystemExit(e)

    try:
        deaths_=requests.get(url_deaths).content
    except requests.exceptions.RequestException as e:
        print("Fatal error on deaths cases request")
        raise SystemExit(e)

    try:
        recovered_=requests.get(url_recovered).content
    except requests.exceptions.RequestException as e:
        print("Fatal error on recovered cases request")
        raise SystemExit(e)


    # Confirmed cases
    df_confirmed=pd.read_csv(io.StringIO(confirmed_.decode('utf-8')))
    json_data_final = populate(json_data_final,df_confirmed,"confirmed")

    # Deaths cases
    df_deaths=pd.read_csv(io.StringIO(deaths_.decode('utf-8')))
    json_data_final = populate(json_data_final,df_deaths,"deaths")

    # Recovered cases
    df_recovered=pd.read_csv(io.StringIO(recovered_.decode('utf-8')))
    json_data_final = populate(json_data_final,df_recovered,"recovered")

    # Latest cases
    json_data_final['latest'] = {}
    json_data_final['latest']['confirmed'] = json_data_final['confirmed']['latest']
    json_data_final['latest']['deaths'] = json_data_final['deaths']['latest']
    json_data_final['latest']['recovered'] = json_data_final['recovered']['latest']

    # Update datetime
    json_data_final['updatedAt'] = str(datetime.datetime.utcnow())

    with open('data.json', 'w') as f:
        json.dump(json_data_final, f)
        sys.stdout.flush()
        print("Data Updated !")

    return 0

Nos données sont prêtes à ce stade, il suffit de créer un serveur et de configurer les routes.

Etape 2: Création du serveur  

Commençons par créer un fichier app.py qui représente le serveur et le scheduler pour la mise à jour des données. 

from flask import Flask, request
import json
import os

from refresh import update
from apscheduler.schedulers.background import BackgroundScheduler

port_ = 5000
interval_minutes = 10

app = Flask(__name__)

def sensor():
    update()
    print("Scheduler is alive!")

sched = BackgroundScheduler(daemon=True)
sched.add_job(sensor,'interval',minutes=interval_minutes)
sched.start()

@app.route('/')
def index():
    with open('data.json') as f:
        d = json.load(f)
    return d

@app.route('/confirmed')
def confirmed():
    with open('data.json') as f:
        d = json.load(f)
    return d['confirmed']

@app.route('/deaths')
def deaths():
    with open('data.json') as f:
        d = json.load(f)
    return d['deaths']

@app.route('/recovered')
def recovered():
    with open('data.json') as f:
        d = json.load(f)
    return d['recovered']

@app.route('/latest')
def latest():
    with open('data.json') as f:
        d = json.load(f)
    return d['latest']

@app.route('/updatedAt')
def updatedAt():
    with open('data.json') as f:
        d = json.load(f)
    return d['updatedAt']

if __name__ == '__main__':
    # Threaded option to enable multiple instances for multiple user access support
    app.run(threaded=True, port=port_)

Sur le serveur, on configure les endpoints ( ici au nombre de 5, /confirmed, /deaths, /recovered, /latest et /updatedAt ). On lance également un scheduler qui à chaque 10 minutes va vérifier la fraîcheur ❄ de notre data en utilisant la fonction update. Le serveur peut être immédiatement lancé, il est en écoute au port 5000 (127.0.0.1:5000​ ).​ 

Etape 3: Déploiement sur Heroku 

La phase finale est de déployer sur le serveur. (A quoi bon créer une API pour s’en servir seul ? 😂). 

Il faudra créer un compte sur Heroku et y créer une application sur le dashboard.   

Vous avez une application qui tourne maintenant ! 

Il faudra à ce stade créer 2 nouveaux fichiers sur le répertoire de travail, un fichier requirements.txt​ qui contiendra les bibliothèques Python requises que Heroku devra installer avant le déploiement ainsi qu’un fichier ​Procfile(sans extension) qui est un fichier spécial pour Heroku où on lui spécifie la commande de démarrage du déploiement. 

Le fichier requirements.txt 

requests==2.22.0
Flask==1.1.1
pandas==0.24.2
gunicorn==19.9.0
Click==7.0
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
Werkzeug==0.15.6
APScheduler==3.3.1

Le fichier Procfile

web: gunicorn app:app

Après ceci, quelques commandes sont à prévoir. Il faudra se loguer à Heroku, initialiser le git sur le répertoire de travail, lier le répertoire courant au Git de Heroku, ajouter les fichiers, faire un commit et push sur la branche master. 

heroku login git init 

heroku git:remote -a <AppName> git add . 

git commit -am <Commit Message>​ git push heroku master 

Vous verrez le déploiement se faire sur la console de Heroku qui par la même occasion, saura automatiquement quel langage est utilisé, installera les dépendances et lancera l’application automatiquement. Une fois que c’est fait, visitez:

  • https://<AppName>.herokuapp.com/
  • https://<AppName>.herokuapp.com/confirmed
  • https://<AppName>.herokuapp.com/deaths
  • https://<AppName>.herokuapp.com/recovered
  • https://<AppName>.herokuapp.com/latest
  • https://<AppName>.herokuapp.com/updatedAt

en utilisant le nom de votre application pour attaquer l’API. 

Synthèse

On aura appris aujourd’hui comment créer une API du Coronavirus en Flask mais également comment la déployer sur Heroku. C’est à partir de ces résultats qu’une autre application pourra consommer ces données pour les afficher sous un format plus graphique avec des chiffres, des histogrammes, utiliser la latitude et longitude pour présenter les données sur une carte, ou même utiliser le code du pays pour afficher le drapeau national … !

En cet aire de la donnée, les APIs sont des moyens techniques pour exploiter et valoriser les données de manière efficiente. Pour mieux collaborer et échanger, le concept d’API devient de plus en plus commun, apportant certaines valeurs comme l’échange, mais aussi la transparence et le respect de certains formats standards pour l’industrie de l’IT.

Plusieurs questions peuvent se poser concernant la sécurité, la fiabilité (durée de rafraîchissement … ), la robustesse ( montée en charge … ). Des évolutions sont en cours de développement afin de répondre à ces problématiques, mais on ne peut pas nier à quel point les API sont devenues une réelle valeur ajoutée ouvrant sur un monde illimité en matière de possibilités d’exploitation et de valorisation des données.


0 commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

API COVID-19 sous Flask sur Heroku

par Omar L. temps de lecture : 13 min
0