【问题标题】:How can a string (taken from a python wsgi environ) be different when iterating over its chars?迭代其字符时,字符串(取自 python wsgi 环境)如何不同?
【发布时间】: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'] 然后打印hostlist(host) 我们会得到相同的结果。即使那样,我在想某些东西(IIS?wfastcgi?)可能正在修改变量指向的内存位置的某些东西。是不是太偏执了?

标签: python iis wsgi wfastcgi


【解决方案1】:

在这里回答自己:事实证明,问题完全出在其他地方。 所有上面的变量都包含相同的字符串,'internal.host.example.com' 一个 - 它是负载均衡器执行重写规则,将它变成 'pretty-domain.com' 在响应中的任何位置。

这对我来说是一个警示故事,负载均衡器不仅可以修改请求,还可以修改响应。

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2020-06-20
    • 2013-09-09
    • 1970-01-01
    相关资源
    最近更新 更多