【问题标题】:How to get hostname or IP in settings.py so that i can use it to decide which app's urls to use如何在 settings.py 中获取主机名或 IP,以便我可以使用它来决定使用哪个应用程序的 url
【发布时间】:2017-10-15 12:19:01
【问题描述】:

我正在制作一个 django 应用程序,它将有 2 个应用程序。当您打开 www.webName.co.id 时,它将使用应用程序 A 中的 urls.py,但是当您打开 webName.co.uk 时,它将使用应用程序 B 中的 urls.py

这是来自主项目的 urls.py:

urlpatterns = [
  url(r'^tinymce/', include('tinymce.urls')),
  url(r'^filer/', include('filer.urls')),
  url(r'^ckeditor/', include('ckeditor_uploader.urls')),
  url(r'^admin/', admin.site.urls),
]

我打算在该文件中添加类似这样的内容:

if settings.CURRENT_HOST_IP == 'www.webname.co.id':
    urlpatterns += url(r'^', include('webname_id.urls')),
else:
    urlpatterns += url(r'^', include('webname_uk.urls')),

这样,它只会使用正在使用的应用程序中的网址,具体取决于您进入网站时使用的当前 www。

所以我的项目有 1 个后端管理员,但有多个前端模板和 URL。问题是我不知道如何在 settings.py 中设置 CURRENT_HOST_IP,

通常我使用它来获取用户正在使用的当前 IP / 主机:

 request.META['HTTP_HOST']

但我无法访问设置中的请求对象,有没有办法在 Python(不是 django)中获取我在浏览器中输入的 www/IP 地址/主机名?

【问题讨论】:

  • 设置不是应用该条件的正确位置。为此编写自定义中间件。参考:docs.djangoproject.com/en/1.11/topics/http/middleware
  • 如果我使用中间件,这意味着我已经在其中一个应用程序的 urls.py 中,我想在进入中间件之前决定使用哪个应用程序的 url。
  • 可能你不知道中间件的使用。请再次通读文档。当点击域/url时,第一个控制将来到'django.middleware.security.SecurityMiddleware',同样你可以编写自己的中间件
  • 我用过中间件。流程是其中一个应用程序中的 settings.py,然后是 urls.py,最后是中间件。我无法更改要使用的应用程序的 url,因为 urls.py 已经处理(如果我使用中间件)
  • 你能给出一些代码来展示它是如何完成我想要的吗?

标签: python django python-2.7 python-3.x django-views


【解决方案1】:

您的主项目中需要两个备用 urlconf 文件:

# project/project/urls_id.py

from django.conf.urls import url

from urls import urlpatterns

urlpatterns.append(url(r'^', include 'webname_id.urls'))
# project/project/urls_uk.py

from django.conf.urls import url

from urls import urlpatterns

urlpatterns.append(url(r'^', include 'webname_uk.urls'))

在你的中间件中,根据主机选择合适的urlconf。

class YourMiddleware(object):

    # For Django 1.10+

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):

        if request.get_host() == 'www.webname.co.id':
            request.urlconf = 'project.urls_id'
        else:
            request.urlconf = 'project.urls_uk'

        response = self.get_response(request)

        return response

【讨论】:

  • 我明天会试试这个,我会提供反馈。太感谢了!我失去了希望。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2021-12-04
  • 2022-11-21
  • 1970-01-01
  • 2012-10-13
  • 2016-12-12
相关资源
最近更新 更多