Skip to content

Instantly share code, notes, and snippets.

@teserak
Forked from phpdude/middleware.py
Created December 26, 2011 23:20
Show Gist options
  • Save teserak/1522273 to your computer and use it in GitHub Desktop.
Save teserak/1522273 to your computer and use it in GitHub Desktop.
Django subdomains Full support
Adds Django full subdomains urls upport for urlpatterns and reverse resolving.
Requires installation into settings.py
Allows you route and generate views various urls.
'''
Example:
'domain.com' -> ''
'domain.com/doc' -> 'doc'
'domain.com/doc/' -> 'doc/'
'sub.domain.com' -> '/sub/'
'sub.domain.com/doc' -> '/sub/doc'
'sub.domain.com/doc/' -> '/sub/doc/'
'domain.com/foo' -> 'foo'
'foo.domain.com' -> '/foo/'
'sub1.sub2.domain
'''
from django.core import urlresolvers
from settings import SITE_DOMAIN
__author__ = 'phpdude'
class SubdomainsMiddleware:
def process_request(self, request):
"""
Support subdomains in request, templates
"""
domain_parts = request.get_host().split(".")
if len(domain_parts) > 2:
subdomain = "_".join(domain_parts[:-2])
if subdomain.lower() in ['www']:
subdomain = ""
domain = ".".join(domain_parts[1:])
else:
subdomain = ""
domain = request.get_host()
request.subdomain = subdomain.replace("_", ".")
request.domain = domain
if subdomain:
request.path_info = "//" + subdomain + request.path_info
def subdomains_template_context(request):
"""
Populate the board in the template
"""
return {
"subdomain": request.subdomain,
"domain": request.domain
}
__real_reverse = urlresolvers.reverse
def reverse(*args, **kwargs):
url = __real_reverse(*args, **kwargs)
if url[0:2] == "//":
url = url[2:].split("/")
url = "http://" + url[0].replace("_", ".") + "." + SITE_DOMAIN + "/" + "/".join(url[1:])
return url
urlresolvers.reverse = reverse
MIDDLEWARE_CLASSES = (
....
'middleware.SubdomainsMiddleware'
)
TEMPLATE_CONTEXT_PROCESSORS = (
....
'middleware.subdomains_template_context'
)
SITE_DOMAIN = "domain.com:8000" # Requires full domain name with port if needed for runserver enviroument
# if you want your sessions working cross domain
SESSION_COOKIE_DOMAIN = '.' + SITE_DOMAIN.split(":")[0]
@druska
Copy link

druska commented Mar 3, 2012

I like it!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment