Python - Corrigé du TD 6



Exercice 1


#!/usr/bin/env python
# -*- encoding: utf8 -*-
"""
Client pour serveur d'injures du capitaine Haddock, en xmlrpc (imite un exemple classique de SOAP)
"""


from xmlrpclib import ServerProxy



server=ServerProxy("
http://monge.univ-mlv.fr:8888")


if "__name__==__main__":
    
print __doc__
    
print "Methodes du serveur:\n"
    
for m in  server.system.listMethods(): print m
    
print
    
print "Un appel de server.jure() donne: ", server.jure()
    
print "C'est en base 64, il faut decoder: "
    
print "\n\t"+server.jure().decode('base64').rstrip()+"!"
    open('
insultes.txt','w').write(server.tous_les_jurons().decode('base64'))
    
print "Liste récupérée!"
    
# Un peu de curiosité permet de récupérer le code du serveur
    
print "\n\t"+decodestring(server.__())


Code du serveur :


# -*- coding: iso-8859-15 -*-
#!/usr/bin/env python

"""
Serveur d'injures du capitaine Haddock. Utilise le
protocole xmlrpc. Le données sont encodées en
base 64 à cause des caracteres accentués.
"""


from SimpleXMLRPCServer import SimpleXMLRPCServer as Server
from random import randint        

jurons=open('jurons.txt','r').readlines()

def jure():
        return jurons[randint(0,len(jurons))].encode('base64')

def help(): return  "ENCODAGE=BASE64"

def __():
    s=open('haddockServer.py','r').read()
    return s.encode('base64')

def tous_les_jurons():
    s=open('jurons.txt','r').read()
    return s.encode('base64')

server = Server(('193.55.63.80', 8888))

server.register_function(tous_les_jurons)
server.register_function(jure)
server.register_function(help)
server.register_function(__)
server.register_introspection_functions()

try:
    server.serve_forever()
finally:
    server.server_close()

Exercice 2

import xmlrpclib
import pprint
client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
print client.package_releases('roundup')
pprint.pprint(client.release_urls('roundup', '1.4.10'))

print client.system.listMethods()

s='Framework :: Flask'

ll = client.browse([s])

for x in ll:
        print x[0], ': ',client.release_data(*x)['summary']


print client.release_data(*['flask_simplerest', '1.0.3'])['description']

Exercice 3

# Minimalist RESTful Haddock server
# start_response est une methode de BaseHandler,
# defini dans wsgiref.handlers.py

import restlite, wsgiref.simple_server

def juron_handler(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    j = juron()
    return j.decode('latin1').encode('utf8')

def jurons_handler(env, start_response):
    try:
        nombre = int(env['wsgiorg.routing_args']['nombre'])
        start_response('200 OK', [('Content-Type', 'text/html')])
        j = jurons(nombre)
        return j.decode('latin1').encode('utf8')
    except Exception, e: print e


liste_jurons=open('jurons.txt','r').readlines()
from random import randint

def juron():
    return liste_jurons[randint(0,len(liste_jurons)-1)]

def jurons(n):
    html = '''<html><body>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
        <h1 align="center">Les %d jurons demand&eacute;s :</h1>
                   <br><br> %s </body/</html>
'''
    s = '\n'.join(['<br>'+liste_jurons[randint(0,len(liste_jurons)-1)] for i in range(n)])
    return html % (n,s)


def portrait_handler(env, start_response):
    start_response('200 OK', [('Content-Type', 'image/jpeg')])
    return open('haddock.jpg').read()



routes = [
 (r'GET /juron$', juron_handler),
 (r'GET /jurons\?nombre=(?P<nombre>\d*)', jurons_handler),
 (r'GET /portrait$',  portrait_handler)
]


httpd = wsgiref.simple_server.make_server('193.55.63.80', 8889, restlite.router(routes))
httpd.serve_forever()