簡體   English   中英

使用 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

設置.py:

ROOT_URLCONF = 'core.urls'
ROOT_HOSTCONF = 'core.hosts'
DEFAULT_HOST = 'www'
DEFAULT_REDIRECT_URL = "http://www.myproject.io:8000"

核心/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'),
]

主機配置文件/urls.py:

from .views import wildcard_redirect

urlpatterns = [
    url(r'^(?P<path>.*)', wildcard_redirect)
]

主機配置文件/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)

我現在有幾個問題:

  1. 當我 go 到 myproject.io 時,它成功地將我重定向到 www.myproject.io。 但是當我 go 到 company1.myproject.io 時,我得到了一個Invalid HTTP_HOST header: 'company1.myproject.io:8000'. You may need to add u'company1.myproject.io' to ALLOWED_HOSTS Invalid HTTP_HOST header: 'company1.myproject.io:8000'. You may need to add u'company1.myproject.io' to ALLOWED_HOSTS添加到 ALLOWED_HOSTS 當我獲得新的子域或我做錯了什么時,我真的需要每次都將新主機添加到 ALLOWED_HOSTS 嗎?
  2. 如何為每個公司的動態上下文的所有子域實現單一視圖。 基本上我需要通過子域名查詢數據庫。 例子:

     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 中創建另一個模式嗎?

以句點開頭的值可以用作子域通配符:“.example.com”將匹配 example.com、www.example.com 和 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 框架 你不需要 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 上測試過

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM