【发布时间】:2020-11-12 01:24:55
【问题描述】:
我们最近遇到了一种情况,迭代字符串(例如list(some_string))与直接打印some_string 完全不同。怎么会这样?
一些背景知识:我们正在使用 wfastcgi 在 IIS 上运行一个 python Web 应用程序,应用程序服务器位于负载平衡器后面。我们在应用程序服务器的内部和负载均衡器的外部主机出现在应用程序的不同部分时遇到了一些问题,因此为了缩小范围,我们编写了一个小型 wsgi 服务器来查看内部传递的具体内容。
这是模块,再次在 IIS 上使用 wfastcgi 运行:
# test-wsgi.py
def application(environ, start_response):
status = '200 OK'
headers = [('Content-type', 'text/plain; charset=utf-8')]
body = 'Host: {}\n\n'.format(environ['HTTP_HOST']).encode('utf-8')
chars = list(environ['HTTP_HOST'])
body += 'Host by char: {}\n\n'.format(chars).encode('utf-8')
start_response(status, headers)
return [body]
而且,看这疯狂,这是回应:
Host: pretty-domain.com
Host by char: ['i', 'n', 't', 'e', 'r', 'n', 'a', 'l', '.', 'h', 'o', 's', 't', '.', 'e', 'x', 'a', 'm', 'p', 'l', 'e', '.', 'c', 'o', 'm']
我们使用其他迭代字符串的方法(例如 for 循环或列表推导,或者仅使用 len())得到相同的结果。
除了是什么导致这些特定值出现在我们的设置中的问题之外 - 这在 python 中怎么会发生?
这是在 IIS 10、python 3.6.8 和 wfastcgi 3.0.0 上。
【问题讨论】:
-
您访问它两次,它有可能被修改。尝试使用变量来存储
environ["HTTP_HOST"]的值并在两种方法中打印出来。 -
@MZ 会有些道理,但是使用
host = environ['HTTP_HOST']然后打印host和list(host)我们会得到相同的结果。即使那样,我在想某些东西(IIS?wfastcgi?)可能正在修改变量指向的内存位置的某些东西。是不是太偏执了?