Partage

[Python] Papache

Un serveur web en Python

8 juin 2008 à 17:49:07

Je voudrais vous faire part, après quatre mois de développement, d'un projet né d'un petit défi sur #sdz : un serveur HTTP en Python.
Je ne poste pas dans la catégorie "Vos projets" tout simplement parce que Papache n'a en soi rien de novateur. Il existe déjà des serveurs webs plus performants. Mais son intérêt réside dans son code. C'est pourquoi je poste ici.

Image utilisateur

Le projet, commencé en février, dispose maintenant de nombreuses capacités :
  • Des fichiers de configuration généraux et locaux
  • Un petit support pour la CGI en cours d'amélioration :-°
  • Des pages d'erreur personnalisées
  • Un listage des répertoires sans index, comprenant le nom, la taille, etc. du fichier
  • Un petit programme qui vérifie la validité des fichiers de configuration
  • ...

Le travail actuel consiste à réécrire son code en Orienté Objet, parce que, comme vous l'avez probablement remarqué, le nombre d'arguments des fonctions comme celle générant les logs est un peu accablant.
Image utilisateur
Je vous rassure, ce logo n'est que temporaire


Une documentation expliquant comment installer et configurer Papache se trouve à cette adresse.
Vous pouvez aussi utiliser le dépôt mercurial mis en place par delroth :
hg clone http://delroth.is-a-geek.org:8080/

Vous pouvez également consulter le code sans le télécharger à l'aide du browser intègré à Trac.

Enfin, vous pouvez tester Papache du côté client : il est bien souvent lancé sur le serveur SSH d'Alwaysdata :

J'attends donc vos avis, vos conseils (parce qu'il y a un énorme boulot pour rendre le code un peu plus beau), et, ne disposant pas de serveur dédié, je serais très intéressé par l'expérience de quelqu'un hébergeant au quotidien son site avec Papache.

Ah, et puisque j'avais le temps, j'ai fait une Boîte Utilisateur :-°
Une dernière chose : pour être tenu au courant des dernières nouveautés concernant Papache, venez sur #papache@irc.epiknet.org. Les cinq premiers auront l'autovoice §
Merci !

Vous êtes demandeur d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur web junior

Je postule
Formation
en ligne
Financée
à 100%
Anonyme
8 juin 2008 à 17:59:00

Citation : Krankkatze

(parce qu'il y a un énorme boulot pour rendre le code un peu plus beau)



T'en fais pas, du code python c'est toujours moche.

Je connaissais déjà ( :D ) et c'est bien fait. C'est très éducatif.
Anonyme
8 juin 2008 à 18:11:12

J'ai regardé en vitesse, tout d'abord dans ton outil de vérification de configuration, utilises optparse plutot que de parser les options à la main comme tu le fais actuellement.

Ensuite, pourquoi utiliser un format de fichier de configuration fait à la main plutot que par exemple du JSON, du XML ou juste un fichier INI, qui sont tous les trois parsables extrèmement facilement en Python (pour le premier, un simple eval() dans un sandbox, pour le deuxième, ElementTree ou BeautifulSoup, et pour le troisième ConfigParser).

Après, os.path.join est super pour rendre son code portable, ce que le tien n'est pas pour le moment (et ouais, les /, Windows aime pas). On a aussi des supers modules comme urlparse qui coupe une URL en morceaux, ou httplib qui te permettrais de traiter tes headers très facilement.

Bref, j'ai pas regardé en détail, mais je vois déja ça de flagrant ;) .
8 juin 2008 à 18:16:08

Merci :)
Je me pencherai sur la question du fichier de configuration. Quant à porter pour windows, je sais pas si j'ai grand intérêt à le faire : qui, de nos jours, a envie de faire un serveur sous windows en y installant Python ?
8 juin 2008 à 18:25:54

Citation : Krankkatze

Quant à porter pour windows, je sais pas si j'ai grand intérêt à le faire : qui, de nos jours, a envie de faire un serveur sous windows en y installant Python ?



La question ne se pose pas en ces termes.
Aujourd'hui quand on programme, on fait des programmes portables (point)

Surtout que comme tu le fais en Python ce n'est pas bien dur.

Je connais par exemple des gens qui programme en Django sous Windows (Oui ils ont bien du courage mais ça fonctionne).

En gros, faire un truc portable c'est toujours une bonne idée.
Je trouve ça sympa, as-tu un repos mercurial ou svn ?

Fait attention, il me semble avoir entendu qu'il est interdit de lancer daemon sur alwaysdata.
Si tu as besoin, je peux te passer un bout de dedibox (pour un petit prix :p)
8 juin 2008 à 18:29:45

J'ai pas de budget informatique :-°

Sinon, j'ai pas de svn, sinon ça voudrait dire que j'aurais un serv dédié et que je l'utiliserais avec Papache pour mon site § Par contre, j'édite le premier post pour ajouter #papache, où on peut se renseigner sur les dernières versions (pour se mettre à jour).
8 juin 2008 à 20:23:40

Citation : Krankkatze

J'ai pas de budget informatique :-°

Sinon, j'ai pas de svn, sinon ça voudrait dire que j'aurais un serv dédié



Faux :p
Beanstalk est ton ami ;)

Pour ce qui est de Papache, je compte bien suivre de près son développement de manière à parfaire mes connaissances en Python et serveur web, et pourquoi pas - un jour peut-être - contribuer d'une manière ou d'une autre à ce projet (on peut toujours rêver :p )

P.S :
x = 1 # Variable pour la boucle infinie
while x==1:


pourquoi ne pas faire tout simplement while 1: ?
Et oui, je sais, c'est un micro-détail :-°
8 juin 2008 à 21:22:02

Salut,

Je tenais à te féliciter pour ce projet. Le server à l'air performant et bien codé. Mais je n'ai pas trop approfondi. SI tu veux de l'aide, n'hésites surtout pas à me MP, j'ai du temps libre en ce moment :) .
8 juin 2008 à 22:26:42

K-Phoen, ça fait partie du code que j'ai codé quand je codais en Python comme en C :-°
Je vais m'empresser de le corriger. Sinon, sache que si tu veux participer, tu peux t'y mettre dès maintenant :p
Tout s'organise sur #papache, donc venez en masse, il me reste 4 autovoices à distribuer §
8 juin 2008 à 22:55:11

Proposition très alléchante, mais je préfère être certain de ne pas ralentir l'avancement du projet avant de m'y joindre =)

En attendant, j'essaierai de passer de temps en temps sur le chan :D

Edit : après avoir rapidement parcouru le code, et brièvement testé le serveur, j'ai repéré une petite erreur d'étourderie : dans les logs, le Referer indique la même info que le User-Agent.
L'erreur doit très probablement venir de la fonction generer_log(), et plus précisément de la ligne 280.
log_texte += "Referer: "+programme_client+"\n" devrait en fait être log_texte += "Referer: "+provenance+"\n" ;)

Ensuite, on pourrait remplacer les if chemin_log == "": par des if not chemin_log: (ça serait quand même un peu plus moins pas beau nan ? :p )

Sur ce, je vais dodoter, et je commencerai à m'y mettre sérieusement demain (kewl, je vais enfin pouvoir mettre à profit la fin des cours ^^)
11 juin 2008 à 13:52:50

Merci pour tes conseils. Je suis en train (comme ceux qui sont sur #papache le savent :-°) de retravailler tout le code qui est truffé de ce genre de choses. Ah, et j'édite le premier post pour mettre le super logo :-°
11 juin 2008 à 16:14:53

Excellent le logo, j'accroche. Je passe bientôt sur IRC ne t'inquiètes pas ^^ .
12 juin 2008 à 20:17:34

Krankkatze et Papache m'ayant donné des idées, je me suis moi aussi mis au développement d'un serveur HTTP en Python :p

Ceux qui liront mon code le verront, le serveur et ses fonctionnalités sont hyper basiques, mais ça suffit largement pour apprendre les grandes lignes du fonctionnement du protocole HTTP, ce qui est le but premier de mon script. Cependant, il est plus que probable que de nouvelles fonctions soient implémentées dans les prochains jours :-°

J'ajouterai que si je poste mon script ici, ce n'est nullement pour concurrencer Papache, mais plutôt pour avoir l'avis et les conseils de développeurs Python plus expérimentés que moi (ce qui ne devrait pas être bien difficile à trouver étant donné que je code en python depuis ~ deux semaines :lol: )

Donc voilà, pour ceux qui seraient prêts à perdre quelques instants à lire mon code, vous pourrez le trouver ici

Merci d'avance,
K-Phoen

P.S : pour tester le serveur, éditez le fichier server.py pour mettre les valeurs qui correspondent à vos besoins pour le répertoire contenant les pages web (clé "home_www" dans le dico "config"), et le répertoire contenant le serveur (clé "install_path" dans le même dico).
Ces valeur devraient disparaître dans les prochains jours, je compte revoir la gestion de la configuration :)
Il suffit ensuite de faire python server.py pour lancer le serveur.
13 juin 2008 à 2:44:25

Quelles sont les differences avec Cherrypy ?
13 juin 2008 à 13:02:35

En ce qui me concerne, CherryPy est sûrement plus complet et mieux codé que ce que j'ai fait. Donc la principale différence serait que mon code n'a qu'un but "éducatif" (je ne compte pas pour le moment l'utiliser en prod), alors que CherryPy pourrait être utilisé sur un serveur.
15 juin 2008 à 0:48:22

J'ai mis en place un Trac pour remplacer tout le bazard avec la doc, les sources et tout le reste mal rangé. Il est accessible ici.
Sinon, la 1.0 est sortie en beta : le code a été réécrit plus proprement, la CGI repensée et quelques options de configuration ajoutées.
16 juin 2008 à 9:49:03

Ben le voilà le SVN que je demandais :p
Merci :)
19 juin 2008 à 10:54:38

C'est une très bonne idée, mais j'ai un peu regardé ton code et ... cela n'utilise pas les fonctionnalité objets, et ce n'est quasiment pas structuré o_O
C'est peut-être un choix, mais quand même faire du python sans faire de POO ?
Tu auras beaucoup moins de mal à maintenir et a améliorer ton code si tu le structures en classe.
19 juin 2008 à 21:42:51

J'ai pas réussi à faire marcher le SVN moi :-°

Pour la POO, en fait, je vais re-revoir le code prochainement, mais je trouve pas qu'il y aie assez de fonctions, variables etc... pour aller m'embêter avec des self.machin ...

[Python] Papache

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
  • Editeur
  • Markdown