Reputation: 8722
I set up django-subdomains following this guide.
I set my subdomain urlconfs as follows:
SUBDOMAIN_URLCONFS = {
None: 'mysite.urls',
'www': 'mysite.urls',
'shop': 'mysite.urls.shop',
'blog': 'mysite.urls.blog'
}
Everything works nicely, but I can't really test it cause when I run my app on my local host using python manage.py runserver
, I can't really add the subdomains. If I put in blog.127.0.0.1:8000, then the browser just takes me to a google search. Is there any way to set my server in such a way that allows for testing? Thanks!
EDIT
If go to http://blog.127.0.0.1:8000, then the browser says a server cannot be found. Have I made mistake in configuring?
My settings.py
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '*****'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Sites application
'django.contrib.sites',
# My application
'myapp',
]
MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# Sub-domains Middleware
'subdomains.middleware.SubdomainURLRoutingMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'mysite.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'mysite.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/1.9/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
STATIC_URL = '/static/'
# Sub-domains
SITE_ID = 1
SUBDOMAIN_URLCONFS = {
None: 'mysite.urls',
'www': 'mysite.urls',
'blog': 'mysite.urls.blog',
'shop': 'mysite.urls.shop'
}
I also have this following line in my console:
No handlers could be found for logger "subdomains.middleware"
Upvotes: 3
Views: 3386
Reputation: 324
The missing part of the equation here is DNS. As far as the browser is concerned, foo.example.org
and example.org
are two different hostnames. The name foo.example.org
could point to a different ip address entirely from example.org
.
The relationship between those two names is that they share an authoritative DNS server, i.e., whoever controls the DNS configuration for example.org
should also be in control of the DNS configuration for foo.example.org
, bar.example.org
and so on.
The subdomain django middleware is useful when you have multiple subdomains that happen to point to the same server. When I go to example.org
in my browser, my browser sends a Host header with the value example.org
. If I visit foo.example.org
, the value of the host header is foo.example.org
. So if the same server is listening on both names, it can tell which subdomain I'm on -- and that's what allows you to use different routes for different subdomains in django.
If you want to test subdomains on your local host, you need your browser to resolve multiple subdomains as '127.0.0.1'. The way you do this depends on your OS. If you're using linux, you would edit /etc/hosts
. What is your OS?
Upvotes: 3