【问题标题】:Django get_current_site and build_absolute_uri always say the site is localhostDjango get_current_site 和 build_absolute_uri 总是说站点是本地主机
【发布时间】:2020-08-24 10:28:30
【问题描述】:

这是一个通过 Django 自带的小服务器测试的 Django 网站:

python manage.py runserver 8080

测试客户端来自运行在外部网络机器上的浏览器。 IE。浏览器不在服务器上运行,而是在桌面上运行,请求通过 Internet 进入。请求的典型形式为https://sub.awebsite.com/path

ajax POST 视图包含您可能认识的供应商调用:

    class view_class ...
       def post(self, request) 
          ...
          new_session = stripe.checkout.Session.create(
             api_key=djstripe.settings.STRIPE_SECRET_KEY
            ,line_items=[item]
            ,payment_method_types=['card']
            ,success_url='https://a.awebsite.com/path?session_id={CHECKOUT_SESSION_ID}'
            ,cancel_url='https://a.awebsite.com/other_path'
            )

注意最后两个参数是将文字 URI 字符串嵌入到网站中。对于 python 和 Django,它们没有任何特殊含义。它们只是字符串。但是稍后客户端将使用它们重定向回网站。这种文字编码确实是一个问题,因为站点的变化取决于谁在测试它或者它是否已经发布。我更愿意使用函数build_absolute_uriget_current_site 来构建这些字符串。然而这些函数只是打印'localhost'。例如。我把这两个打印语句放在对stripe.checkout.Session.create的函数调用上方:

print("get_current_site: ", get_current_site(request))
print("post absolute uri: ", request.build_absolute_uri())

他们打印:

 get_current_site:  localhost:8080
 absolute uri:  http://localhost:8080/...

我猜absolute_uri 是从与get_current_site 相同的地方获取信息的。

现在是的,在设置文件中,localhost 也被列为允许的主机。如果我删除它,我会得到一个 Django 启动面板,告诉我需要将 localhost 添加到 ALLOWED_HOSTS 列表中。 (我猜这在通过 wsgi 进入时不会有问题,因为它需要一个具有正确名称的允许主机。)

那么为什么这些不打印站点名称?本地主机来自哪里? .. 以及如何获取客户端在浏览器中键入以访问该站点的实际站点名称?

【问题讨论】:

  • 因为您向本地主机发出请求。浏览器已向localhost:8080/some/path/to/view发出请求。
  • 在浏览器中输入的 URI 具有实际的站点名称。假设该站点名为awebsite.com,然后向https://awebsite.com/sservice 发出ajax 请求。字符串文字 'localhost' 不出现在测试套件的任何地方。它只出现在站点代码中的一个地方,那就是 ALLOWED_HOSTS 列表 - 它之所以存在,是因为 Django 强迫我把它放在那里。
  • 不,您可以输入您所在的主机的名称,很好地托管您的网站。但看起来您是在本地托管您的网站。 https://a.awebsite.com/ 您的站点,还是您向其发出请求的站点(例如 Amazon API)?
  • https://a.website.com/ 是运行 Django 网站的服务器的 DNS 名称。客户端是完全不同的域中的单独桌面计算机,在另一个建筑物中,实际上也在另一个国家。如果客户端离服务器更远,它会向另一个方向靠近。

标签: django


【解决方案1】:

解决办法是在nginx的proxy pass config中加入这一行:

proxy_set_header Host $http_host;

位置块现在如下所示:

 location / {
        proxy_pass http://localhost:8001/;
        proxy_set_header Host $http_host;     
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }

添加proxy_set_header 后,get_current_site 及其所有变体现在都可以正常工作了。

还要注意这些: Why does Nginx keep redirecting me to localhost?
How can I get the domain name of my site within a Django template?

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 2013-06-01
    • 2016-06-24
    • 1970-01-01
    • 2014-09-09
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多