【问题标题】:Bottle GET request is broken with certain strings when running with paste server使用粘贴服务器运行时,瓶子 GET 请求被某些字符串破坏
【发布时间】:2018-01-29 15:39:18
【问题描述】:

我有一个类似的问题: Python bottle: UTF8 path string invalid when using app.mount()

当我尝试 GET /languages/Inglês 时,我收到以下错误(注意重音“ê”)。传递 [az] 字符串时,它工作正常。

处理请求时出现严重错误:/languages/Inglês

我尝试了上面链接中提到的修复方法,但没有成功。

工作示例

from bottle import route, run, debug

@route('/languages/<name>')
def hello(name):
    return name

if __name__ == '__main__':
    debug(False)
    #run(reloader=False, port = 8080) # works
    run(server='paste', port = 8080)  # fails

使用server='paste' 运行会导致崩溃,但使用 Bottle 服务器运行正常。问题似乎发生在bottle._handle() 方法上,其中抛出了UnicodeErrorbottle.py 第844 行):

def _handle(self, environ):
        path = environ['bottle.raw_path'] = environ['PATH_INFO']
        if py3k:
            try:
                environ['PATH_INFO'] = path.encode('latin1').decode('utf8')
            except UnicodeError:
                return HTTPError(400, 'Invalid path string. Expected UTF-8')

我在 Windows 10 机器上使用 Python 3.6.2Bottle v0.12.13Paste 2.0.3。这是怎么回事?这是瓶子或粘贴的问题吗?

注意:我已经通过重构所有代码以使用整数 ID 而不是名称来解决我的问题。但我仍然想了解更多相关信息。

堆栈跟踪:

Critical error while processing request: /hello/inglês

Error:

RuntimeError('Request context not initialized.',)
Traceback:

Traceback (most recent call last):
  File "C:\Users\fernando.filho\AppData\Local\Programs\Python\Python36\lib\site-packages\bottle.py", line 1661, in fget
    try: return ls.var
AttributeError: '_thread._local' object has no attribute 'var'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\fernando.filho\AppData\Local\Programs\Python\Python36\lib\site-packages\bottle.py", line 954, in wsgi
    out = self._cast(self._handle(environ))
  File "C:\Users\fernando.filho\AppData\Local\Programs\Python\Python36\lib\site-packages\bottle.py", line 907, in _cast
    out = self.error_handler.get(out.status_code, self.default_error_handler)(out)
  File "C:\Users\fernando.filho\AppData\Local\Programs\Python\Python36\lib\site-packages\bottle.py", line 842, in default_error_handler
    return tob(template(ERROR_PAGE_TEMPLATE, e=res))
  File "C:\Users\fernando.filho\AppData\Local\Programs\Python\Python36\lib\site-packages\bottle.py", line 3619, in template
    return TEMPLATES[tplid].render(kwargs)
  File "C:\Users\fernando.filho\AppData\Local\Programs\Python\Python36\lib\site-packages\bottle.py", line 3409, in render
    self.execute(stdout, env)
  File "C:\Users\fernando.filho\AppData\Local\Programs\Python\Python36\lib\site-packages\bottle.py", line 3396, in execute
    eval(self.co, env)
  File "<string>", line 17, in <module>
  File "C:\Users\fernando.filho\AppData\Local\Programs\Python\Python36\lib\site-packages\bottle.py", line 1249, in url
    return self.urlparts.geturl()
  File "C:\Users\fernando.filho\AppData\Local\Programs\Python\Python36\lib\site-packages\bottle.py", line 165, in __get__
    key, storage = self.key, getattr(obj, self.attr)
  File "C:\Users\fernando.filho\AppData\Local\Programs\Python\Python36\lib\site-packages\bottle.py", line 1663, in fget
    raise RuntimeError("Request context not initialized.")
RuntimeError: Request context not initialized.

【问题讨论】:

  • 什么是API? (你能发布一个最小的工作示例,以及整个异常堆栈跟踪吗?)
  • @ron.rothman 请参阅编辑。
  • 我没有在你的编辑中看到一个最小的工作示例,所以我自己写了。使用 Python 3.6.2 和 Bottle 0.12.13,GET /languages/Inglês 非常适合我。
  • 我对粘贴不熟悉。如果没有显示问题的最小示例,将无法帮助您。祝你好运!
  • 您的 curl 请求在技术上是无效的,因为您需要进行 URL 编码以确保 URL 中仅使用 ASCII。 curl 程序不适合你。粘贴服务器不允许发送非 ASCII 字符。与github.com/Pylons/waitress/issues/127#event-1207624604 类似的问题和与之关联的 Python 错误报告。

标签: python python-3.x utf-8 wsgi bottle


【解决方案1】:

这是瓶子的问题!

为了使用粘贴服务器,你可以改变这个: """bottle.py"""

environ['PATH_INFO'] = path.encode('latin1').decode('utf8', 'ignore')

到:

environ['PATH_INFO'] = path.encode('utf8').decode('utf8', 'ignore') #utf-8 or else

效果很好。

【讨论】:

    【解决方案2】:

    回答我自己的问题,引用@GrahamDumpleton:

    粘贴服务器不容忍发送非 ASCII 字符。

    【讨论】:

      猜你喜欢
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多