Skip to content

Instantly share code, notes, and snippets.

@xiaofanglegoc
Last active May 9, 2017 16:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xiaofanglegoc/ff12cf1bb77904f799df3dfdf24c9274 to your computer and use it in GitHub Desktop.
Save xiaofanglegoc/ff12cf1bb77904f799df3dfdf24c9274 to your computer and use it in GitHub Desktop.
TC3_serveur
# ==================== Q2-1.py===========================
import http.server
import socketserver
httpd = socketserver.TCPServer(("", 8080),http.server.SimpleHTTPRequestHandler)
httpd.serve_forever()
# ==================== END ===========================
# ==================== TD2/Q3-1.py===========================
# TD2/Q3-1.py
import http.server
import socketserver
# définition du nouveau handler
class RequestHandler(http.server.SimpleHTTPRequestHandler):
# sous-répertoire racine des documents statiques
static_dir = '/client'
# on surcharge la méthode qui traite les requêtes GET
def do_GET(self):
# on modifie le chemin d'accès en insérant un répertoire préfixe
self.path = self.static_dir + self.path
# on traite la requête via la classe parent
http.server.SimpleHTTPRequestHandler.do_GET(self)
# instanciation et lancement du serveur
httpd = socketserver.TCPServer(("", 8080), RequestHandler)
httpd.serve_forever()
# ==================== END ===========================
# ==================== TD2/Q4-1.py===========================
# TD2/Q4-1.py
import http.server
import socketserver
import os
#
# Définition du nouveau handler
#
class RequestHandler(http.server.SimpleHTTPRequestHandler):
# sous-répertoire racine des documents statiques
static_dir = '/client'
# on utilise le nom de fichier pour identifier le serveur
server_version = 'TD2/'+os.path.basename(__file__)+'/0.1'
#
# On surcharge la méthode qui traite les requêtes GET
#
def do_GET(self):
# le chemin d'accès commence par /time
if self.path.startswith('/time'):
self.send_time()
# ou pas...
else:
self.send_static()
#
# On surcharge la méthode qui traite les requêtes HEAD
#
def do_HEAD(self):
self.send_static()
#
# On envoie le document statique demandé
#
def send_static(self):
# on modifie le chemin d'accès en insérant un répertoire préfixe
self.path = self.static_dir + self.path
# on calcule le nom de la méthode parent à appeler (do_GET ou do_HEAD)
# à partir du verbe HTTP (GET ou HEAD)
method = 'do_{}'.format(self.command)
# on traite la requête via la classe parent
getattr(http.server.SimpleHTTPRequestHandler,method)(self)
#
# On envoie un document avec l'heure
#
def send_time(self):
# on récupère l'heure
time = self.date_time_string()
# on génère un document au format html
body = '<!doctype html>' + \
'<meta charset="utf-8">' + \
'<title>l\'heure</title>' + \
'<div>Voici l\'heure du serveur :</div>' + \
'<pre>{}</pre>'.format(time)
# pour prévenir qu'il s'agit d'une ressource au format html
headers = [('Content-Type','text/html;charset=utf-8')]
# on envoie
self.send(body,headers)
#
# On envoie les entêtes et le corps fourni
#
def send(self,body,headers=[]):
# on encode la chaine de caractères à envoyer
encoded = bytes(body, 'UTF-8')
# on envoie la ligne de statut
self.send_response(200)
# on envoie les lignes d'entête et la ligne vide
[self.send_header(*t) for t in headers]
self.send_header('Content-Length',int(len(encoded)))
self.end_headers()
# on envoie le corps de la réponse
self.wfile.write(encoded)
#
# Instanciation et lancement du serveur
#
httpd = socketserver.TCPServer(("", 8080), RequestHandler)
httpd.serve_forever()
#======================================================================================
# # TD2/Q5-1.py
import http.server
import socketserver
import os
from urllib.parse import urlparse, parse_qs
from datetime import datetime
from pytz import timezone
import pytz
#
# Définition du nouveau handler
#
class RequestHandler(http.server.SimpleHTTPRequestHandler):
# sous-répertoire racine des documents statiques
static_dir = '/client'
# on utilise le nom de fichier pour identifier le serveur
server_version = 'TD2/'+os.path.basename(__file__)+'/0.1'
#
# On surcharge la méthode qui traite les requêtes GET
#
def do_GET(self):
# on initialise nos variables d'instance
self.init_vars()
# le chemin d'accès commence par /time
if self.path_info[0] == 'time':
self.send_time()
# ou pas...
else:
self.send_static()
#
# On surcharge la méthode qui traite les requêtes HEAD
#
def do_HEAD(self):
self.send_static()
#
# On surcharge la méthode qui traite les requêtes GET
#
def do_POST(self):
# on initialise nos variables d'instance
self.init_vars()
# le chemin d'accès commence par /time
if self.path_info[0] == 'time':
self.send_time()
# ou pas...
else:
self.send_error(501,'Unsupported method (\'POST\')')
#
# On initialise les variables d'instance
#
def init_vars(self):
# analyse de l'adresse
info = urlparse(self.path)
self.path_info = info.path.split('/')[1:]
self.query_string = info.query
self.params = parse_qs(info.query)
print(self.path_info);
# récupération du corps
length = self.headers.get('Content-Length')
ctype = self.headers.get('Content-Type')
if length:
self.body = str(self.rfile.read(int(length)),'utf-8')
if ctype == 'application/x-www-form-urlencoded' :
self.params = parse_qs(self.body)
print(length,ctype,self.params)
#
# On envoie le document statique demandé
#
def send_static(self):
# on modifie le chemin d'accès en insérant un répertoire préfixe
self.path = self.static_dir + self.path
# on calcule le nom de la méthode parent à appeler (do_GET ou do_HEAD)
# à partir du verbe HTTP (GET ou HEAD)
method = 'do_{}'.format(self.command)
# on traite la requête via la classe parent
getattr(http.server.SimpleHTTPRequestHandler,method)(self)
#
# On envoie un document avec l'heure
#
def send_time(self):
# on récupère le fuseau horaire demandé
if len(self.path_info) > 1:
tz_name = '/'.join(self.path_info[1:])
elif 'timezone' in self.params.keys():
tz_name = self.params['timezone'][0]
else:
self.send_error(400,'No Time Zone')
return
try:
tz = timezone(tz_name)
except(pytz.exceptions.UnknownTimeZoneError):
self.send_error(400,'Unknown Time Zone')
return
# on récupère la date et l'heure
time = datetime.utcnow()
# on convertit vers le fuseau demandé
tz_time = tz.normalize(pytz.utc.localize(time).astimezone(tz))
# on génère un document
body = '<!doctype html>' + \
'<meta charset="utf-8">' + \
'<title>l\'heure dans le fuseau {}</title>'.format(tz_name) + \
'<pre>Voici la date et l\'heure UTC du serveur :\n\n' + \
'{}\n\n'.format(time) + \
'Dans le fuseau {} il est :\n\n'.format(tz_name) + \
'{}</pre>'.format(tz_time)
# on envoie
headers = [('Content-Type','text/html;charset=utf-8')]
self.send(body,headers)
#
# On envoie les entêtes et le corps fourni
#
def send(self,body,headers=[]):
# on encode la chaine de caractères à envoyer
encoded = bytes(body, 'UTF-8')
# on envoie la ligne de statut
self.send_response(200)
# on envoie les lignes d'entête et la ligne vide
[self.send_header(*t) for t in headers]
self.send_header('Content-Length',int(len(encoded)))
self.end_headers()
# on envoie le corps de la réponse
self.wfile.write(encoded)
#
# Instanciation et lancement du serveur
#
httpd = socketserver.TCPServer(("", 8080), RequestHandler)
httpd.serve_forever()
#======================================================================================
# TD2/Q6-1.py
# pour le serveur web
import socketserver
# pour la gestion des noms de fichiers
import os
# pour l'accès base de données
import sqlite3
#
# Définition du nouveau handler
#
from server import generic
class RequestHandler(generic.RequestHandler):
# on utilise le nom de fichier pour identifier le serveur
server_version = 'TD2/'+os.path.basename(__file__)+'/0.1'
#
# On surcharge la méthode qui traite les requêtes GET
#
def do_GET(self):
# on initialise nos variables d'instance
self.init_vars()
# le chemin d'accès commence par /lignes
if self.path_info[0] == 'lignes':
self.send_trains()
# ou pas...
else:
self.send_static()
#
# On envoie un document avec la liste des lignes
#
def send_trains(self):
conn = sqlite3.connect('sncf.sqlite')
c = conn.cursor()
c.execute("SELECT DISTINCT c.hexadecimal, p.code_ligne, p.nom_ligne " +\
"FROM ponctualite_transilien AS p, couleur_transilien as c " +\
"WHERE c.code_ligne = p.code_ligne " +\
"ORDER BY p.code_ligne")
r = c.fetchall()
header = '<tr><td colspan=2>code</td><td>ligne</td><tr>'
rows = ['<tr><td style="background-color: {}">&nbsp;</td><td>{}</td><td>{}</td></tr>'.format(*a) for a in r]
html = '<table>{}\n{}</table>'.format(header,'\n'.join(rows))
headers = [('Content-Type','text/html;charset=utf-8')]
self.send(html,headers)
#
# Instanciation et lancement du serveur
#
httpd = socketserver.TCPServer(("", 8080), RequestHandler)
httpd.serve_forever()
#=====================================================================================================
# TD2/Q6-2.py
# pour le serveur web
import socketserver
# pour la gestion des noms de fichiers
import os
# pour l'accès base de données
import sqlite3
# pour le tracé graphique
import matplotlib.pyplot as plt
from random import random
# pour la fonction d'interpolation
import numpy as np
from scipy import interpolate
#
# Définition du nouveau handler
#
from server import generic
class RequestHandler(generic.RequestHandler):
# on utilise le nom de fichier pour identifier le serveur
server_version = 'TD2/'+os.path.basename(__file__)+'/0.1'
#
# On surcharge la méthode qui traite les requêtes GET
#
def do_GET(self):
# on initialise nos variables d'instance
self.init_vars()
# le chemin d'accès commence par /lignes
if self.path_info[0] == 'lignes':
self.send_trains()
# le chemin d'accès commence par /ponctualite/RER
elif self.path_info[0] == 'ponctualite':
self.send_ponctualite()
# ou pas...
else:
self.send_static()
#
# On envoie un document avec la liste des lignes
#
def send_trains(self):
conn = sqlite3.connect('sncf.sqlite')
c = conn.cursor()
c.execute("SELECT DISTINCT c.hexadecimal, p.code_ligne, p.nom_ligne " +\
"FROM ponctualite_transilien AS p, couleur_transilien as c " +\
"WHERE c.code_ligne = p.code_ligne " +\
"ORDER BY p.code_ligne")
r = c.fetchall()
header = '<tr><td colspan=2>code</td><td>ligne</td><tr>'
rows = ['<tr><td style="background-color: {}">&nbsp;</td><td>{}</td><td>{}</td></tr>'.format(*a) for a in r]
html = '<table>{}\n{}</table>'.format(header,'\n'.join(rows))
headers = [('Content-Type','text/html;charset=utf-8')]
self.send(html,headers)
#
# On génère et on renvoie un graphique de ponctualite (cf. TD1)
#
def send_ponctualite(self):
conn = sqlite3.connect('sncf.sqlite')
c = conn.cursor()
# liste des lignes de RER avec leur code couleur
condition_code_ligne = ("= '{}'".format(self.path_info[2]) if len(self.path_info) > 2 else "LIKE '%'")
c.execute("SELECT DISTINCT ponctualite_transilien.code_ligne, couleur_transilien.hexadecimal \
FROM ponctualite_transilien, couleur_transilien \
WHERE ponctualite_transilien.code_ligne = couleur_transilien.code_ligne \
AND ponctualite_transilien.type_ligne = '{}' \
AND ponctualite_transilien.code_ligne {} \
ORDER BY ponctualite_transilien.code_ligne".format(self.path_info[1],condition_code_ligne))
lignes = c.fetchall()
# configuration du tracé
plt.figure(figsize=(18,6))
plt.ylim(65,100)
plt.grid(True)
# boucle sur les lignes
for l in (lignes):
c.execute("SELECT ponctualite_transilien.* \
FROM ponctualite_transilien \
WHERE ponctualite_transilien.code_ligne = ? \
ORDER BY annee, mois",l[0])
a = c.fetchall()
# il y a une valeur manquante pour le RER B
x = [n for n in range(len(a)) if not a[n][7] == '']
y = [r[7] for r in a if not r[7] == '']
# interpolation spline
spl = interpolate.splrep(x, y, s=0)
x2 = [n/10 for n in range(10*(len(a)-1)+1)]
y2 = interpolate.splev(x2, spl, der=0)
# tracé de la courbe de régularité
plt.plot(x2,y2,linewidth=2,color=l[1], label=('RER ' if self.path_info[1] == 'RER' else 'ligne ')+l[0])
plt.plot(x,y,linewidth=0,marker='s',markeredgecolor='w',markerfacecolor=l[1],markersize=10)
# configuration du tracé (titre, grille)
plt.grid(which='major', color='#888888', linestyle='-')
plt.grid(which='minor',axis='x', color='#888888', linestyle=':')
plt.title('Ponctualité des lignes {} (en %)'.format(self.path_info[1]),fontsize=16)
# configuration de l'axe du temps
mois = ['Jan','Fév','Mar','Avr', 'Mai', 'Juin', 'Juil', 'Août', 'Sept', 'Oct', 'Nov', 'Déc']
xticks = [n*4 for n in range(int(len(a)/4))]
xlabels = ['{} {}'.format(mois[r[2]-1], r[1]) for r in [a[t] for t in xticks]]
plt.xlim(0,len(a)-1)
ax = plt.subplot(111)
ax.set_xticks(xticks)
ax.set_xticks(x, minor=True)
ax.set_xticklabels(xlabels, fontsize=12)
# légende
plt.legend(loc='lower left')
fichier = 'courbe_ponctualite.png'
plt.savefig('client/{}'.format(fichier))
html = '<img src="{}?{}" alt="ponctualite {}" width="100%">'.format(fichier,random(),self.path_info[1])
headers = [('Content-Type','text/html;charset=utf-8')]
self.send(html,headers)
#
# Instanciation et lancement du serveur
#
httpd = socketserver.TCPServer(("", 8080), RequestHandler)
httpd.serve_forever()
#======================================
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment