使用 django-hosts 的多个子域的一个视图
One view for multiple sub-domains using django-hosts
我的项目需要多个子域。每个子域代表一些公司。例如:company1.myproject.io、company2.myproject.io。我使用 django-hosts 库来设置子域。
主机文件:
127.0.0.1 localhost
127.0.0.1 myproject.io
127.0.0.1 www.myproject.io
127.0.0.1 company1.myproject.io
127.0.0.1 company2.myproject.io
settings.py:
ROOT_URLCONF = 'core.urls'
ROOT_HOSTCONF = 'core.hosts'
DEFAULT_HOST = 'www'
DEFAULT_REDIRECT_URL = "http://www.myproject.io:8000"
core/hosts.py:
from hostsconf import urls as redirect_urls
host_patterns = [
host(r'www', settings.ROOT_URLCONF, name='www'),
host(r'(?!www).*', redirect_urls, name='wildcard'),
]
hostsconf/urls.py:
from .views import wildcard_redirect
urlpatterns = [
url(r'^(?P<path>.*)', wildcard_redirect)
]
hostsconf/views.py:
DEFAULT_REDIRECT_URL = getattr(settings, "DEFAULT_REDIRECT_URL", "http://www.myproject.io:8000")
def wildcard_redirect(request, path=None):
new_url = DEFAULT_REDIRECT_URL
if path is not None:
new_url = DEFAULT_REDIRECT_URL + "/" + path
return HttpResponseRedirect(new_url)
我现在有几个问题:
- 当我转到 myproject.io 时,它成功地将我重定向到 www.myproject.io。但是当我去 company1.myproject.io 我得到一个
Invalid HTTP_HOST header: 'company1.myproject.io:8000'. You may need to add u'company1.myproject.io' to ALLOWED_HOSTS
当我得到新的子域或者我做错了什么时,我真的需要每次都向 ALLOWED_HOSTS 添加新主机吗?
如何为每个公司的动态上下文的所有子域实现单一视图。基本上我需要通过子域名查询数据库。示例:
def home_page(request):
subdomain = 'somehow get sub domain (company1 or company2)'
comp = User.objects.get(domain_name=subdomain)
return redirect(request, 'tpl.html', {"company": comp})
更新:
弄清楚如何处理 ALLOWED_HOSTS 并获得子域。但我仍然不知道如何为我的子域实现单一视图。我需要在 hosts.py 中创建另一个模式吗?
A value beginning with a period can be used as a subdomain wildcard:
'.example.com' will match example.com, www.example.com, and any other
subdomain of example.com.
https://docs.djangoproject.com/en/1.11/ref/settings/#allowed-hosts
出于安全考虑,您必须将您的域添加到 allowed_hosts 列表中。只需像这样使用通配符:
ALLOWED_HOSTS = ['.myproject.io']
2) 尝试 HttpRequest.META["HTTP_HOST"]
https://docs.djangoproject.com/en/1.11/ref/request-response/#django.http.HttpRequest.META
或request.get_host()
更新:
如果你想在单个 django 应用程序中操作多个站点,你应该使用 Django Sites framework。你不需要 django-hosts 库。
这个问题似乎很老,但我认为它对仍在搜索此问题的任何人都有帮助。
对于通配符子域,将域添加到列表中对我不起作用。我必须将它添加为一个元组。
ALLOWED_HOSTS = ['.domain.com'] - This does not work for me
ALLOWED_HOSTS = ('.domain.com',) - This works for me.
我在 Django 2.2.5 和 Django 3.6 上测试过
我的项目需要多个子域。每个子域代表一些公司。例如:company1.myproject.io、company2.myproject.io。我使用 django-hosts 库来设置子域。
主机文件:
127.0.0.1 localhost
127.0.0.1 myproject.io
127.0.0.1 www.myproject.io
127.0.0.1 company1.myproject.io
127.0.0.1 company2.myproject.io
settings.py:
ROOT_URLCONF = 'core.urls'
ROOT_HOSTCONF = 'core.hosts'
DEFAULT_HOST = 'www'
DEFAULT_REDIRECT_URL = "http://www.myproject.io:8000"
core/hosts.py:
from hostsconf import urls as redirect_urls
host_patterns = [
host(r'www', settings.ROOT_URLCONF, name='www'),
host(r'(?!www).*', redirect_urls, name='wildcard'),
]
hostsconf/urls.py:
from .views import wildcard_redirect
urlpatterns = [
url(r'^(?P<path>.*)', wildcard_redirect)
]
hostsconf/views.py:
DEFAULT_REDIRECT_URL = getattr(settings, "DEFAULT_REDIRECT_URL", "http://www.myproject.io:8000")
def wildcard_redirect(request, path=None):
new_url = DEFAULT_REDIRECT_URL
if path is not None:
new_url = DEFAULT_REDIRECT_URL + "/" + path
return HttpResponseRedirect(new_url)
我现在有几个问题:
- 当我转到 myproject.io 时,它成功地将我重定向到 www.myproject.io。但是当我去 company1.myproject.io 我得到一个
Invalid HTTP_HOST header: 'company1.myproject.io:8000'. You may need to add u'company1.myproject.io' to ALLOWED_HOSTS
当我得到新的子域或者我做错了什么时,我真的需要每次都向 ALLOWED_HOSTS 添加新主机吗? 如何为每个公司的动态上下文的所有子域实现单一视图。基本上我需要通过子域名查询数据库。示例:
def home_page(request): subdomain = 'somehow get sub domain (company1 or company2)' comp = User.objects.get(domain_name=subdomain) return redirect(request, 'tpl.html', {"company": comp})
更新: 弄清楚如何处理 ALLOWED_HOSTS 并获得子域。但我仍然不知道如何为我的子域实现单一视图。我需要在 hosts.py 中创建另一个模式吗?
A value beginning with a period can be used as a subdomain wildcard: '.example.com' will match example.com, www.example.com, and any other subdomain of example.com. https://docs.djangoproject.com/en/1.11/ref/settings/#allowed-hosts
出于安全考虑,您必须将您的域添加到 allowed_hosts 列表中。只需像这样使用通配符:
ALLOWED_HOSTS = ['.myproject.io']
2) 尝试 HttpRequest.META["HTTP_HOST"]
https://docs.djangoproject.com/en/1.11/ref/request-response/#django.http.HttpRequest.META
或request.get_host()
更新: 如果你想在单个 django 应用程序中操作多个站点,你应该使用 Django Sites framework。你不需要 django-hosts 库。
这个问题似乎很老,但我认为它对仍在搜索此问题的任何人都有帮助。
对于通配符子域,将域添加到列表中对我不起作用。我必须将它添加为一个元组。
ALLOWED_HOSTS = ['.domain.com'] - This does not work for me
ALLOWED_HOSTS = ('.domain.com',) - This works for me.
我在 Django 2.2.5 和 Django 3.6 上测试过