Django Hosts Readthedocs Io en Latest
Django Hosts Readthedocs Io en Latest
Release 3.1.dev1+gad41990
1 Installation 3
2 Usage 5
3 Settings 7
4 More docs 9
4.1 Template tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.2 Python helpers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.3 Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.4 FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.5 Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5 Issues 23
6 Thanks 25
i
ii
django-hosts Documentation, Release 3.1.dev1+gad41990
This Django app routes requests for specific hosts to different URL schemes defined in modules called “hostconfs”.
For example, if you own example.com but want to serve specific content at api.example.com and beta.
example.com, add the following to a hosts.py file:
host_patterns = patterns('path.to',
host(r'api', 'api.urls', name='api'),
host(r'beta', 'beta.urls', name='beta'),
)
This causes requests to {api,beta}.example.com to be routed to their corresponding URLconf. You can use
your urls.py as a template for these hostconfs.
Patterns are evaluated in order. If no pattern matches, the request is processed in the usual way, ie. using the standard
ROOT_URLCONF.
The patterns on the left-hand side are regular expressions. For example, the following ROOT_HOSTCONF setting will
route foo.example.com and bar.example.com to the same URLconf.
host_patterns = patterns('',
host(r'(foo|bar)', 'path.to.urls', name='foo-or-bar'),
)
Contents 1
django-hosts Documentation, Release 3.1.dev1+gad41990
2 Contents
CHAPTER 1
Installation
First, install the app with your favorite package manager, e.g.:
ROOT_HOSTCONF = 'mysite.hosts'
6. Set the DEFAULT_HOST setting to the name of the host pattern you want to refer to as the default pattern. It’ll
be used if no other pattern matches or you don’t give a name to the host_url template tag.
3
django-hosts Documentation, Release 3.1.dev1+gad41990
4 Chapter 1. Installation
CHAPTER 2
Usage
Patterns being regular expressions allows setups to feature dynamic (or “wildcard”) host schemes:
host_patterns = patterns('',
host(r'www', settings.ROOT_URLCONF, name='www'),
host(r'(\w+)', 'path.to.custom_urls', name='wildcard'),
)
Here, requests to www.example.com will be routed as normal but a request to admin.example.com is routed
to path.to.custom_urls.
As patterns are matched in order, we placed www first as it otherwise would have matched against \w+ and thus routed
to the wrong destination.
Alternatively, we could have used negative lookahead, given the value of the ROOT_URLCONF setting:
host_patterns = patterns('',
host(r'(?!www)\w+', 'path.to.custom_urls', name='wildcard'),
)
In your templates you can use the host_url() template tag to reverse a URL the way you’re used to it with Django’s
url template tag:
{% load hosts %}
<a href="{% host_url 'homepage' host 'www' %}">Home</a> |
<a href="{% host_url 'account' host 'wildcard' request.user.username %}">Your Account
˓→</a> |
Since the template tag will always automatically fall back to your default host (as defined by DEFAULT_HOST) you
can leave off the host parameter as well.
You can even override the url tag that comes with Django to simplify reversing URLs in your templates:
5
django-hosts Documentation, Release 3.1.dev1+gad41990
On the Python side of things like your views you can easily do the same as with Django’s own reverse function. Simply
use the reverse() function for that:
def homepage(request):
homepage_url = reverse('homepage', host='www')
return render(request, 'homepage.html', {'homepage_url': homepage_url})
6 Chapter 2. Usage
CHAPTER 3
Settings
django.conf.settings.ROOT_HOSTCONF(required)
The dotted Python import path of the module containing your host patterns. Similar to ROOT_URLCONF.
django.conf.settings.DEFAULT_HOST(required)
The name of the host pattern you want to refer to as the default pattern. Used if no other host pattern matches or
no host name is passed to the host_url() template tag.
django.conf.settings.PARENT_HOST(optional)
The parent domain name to be appended to the reversed domain (e.g. using the host_url() template tag).
django.conf.settings.HOST_SCHEME(optional)
The scheme to prepend host names with during reversing, e.g. when using the host_url() template tag.
Defaults to '//'.
django.conf.settings.HOST_PORT(optional)
New in version 1.0.
The port to append to host names during reversing, e.g. when using the host_url() template tag. Defaults
to '' (empty string).
django.conf.settings.HOST_SITE_TIMEOUT(optional)
The time to cache the host in the default cache backend, in seconds, when using the cached_host_site()
callback. Defaults to 3600.
7
django-hosts Documentation, Release 3.1.dev1+gad41990
8 Chapter 3. Settings
CHAPTER 4
More docs
host_patterns = patterns('',
host(r'admin', settings.ROOT_URLCONF, name='our-admin'),
)
urlpatterns = patterns('mysite.admin',
url(r'^dashboard/$', 'dashboard', name='dashboard'),
)
{% load hosts %}
9
django-hosts Documentation, Release 3.1.dev1+gad41990
Note: The double slash at the beginning of the href is an easy way to not have to worry about which scheme (http or
https) is used. Your browser will automatically choose the currently used scheme. If you’re on https://mysite.
com/ a link with an href of //mysite.com/about/ would actually point to https://mysite.com/about/
.
For more information see the The protocol-relative URL article by Paul Irish or the appropriate section in RFC 3986.
Changed in version 0.5.
You can override the used default scheme with the HOST_SCHEME setting.
Changed in version 1.0.
You can override the individually used scheme with the scheme parameter.
In case you want to append a default domain name to the domain part of the rendered URL you can simply set the
PARENT_HOST, e.g:
PARENT_HOST = 'example.com'
Alternatively – in case you don’t want to append this parent domain to all URLs you can also spell out the domain in
the host pattern:
host_patterns = patterns('',
host(r'admin\.example\.com', settings.ROOT_URLCONF, name='admin'),
)
host_patterns = patterns('',
host(r'www', settings.ROOT_URLCONF, name='homepage'),
host(r'(\w+)', 'path.to.support_urls', name='wildcard'),
host(r'(?P<username>\w+).users', 'path.to.user_urls', name='user-area'),
)
you can also easily pass parameters to the host_url() template tag:
{% load hosts %}
It’s not only possible to define the scheme in the hostconf but also on a case-by-case basis using the template tag:
{% load hosts %}
<a href="//help.example.com/faq/">FAQ</a>
Which will be rendered (with a PARENT_HOST of 'example.com' and a HOST_SCHEME setting defaulting to
'//') as:
{% load hosts %}
When defining hostconfs you need to use the patterns and host helpers
django_hosts.defaults.patterns(prefix, *args)
The function to define the list of hosts (aka hostconfs), e.g.:
host_patterns = patterns('path.to',
(r'www', 'urls.default', 'default'),
(r'api', 'urls.api', 'api'),
)
Parameters
• prefix (str) – the URLconf prefix to pass to the host object
• *args – a list of hosts instances or an iterable thereof
host_patterns = patterns('path.to',
host(r'www', 'urls.default', name='default'),
host(r'api', 'urls.api', name='api'),
host(r'admin', 'urls.admin', name='admin', scheme='https://'),
)
Parameters
• regex (str) – a regular expression to be used to match the request’s host.
• urlconf (str) – the dotted path of a URLconf module of the host
• callback (callable or str) – a callable or the dotted path of a callable to be used
when matching has happened
• prefix (str) – the prefix to apply to the urlconf parameter
• scheme (str) – the scheme to prepend host names with during reversing, e.g. when using
the host_url() template tag. Defaults to HOST_SCHEME.
• port – the port to append to host names during reversing, e.g. when using the host_url()
template tag. Defaults to HOST_PORT.
add_prefix(prefix=”)
Adds the prefix string to a string-based urlconf.
If you want to reverse the hostname or the full URL or a view including the scheme, hostname and port you’ll need to
use the reverse and reverse_host helper functions (or its lazy cousins).
django_hosts.resolvers.reverse(viewname, args=None, kwargs=None, prefix=None,
current_app=None, host=None, host_args=None,
host_kwargs=None, scheme=None, port=None)
Given the host and view name and the appropriate parameters, reverses the fully qualified URL, e.g.:
You can set the used port and scheme in the host object or override with the paramater named accordingly.
The host name can be left empty to automatically fall back to the default hostname as defined in the
DEFAULT_HOST setting.
Parameters
• viewname – the name of the view
• args – the arguments of the view
• kwargs – the keyed arguments of the view
• prefix – the prefix of the view urlconf
• current_app – the current_app argument
• scheme – the scheme to use
• port – the port to use
• host – the name of the host
• host_args – the host arguments
• host_kwargs – the host keyed arguments
Raises django.core.urlresolvers.NoReverseMatch – if no host or path matches
Return type the fully qualified URL with path
django_hosts.resolvers.reverse_host(host, args=None, kwargs=None)
Given the host name and the appropriate parameters, reverses the host, e.g.:
Parameters
django_hosts.resolvers.reverse_host_lazy(*args, **kw)
The lazy version of the reverse_host() function to be used in class based views and other module level
situations
django_hosts.resolvers.reverse_lazy(*args, **kw)
The lazy version of the reverse() function to be used in class based views and other module level situations
def home_page(request):
posts = BlogPost.on_site.by_request(request).all()
return render(request, 'home_page.html', {'posts': posts})
by_id(site_id=None)
Returns a queryset matching the given site id. If not given this falls back to the SITE_ID setting.
Parameters site_id – the ID of the site
Return type QuerySet
by_request(request)
Returns a queryset matching the given request’s site attribute.
Parameters request (HttpRequest) – the current request
Return type QuerySet
by_site(site)
Returns a queryset matching the given site.
4.3 Callbacks
Parsing the host from request.get_host() and lookup its corresponding object instance (e.g. site) in every view
violates DRY. If these dynamic hosts had a lot of views this would become particularly unwieldy.
To remedy this, you can optionally specify a callback method to be called if your host matches.
Simply define a callback function:
host_patterns = patterns('',
host(r'www', settings.ROOT_URLCONF, name='www'),
host(r'(?P<username>\w+)', 'path.to.custom_urls',
callback='path.to.custom_fn', name='with-callback'),
)
This example avoids the duplicated work in every view by attaching a viewing_user instance to the request object.
Views referenced by the “dynamic” URLconf can now assume that this object exists.
The custom method is called with the request object and any named captured arguments, similar to regular Django
url processing.
Callbacks may return either None or an HttpResponse object.
• If it returns None, the request continues to be processed and the appropriate view is eventually called.
• If a callback returns an HttpResponse object, that HttpResponse is returned to the client without any
further processing.
Note: There are a few things to keep in mind when using the callbacks:
• Callbacks are executed with the URLconf set to the second argument in the host_patterns list. For exam-
ple, in the example above, the callback will be executed with the URLconf as path.to.custom_urls and
not the default URLconf.
• This can cause problems when reversing URLs within your callback as they may not be “visible” to django.
core.urlresolvers.reverse() as they are specified in (eg.) the default URLconf.
• To remedy this, specify the urlconf parameter when calling reverse().
4.3. Callbacks 15
django-hosts Documentation, Release 3.1.dev1+gad41990
• When using dynamic hosts based on user input, ensure users cannot specify names that conflict with static
subdomains such as “www” or their subdomain will not be accessible.
• Don’t forget to add handler404 and handler500 entries for your custom URLconfs.
django-hosts includes the following callbacks for use with the Django contrib app django.contrib.sites:
settings.PARENT_HOST = 'example.com'
host_patterns = patterns('',
host(r'www', settings.ROOT_URLCONF, name='www'),
host(r'(?P<username>\w+)', 'path.to.custom_urls',
callback='django_hosts.callbacks.host_site',
name='user-sites'),
)
When requesting this website with the host jezdez.example.com, the callback will act as if you’d do:
request.site = Site.objects.get(domain__iexact='jezdez.example.com')
..since the result of calling reverse_host() with the username 'jezdez' is 'jezdez.example.
com'.
Later, in your views, you can nicely refer to the current site as request.site for further site-specific func-
tionality.
django_hosts.callbacks.cached_host_site(request, *args, **kwargs)
A callback function similar to host_site() which caches the resulting Site instance in the default cache
backend for the time specfified as HOST_SITE_TIMEOUT.
Parameters
• request – the request object passed from the middleware
• *args – the parameters as matched by the host patterns
4.4 FAQ
Yes, django-hosts works with Django Debug toolbar with the only limitation that the toolbar’s middleware has to be
come after django-hosts’ HostsRequestMiddleware middleware, e.g.:
MIDDLEWARE = (
'django_hosts.middleware.HostsRequestMiddleware',
# your other middlewares..
'debug_toolbar.middleware.DebugToolbarMiddleware',
'django_hosts.middleware.HostsResponseMiddleware',
)
4.5 Changelog
• Confirmed support for Django 2.1 (no code changes were required).
4.4. FAQ 17
django-hosts Documentation, Release 3.1.dev1+gad41990
• BACKWARD-INCOMPATIBLE Dropped support for Django 1.7 as it doesn’t receive security releases any-
more.
• Added support for Django 1.9.
• Moved repo to https://github.com/jazzband/django-hosts
• Moved tests to https://travis-ci.org/jazzband/django-hosts
• Start to use setuptools_scm for easier versioning.
• BACKWARD-INCOMPATIBLE Dropped support for Django 1.6 as it doesn’t receive any security releases
anymore.
• BACKWARD-INCOMPATIBLE Removed deprecated django_hosts.reverse module as it incorrectly
shadowed the django_hosts.resolvers.reverse() function that was added in version 1.0. This is a
earlier deprecation than planned, apologies for the inconvenience.
• Added support for Django 1.8.
New:
– the ability to automatically fallback to the host as defined in the DEFAULT_HOST setting when no host
name is passed
– a new optional scheme parameter to override the resulting URL’s scheme individually
– a new optional port parameter to override the resulting URL’s port individually
– a new ability to override Django’s built-in url template tag by setting the HOST_OVERRIDE_URL_TAG
setting to True
• Added reverse_lazy() and reverse_host_lazy() for use in import time situations such as class
based views.
• Split the django_hosts.middleware.HostsMiddleware middleware into two piece to enable the use
of the request.host parameter in other middlewares. See the installation instruction for the new setup.
• Rely on a few more built-ins in Django instead of writing them ourselves.
• Moved the test suite to use the py.test runner instead of Django’s own test runner.
• Updated the FAQ to explain how to use Django’s full page caching middleware with Django<1.7 and fixed the
entry about the compatibility to the Debug Toolbar.
• Extended the tests to be close to 100% test coverage.
• Added tox configuration for easy local tests.
• Added a few Django 1.7 system checks (for the ROOT_HOSTCONF and DEFAULT_HOST settings).
• Added cached_host_site() callback which stores the matching Site instance in the default cache back-
end (also see new HOST_SITE_TIMEOUT setting).
4.5. Changelog 19
django-hosts Documentation, Release 3.1.dev1+gad41990
• Throw warning if django-debug-toolbar is used together with the django_hosts and the order of the
MIDDLEWARE_CLASSES setting isn’t correct.
• Added CI server at https://ci.enn.io/job/django-hosts/
• Added ability to save the result of host_url() template tag in a template context variable.
• Fixed issue related to the PARENT_HOST setting when used with empty host patterns.
• Stopped automatically emulating hosts in debug mode.
to:
• BACKWARDS INCOMPATIBLE Changed the data type that the django_hosts.patterns function
returns to be a list instead of a SortedDict to follow conventions of Django’s URL patterns. You can use that for
easy extension of the patterns, e.g.:
host_patterns += patterns('',
host('www2', 'mysite.urls.www2', name='www2')
)
4.5. Changelog 21
django-hosts Documentation, Release 3.1.dev1+gad41990
Issues
For any bug reports and feature requests, please use the Github issue tracker.
23
django-hosts Documentation, Release 3.1.dev1+gad41990
24 Chapter 5. Issues
CHAPTER 6
Thanks
Many thanks to the folks at playfire for releasing their django-dynamic-subdomains app, which was the inspiration for
this app.
25
django-hosts Documentation, Release 3.1.dev1+gad41990
26 Chapter 6. Thanks
Python Module Index
d
django_hosts.defaults, 12
django_hosts.managers, 14
django_hosts.resolvers, 13
27
django-hosts Documentation, Release 3.1.dev1+gad41990
A R
add_prefix() (django_hosts.defaults.host method), 12 reverse() (in module django_hosts.resolvers), 13
reverse_host() (in module django_hosts.resolvers), 13
B reverse_host_lazy() (in module django_hosts.resolvers),
by_id() (django_hosts.managers.HostSiteManager 14
method), 14 reverse_lazy() (in module django_hosts.resolvers), 14
by_request() (django_hosts.managers.HostSiteManager ROOT_HOSTCONF (in module django.conf.settings), 7
method), 14
by_site() (django_hosts.managers.HostSiteManager
method), 14
C
cached_host_site() (in module django_hosts.callbacks),
16
D
DEFAULT_HOST (in module django.conf.settings), 7
django_hosts.defaults (module), 12
django_hosts.managers (module), 14
django_hosts.resolvers (module), 13
G
get_queryset() (django_hosts.managers.HostSiteManager
method), 15
H
host (class in django_hosts.defaults), 12
HOST_PORT (in module django.conf.settings), 7
HOST_SCHEME (in module django.conf.settings), 7
host_site() (in module django_hosts.callbacks), 16
HOST_SITE_TIMEOUT (in module
django.conf.settings), 7
host_url() (in module django_hosts.templatetags.hosts), 9
HostSiteManager (class in django_hosts.managers), 14
P
PARENT_HOST (in module django.conf.settings), 7
patterns() (in module django_hosts.defaults), 12
29