【发布时间】: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_uri 或get_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