Le protocole HTTP (HyperText Transfer Protocol) est un protocole de communication utilisé pour transférer des données sur le web. Il permet aux clients (comme les navigateurs web) de communiquer avec les serveurs pour échanger des informations.
HTTP fonctionne selon un modèle client-serveur :
Les communications HTTP se font par des requêtes et des réponses :
Les codes de statut HTTP indiquent le résultat d'une requête HTTP. Voici quelques codes de statut courants :
Voici un exemple simple de requête et réponse HTTP :
Requête HTTP :
GET /index.html HTTP/1.1
Host: www.example.com
Réponse HTTP :
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<body>
<h1>Bonjour, monde!</h1>
</body>
</html>
Sur le navigateur web, aller dans les outils de développement web puis aller dans l'onglet réseau.
Après être allé sur plusieurs pages webs, quelles sont les méthodes http utilisées?
Les méthodes HTTP définissent le type d'action à effectuer sur une ressource. Voici deux méthodes courantes :
Le code suivant permet de télécharger le contenu d'une page web comme le fait un navigateur web :
import requests
def get_web_page_content(url):
try:
# Envoyer une requête GET à l'URL spécifiée
response = requests.get(url)
# Vérifier si la requête a réussi (code de statut 200)
if response.status_code == 200:
# Retourner le contenu de la page
return response.text
else:
# Retourner un message d'erreur si la requête a échoué
return f"Erreur: Impossible de récupérer la page. Code de statut: {response.status_code}"
except requests.exceptions.RequestException as e:
# Retourner un message d'erreur en cas d'exception
return f"Erreur: {e}"
# Exemple d'utilisation
url = "https://www.example.com"
content = get_web_page_content(url)
print(content)
Il est possible que l'intéraction entre le client et le serveur soit sécurisée. Pour cela, on utilise le protocole https à la place de http.
Cette différence est visible par l'utilisateur dans la barre d'adresse, et les navigateurs modernes mettent le symbole d'un petit cadenas lorsque la connexion est chiffrée.
Lorsque l'on tente de se connecter à http://duranton.net, est ce que la connexion est sécurisée? (La réponse ne peut-être oui/non)
Sur de nombreuses pages web, des formulaires sont utilisés que ce soit pour une authentification par identifiant et mot de passe ou pour une recherche d’informations. Le formulaire est un élément codé en HTML :
<form action="/submit_post" method="post">
<label for="nom_post">Nom:</label>
<input type="text" id="nom_post" name="nom">
<button type="submit">Envoyer (POST)</button>
</form>
action
spécifie l'URL où les données du formulaire seront envoyées, et l'attribut method
définit la méthode HTTP utilisée pour envoyer les données (ici, post
).for
doit correspondre à l'attribut id
de l'élément de saisie associé.type
spécifie le type de champ (ici, text
), et l'attribut name
est utilisé pour identifier le champ lors de l'envoi du formulaire.type
spécifie que c'est un bouton de soumission.Lorsque l'utilisateur remplit le champ de texte et clique sur le bouton "Envoyer", les données du formulaire sont envoyées à l'URL spécifiée dans l'attribut action
en utilisant la méthode POST.
Lancer un serveur http local grâce à la bibliothèque flask
et tester les formulaires ci-dessous.
import os
#os.chdir("u:\\") # à modifier si nécessaire
# Importation des modules nécessaires de Flask
from flask import Flask, render_template, request, session
# Création d'une instance de l'application Flask
app = Flask(__name__)
# Définition d'une clé secrète pour sécuriser les sessions
app.secret_key = 'votre_cle_secrete' # Remplacez par une clé secrète sécurisée
# Définition de la route principale ('/')
@app.route('/')
def index():
# Récupération de la liste des noms depuis la session, ou une liste vide si la clé 'noms' n'existe pas
noms = session.get('noms', [])
# Rendu du template 'index.html' avec la liste des noms
return render_template('index.html', noms=noms)
# Définition de la route '/submit_get' qui accepte uniquement les requêtes GET
@app.route('/submit_get', methods=['GET'])
def submit_get():
# Récupération du paramètre 'nom' depuis les arguments de la requête GET
nom = request.args.get('nom')
# Vérification si le paramètre 'nom' existe et n'est pas vide
if nom:
# Récupération de la liste des noms depuis la session, ou une liste vide si la clé 'noms' n'existe pas
noms = session.get('noms', [])
# Ajout du nouveau nom à la liste des noms
noms.append(nom)
# Mise à jour de la liste des noms dans la session
session['noms'] = noms
# Rendu du template 'index.html' avec la liste des noms mise à jour
return render_template('index.html', noms=noms)
# Définition de la route '/submit_post' qui accepte uniquement les requêtes POST
@app.route('/submit_post', methods=['POST'])
def submit_post():
# Récupération du paramètre 'nom' depuis le formulaire de la requête POST
nom = request.form.get('nom')
# Vérification si le paramètre 'nom' existe et n'est pas vide
if nom:
# Récupération de la liste des noms depuis la session, ou une liste vide si la clé 'noms' n'existe pas
noms = session.get('noms', [])
# Ajout du nouveau nom à la liste des noms
noms.append(nom)
# Mise à jour de la liste des noms dans la session
session['noms'] = noms
# Rendu du template 'index.html' avec la liste des noms mise à jour
return render_template('index.html', noms=noms)
# Définition de la route '/reset' qui accepte uniquement les requêtes POST
@app.route('/reset', methods=['POST'])
def reset():
# Réinitialisation de la liste des noms dans la session
session['noms'] = []
# Rendu du template 'index.html' avec la liste des noms réinitialisée
return render_template('index.html', noms=[])
# Vérification si le script est exécuté directement
if __name__ == '__main__':
# Lancement de l'application Flask en mode debug désactivé car le mode activé ne marche pas au lycée.
app.run(debug=False)
Et dans le même dossier, avoir un dossier nommé templates
avec à l'intérieur le fichier index.html
qui contient :
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Formulaire GET et POST</title>
</head>
<body>
<h1>Formulaire GET</h1>
<!-- Début du formulaire avec l action '/submit_get' et la méthode 'get' -->
<form action="/submit_get" method="get">
<!-- Étiquette pour le champ de saisie du nom dans le formulaire GET -->
<label for="nom_get">Nom:</label>
<!-- Champ de saisie de texte pour le nom avec l'ID 'nom_get' et le nom 'nom' -->
<input type="text" id="nom_get" name="nom">
<!-- Bouton de soumission du formulaire GET -->
<button type="submit">Envoyer (GET)</button>
</form>
<h1>Formulaire POST</h1>
<!-- Début du formulaire avec l action '/submit_post' et la méthode 'post' -->
<form action="/submit_post" method="post">
<!-- Étiquette pour le champ de saisie du nom dans le formulaire POST -->
<label for="nom_post">Nom:</label>
<!-- Champ de saisie de texte pour le nom avec l'ID 'nom_post' et le nom 'nom' -->
<input type="text" id="nom_post" name="nom">
<!-- Bouton de soumission du formulaire POST -->
<button type="submit">Envoyer (POST)</button>
</form>
<h2>Noms soumis</h2>
<!-- Début d'une liste non ordonnée pour afficher les noms soumis -->
<ul>
<!-- Début d'une boucle Jinja2 pour itérer sur la liste des noms -->
{% for nom in noms %}
- {{ nom }}
{% endfor %}
</ul>
<form action="/reset" method="post">
<!-- Bouton de soumission pour réinitialiser la liste des noms -->
<button type="submit">Réinitialiser la liste</button>
</form>
</body>
</html>