2009-05-08 7 views
19

Comment puis-je utiliser un sous-domaine dans google app engine (python)?Utilisation du sous-domaine dans google app engine

Je veux obtenir la première partie du domaine et prendre une action (gestionnaire).

Exemple:
          product.example.com -> envoyer aux produits gestionnaire
          user.example.com -> envoyer au gestionnaire d'utilisateurs

En fait, en utilisant le chemin virtuel j'ai ce code:

Répondre

26

WSGIApplication ne peut pas effectuer de routage en fonction du domaine. , Vous avez besoin au lieu de créer une application distincte pour chaque sous-domaine, comme celui-ci:

applications = { 
    'product.example.com': webapp.WSGIApplication([ 
    ('/', IndexHandler), 
    ('/(.*)', ProductHandler)]), 
    'user.example.com': webapp.WSGIApplication([ 
    ('/', IndexHandler), 
    ('/(.*)', UserHandler)]), 
} 

def main(): 
    run_wsgi_app(applications[os.environ['HTTP_HOST']]) 

if __name__ == '__main__': 
    main() 

Alternativement, vous pouvez écrire votre propre sous-classe WSGIApplication qui sait comment gérer plusieurs hôtes.

+0

Merci! Avez-vous un échantillon de cette sous WSGIApplication à moi? Je parle avec python ... – Zote

+0

Consultez la source de la version actuelle sur http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/webapp/__init__ .py - modifier la méthode __call__ pour prendre en compte le nom d'hôte devrait être assez simple. –

+0

Le code ci-dessus ne semble pas fonctionner en production avec les deux sous-domaines liés à une application GAE. Est-ce que quelqu'un a réussi à faire ça? – kovshenin

2

J'ai aimé l'idée de Nick mais j'ai eu un problème légèrement différent. Je voulais faire correspondre un sous-domaine spécifique pour le gérer un peu différemment, mais tous les autres sous-domaines devraient être traités de la même manière. Alors voici mon exemple.

import os 

def main(): 
    if (os.environ['HTTP_HOST'] == "sub.example.com"): 
     application = webapp.WSGIApplication([('/(.*)', OtherMainHandler)], debug=True) 
    else: 
     application = webapp.WSGIApplication([('/', MainHandler),], debug=True) 

    run_wsgi_app(application) 


if __name__ == '__main__': 
    main()