2009-04-23 5 views
3

J'écris un serveur web HTTP plutôt simple dans python3. Le serveur web doit être simple - lecture de base à partir des fichiers de configuration, etc. Je n'utilise que des librairies standard et pour l'instant cela fonctionne plutôt bien.Python3 Http Web Server: hôtes virtuels

Il n'y a qu'une seule exigence pour ce projet, que je ne peux pas implémenter seul - les hôtes virtuels. J'ai besoin d'avoir au moins deux hôtes virtuels, définis dans les fichiers de configuration. Le problème est que je ne peux pas trouver un moyen de les implémenter en python. Quelqu'un at-il des guides, des articles, peut-être une mise en œuvre simple comment cela peut-il être fait?

Je serais reconnaissant pour toute aide.

+0

La question a été de répondre, pourquoi ne pas le marquer comme tel? –

Répondre

5

Pour un simple serveur web HTTP, vous pouvez commencer avec le WSGI reference implementation:

wsgiref est une implémentation de référence de la spécification WSGI pouvant être utilisée pour ajouter un support WSGI à un serveur ou un framework Web. Il fournit des utilitaires pour manipuler les variables d'environnement WSGI et les en-têtes de réponse, les classes de base pour l'implémentation de serveurs WSGI, un serveur HTTP de démonstration qui sert des applications WSGI, ...

Modification du serveur par exemple pour vérifier l'en-tête HTTP_HOST, ici est une application simple qui répond, en fonction de l'hôte virtuel, avec un texte différent. (L'extension de l'exemple pour utiliser un fichier de configuration est laissée en exercice).

import wsgiref 
from wsgiref.simple_server import make_server 

def my_app(environ,start_response): 
    from io import StringIO 
    stdout = StringIO() 
    host = environ["HTTP_HOST"].split(":")[0] 
    if host == "127.0.0.1": 
     print("This is virtual host 1", file=stdout) 
    elif host == "localhost": 
     print("This is virtual host 2", file=stdout) 
    else: 
     print("Unknown virtual host", file=stdout) 

    print("Hello world!", file=stdout) 
    print(file=stdout) 
    start_response(b"200 OK", [(b'Content-Type',b'text/plain; charset=utf-8')]) 
    return [stdout.getvalue().encode("utf-8")] 

def test1(): 
    httpd = make_server('', 8000, my_app) 
    print("Serving HTTP on port 8000...") 

    # Respond to requests until process is killed 
    httpd.serve_forever() 
+0

Vous ne pouvez pas utiliser l'implémentation de référence WSGI pour Python 3.0 car WSGI for Python 3.0 n'existe pas. La spécification WSGI 1.0 ne prend en charge que Python 2.X. En tant que tel, utilisez tout ce qui prétend satisfaire à la spécification WSGI et qui fonctionne avec Python 3.0 avec une extrême suspicion et comprenez que si une spécification WSGI est jamais publiée pour Python 3.0, tout code que vous avez qui fonctionne avec quelque chose d'avant ce point travail. –

+2

18 mois plus tard, py3k a toujours wsgiref dans la bibliothèque standard, http://docs.python.org/py3k/library/wsgiref.html#module-wsgiref – gimel

+0

@gimel Je suis amoureux de la simplicité de cet exemple. Pouvez-vous penser à une raison de ne pas l'utiliser pour servir de petits projets WSGI par opposition à quelque chose comme Gunicorn ou CherryPy? Je cherche à abandonner apache + mod_wsgi pour un hôte qui n'a que de simples webservices WSGI. – DeaconDesperado

10

Les hôtes virtuels fonctionnent en obéissant à l'en-tête Host: dans la requête HTTP.

Il suffit de lire les en-têtes de la demande, et prendre des mesures en fonction de la valeur de l'hôte: en-tête

Questions connexes