I also tried to find the solution to handle multiple domain without
using django site framework, but i did not find anything, so i made a
small patches to implement it. here is the usage,

urls.py:
urlpatterns = patters("",
...........
    url(r'^', include("example_com.urls"), site="^www.example.com$" ),
    url(r'^', include("example_com1.urls"), site=lambda x : x ==
"www.example1.com" ),
...........
)

you can use just regular expression or function in 'site' argument.
here is the patch against django 1.0.2

====================================================
diff -uNr django/conf/urls/defaults.py django-patched/conf/urls/
defaults.py
--- django/conf/urls/defaults.py        2008-11-19 14:44:19.000000000 +0900
+++ django-patched/conf/urls/defaults.py        2008-12-22 17:56:53.223489610
+0900
@@ -18,10 +18,10 @@
         pattern_list.append(t)
     return pattern_list

-def url(regex, view, kwargs=None, name=None, prefix=''):
+def url(regex, view, kwargs=None, name=None, prefix='', site=None):
     if type(view) == list:
         # For include(...) processing.
-        return RegexURLResolver(regex, view[0], kwargs)
+        return RegexURLResolver(regex, view[0], kwargs, site=site)
     else:
         if isinstance(view, basestring):
             if not view:
diff -uNr django/core/handlers/base.py django-patched/core/handlers/
base.py
--- django/core/handlers/base.py        2008-11-19 14:44:20.000000000 +0900
+++ django-patched/core/handlers/base.py        2008-12-22 17:56:54.310996664
+0900
@@ -74,7 +74,7 @@
         resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
         try:
             callback, callback_args, callback_kwargs =
resolver.resolve(
-                    request.path_info)
+                    request.path_info, site=request.environ.get
("SERVER_NAME"))

             # Apply view middleware
             for middleware_method in self._view_middleware:
diff -uNr django/core/urlresolvers.py django-patched/core/
urlresolvers.py
--- django/core/urlresolvers.py 2008-11-19 14:44:21.000000000 +0900
+++ django-patched/core/urlresolvers.py 2008-12-22 17:56:54.439792164
+0900
@@ -7,7 +7,7 @@
     (view_function, function_args, function_kwargs)
 """

-import re
+import re, types

 from django.http import Http404
 from django.core.exceptions import ImproperlyConfigured,
ViewDoesNotExist
@@ -138,13 +138,19 @@
     callback = property(_get_callback)

 class RegexURLResolver(object):
-    def __init__(self, regex, urlconf_name, default_kwargs=None):
+    def __init__(self, regex, urlconf_name, default_kwargs=None,
site=None):
         # regex is a string representing a regular expression.
         # urlconf_name is a string representing the module containing
urlconfs.
         self.regex = re.compile(regex, re.UNICODE)
         self.urlconf_name = urlconf_name
         self.callback = None
         self.default_kwargs = default_kwargs or {}
+
+        if type(site) is types.FunctionType :
+            self.site_pattern = site
+        elif type(site) is (str, unicode, ) :
+            self.site_pattern = lambda x : bool(re.compile(site and
site or ".*").search(x))
+
         self._reverse_dict = MultiValueDict()

     def __repr__(self):
@@ -171,12 +177,18 @@
         return self._reverse_dict
     reverse_dict = property(_get_reverse_dict)

-    def resolve(self, path):
+    def resolve(self, path, site=None):
         tried = []
         match = self.regex.search(path)
         if match:
             new_path = path[match.end():]
             for pattern in self.urlconf_module.urlpatterns:
+                _site_pattern = None
+                if hasattr(pattern, "site_pattern") :
+                    _site_pattern = pattern.site_pattern
+                if site and hasattr(pattern, "site_pattern") and not
pattern.site_pattern(site) :
+                    continue
+
                 try:
                     sub_match = pattern.resolve(new_path)
                 except Resolver404, e:
@@ -200,7 +212,10 @@
     urlconf_module = property(_get_urlconf_module)

     def _get_url_patterns(self):
-        return self.urlconf_module.urlpatterns
+        p = self.urlconf_module.urlpatterns
+        p.site_pattern = self.site_pattern
+        return p
+
     url_patterns = property(_get_url_patterns)

     def _resolve_special(self, view_type):
diff -uNr django/http/__init__.py django-patched/http/__init__.py
--- django/http/__init__.py     2008-11-19 14:44:05.000000000 +0900
+++ django-patched/http/__init__.py     2008-12-22 17:56:54.566997983
+0900
@@ -48,11 +48,21 @@
         if 'HTTP_X_FORWARDED_HOST' in self.META:
             host = self.META['HTTP_X_FORWARDED_HOST']
         elif 'HTTP_HOST' in self.META:
-            host = self.META['HTTP_HOST']
+            _host = self.META['HTTP_HOST'].split(":")
+            if hasattr(settings, "DEFAULT_PORT") :
+                host = "%s:%d" % (_host[0], settings.DEFAULT_PORT, )
+            else :
+                host = self.META['HTTP_HOST'].split(":")
+
+            return host
         else:
             # Reconstruct the host using the algorithm from PEP 333.
             host = self.META['SERVER_NAME']
-            server_port = str(self.META['SERVER_PORT'])
+            if hasattr(settings, "DEFAULT_PORT") :
+                server_port = settings.DEFAULT_PORT
+            else :
+                server_port = str(self.META['SERVER_PORT'])
+
             if server_port != (self.is_secure() and '443' or '80'):
                 host = '%s:%s' % (host, server_port)
         return host
diff -uNr django/utils/http.py django-patched/utils/http.py
--- django/utils/http.py        2008-11-19 14:44:21.000000000 +0900
+++ django-patched/utils/http.py        2008-12-22 17:56:54.694497454 +0900
@@ -94,3 +94,20 @@
         i = i % j
         factor -= 1
     return ''.join(base36)
+
+import re
+RE_HOST_AND_PORT = re.compile(":(\d+)$")
+def split_domain (s, with_port=False) :
+    o = [i for i in RE_HOST_AND_PORT.split(s) if i.strip()]
+    if len(o) < 2 :
+        o = o + ([None, ] * (2 - len(o)))
+
+    if with_port and not o[1] :
+        o[1] = "80"
+
+    return tuple(o)
+
+def normalize_domain (s) :
+    return ":".join(split_domain(s, with_port=True, ))
+
+
====================================================



On 12월23일, 오후12시30분, Dan Ger <kickme...@gmail.com> wrote:
> Hi, I have searched to no avail and decided to post here.
>
> I have a django app that is going to have multiple domain names and
> would very much like to use the domain name in the urls.py to help
> with routing.  I have been unable to find a built in way of using this
> and wanted to see if anyone else is doing this before i get into the
> urls internals and hack it up.  I would like to do something like
> this:
>
> (r'^something.com/foo', include('something.urls')),
>
> Can anyone point me in the right direction?  Thanks much!
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-developers@googlegroups.com
To unsubscribe from this group, send email to 
django-developers+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to