2009-03-09 5 views
35

Je commence un nouveau projet d'application web en utilisant Django et Pinax. Je veux être en mesure de donner à mes utilisateurs des noms de domaine uniques comme Wordpress et d'autres sites: username.wordpress.com. Je ne sais pas comment aborder cela avec Django, puisque la logique d'analyse de l'url (dans urls.py) commence par l'URL APRES le nom de domaine. Plus spécifiquement, il y aura plusieurs groupes d'utilisateurs, chaque groupe ayant un nom unique. Pas sûr que cela fasse une différence, mais j'ai pensé que je devrais le mentionner.Dans une application Web django, comment donner aux utilisateurs leur propre sous-domaine?

Y at-il un moyen de manipuler la requête http afin que l'URL ressemble à Django comme si l'URL était quelque chose comme www.domain.com/groupname, mais toujours affiché dans la barre d'adresse du navigateur comme groupname.domain.com?

+4

Ceci est envisagé d'ajouter à Django 1.2: http://code.djangoproject.com/ticket/8896 –

+0

http://github.com/tkaemming/django -subdomains – Daryl

+0

merci de poster - Je vais certainement vérifier cela la prochaine fois que j'ai besoin de cela (projet que cette question était liée a été abandonnée). –

Répondre

24

Vous pouvez utiliser un intergiciel personnalisé pour intercepter la requête et récupérer le sous-domaine. Le code suivant récupérera le sous-domaine et redirigera vers une vue par reversing the named url. Mettez-le dans un fichier middleware.py dans votre application. Assurez-vous de configurer le middleware dans votre fichier settings.py.

Assurez-vous que vous avez nommé votre point de vue en urls.py

middleware.py

from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 
import re 

subdomain_pattern = re.compile('(?P<subdomain>.*?)\..*?') 

class SubdomainMiddleware(object): 
    def process_request(self, request): 
     match = subdomain_pattern.match(request.get_host()) 
     subdomain = match.group('subdomain') 
     redirect_url = reverse('groups_detail', args=[subdomain]) 
     return HttpResponseRedirect(redirect_url) 

urls.py

from django.conf.urls.defaults import * 

urlpatterns = patterns('', 
    url(r'^groups/(?P<name>.+)/$', 'groups.views.detail', {}, name='group_detail'), 
) 

Remarque: ce code est non testé.

La redirection peut modifier l'apparence de l'URL. Si vous voulez éviter cela, il vous suffit d'appeler la vue associée, de capturer son résultat et de le renvoyer dans un .

+0

+1: L'intergiciel est la meilleure façon de le faire, à mon humble avis. Du côté serveur Web/DNS, vérifiez les sous-domaines génériques. – Tiago

+0

Cela semble bien. Vous ne savez pas exactement comment changer le chemin de la requête - est-ce que HttpRequest.build_absolute_uri (emplacement) change réellement le chemin, ou retourne simplement une chaîne? Je pourrais changer l'attribut 'path' directement, mais les docs disent que "tous les attributs excepté' session' devraient être considérés comme étant en lecture seule –

+0

Trouver le sous-domaine est juste une partie du mixage Si ça marche cela ressemble à une excellente solution que je n'ai pas entendu parler, mais pourriez-vous mettre à jour le poste avec le code pour changer l'url de la demande afin qu'il reflète le "vrai" url Django? Merci (j'ai un site avec des réécritures et j'aime beaucoup mieux cette possibilité) –

2

Vous devez gérer cela via votre serveur web. Si vous avez Django urls comme ...

/users/<username>/ 

... puis utilisez les règles de réécriture dans le serveur Web à la carte <username>.domain.com-domain.com/users/<username>/.

Si vous utilisez Apache, vous pouvez lire here. Autrement, chaque serveur web a ses propres conventions mais toutes supporteront la notion de réécriture d'url.

+0

Cela semble fonctionner, et il y a même un exemple de 'Virtual Hosts' qui est assez similaire à ce que je veux. Mais je ne ressemble en aucun cas à un administrateur Apache, et j'ai peur de mettre la 'logique applicative' dans la configuration du serveur web. Aussi, je devrais développer sur Apache au lieu du serveur de développement Django. –

+0

Vous pouvez toujours développer sur le serveur de dev ... juste ne pointez pas vers les URL absolues dans vos modèles.Je déteste aussi mettre des fichiers conf avec Apache, mais c'est un travail de copier-coller. –

+0

Je suis curieux. À votre avis, pensez-vous que c'est une meilleure façon de le faire que d'utiliser Middleware? Cela me semble un peu plus propre. –

0

Voir this autre alternative configuration du serveur d'applications

Questions connexes