类型错误:';非类型';对象在将JSON分配给python变量的GAE实例上不可下标

类型错误:';非类型';对象在将JSON分配给python变量的GAE实例上不可下标,python,json,google-app-engine,flask,google-cloud-platform,Python,Json,Google App Engine,Flask,Google Cloud Platform,当将JSON分配给python变量时,我遇到了一个错误TypeError:“NoneType”对象不可下标,比如sheet\u id=data[“sheetID”]。 它只发生在我的谷歌应用程序引擎实例上。当在本地运行我的Flask应用程序并使用Postman向该应用程序发送POST请求时,我无法获得它。下面是代码片段 @app.route('/main',methods=["POST"]) def main(): data = request.json pr

当将JSON分配给python变量时,我遇到了一个错误
TypeError:“NoneType”对象不可下标
,比如
sheet\u id=data[“sheetID”]
。 它只发生在我的谷歌应用程序引擎实例上。当在本地运行我的Flask应用程序并使用Postman向该应用程序发送POST请求时,我无法获得它。下面是代码片段

@app.route('/main',methods=["POST"])
def main():
    data = request.json
    print(data)
    scope = [
    'https://www.googleapis.com/auth/spreadsheets',
    'https://www.googleapis.com/auth/gmail.send',
    'https://www.googleapis.com/auth/gmail.settings.basic',
    'https://www.googleapis.com/auth/gmail.settings.sharing'
    ]

    GCP_PROJECT = os.environ['GCP_PROJECT']
    GAE_SID_VERSION = os.environ['GAE_SID_VERSION']


    credentials1 = access_secret_version(GCP_PROJECT, <SECRET NAME>, GAE_SID_VERSION)
    credentials1 = json.loads(credentials1)
    credentials = service_account.Credentials.from_service_account_info(credentials1)
    scoped_credentials = credentials.with_scopes(scope)
    gc = gspread.authorize(scoped_credentials)

    #for sheet with categories and score
    sheet_id = data["sheetID"] #this gives me the error

    workbook = gc.open_by_key(sheet_id)
    ...

    ...
    return "OK"
以下是应用程序引擎错误报告日志的回溯:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/app/app.py", line 118, in main
    sheet_id = data["sheetID"]
TypeError: 'NoneType' object is not subscriptable
最后,我想问一下,这个程序怎么可能完全带着这个错误运行呢?我想如果我不解决这个问题,我以后可能会遇到一些严重的问题


错误报告日志的屏幕截图

错误表示
数据

$ python3
Python 3.8.3 (v3.8.3:6f8c8320e9, May 13 2020, 16:29:34) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> d=None
>>> d['3']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable

request.json
将json请求负载作为python dict提供给您,但随后将其转换为json字符串,然后再次将其解析为python dict。您应该能够执行
data=request.json

,但现在错误已经消失了。我还仔细检查了我的代码,只有在程序结束时才返回“OK”。我还将这三行代码更正为
data=request.json
。谢谢你的帮助。也许除了
rundockermage
之外还有别的东西可以点击你的端点
/main
。除非有其他代码覆盖变量
数据
,否则此错误似乎是由于请求处理程序在没有json负载的情况下被命中,因此
request.json
返回
None
。此外,python3的stackdriver日志可能有点不稳定,并且不总是将来自同一请求的日志分组在一起。因此,您可能正在查看交织的多个请求的日志,但看起来错误返回的是OK。如果你包括一个屏幕截图,它会更容易告诉。嗨@Alex这是有道理的。我想这就是发生的事情,错误报告日志显示报告时的时间不正确。因为当我运行它并检查日志时,我得到了那个错误,但是程序运行完成了。我假设你指的是错误报告破折号的屏幕截图,所以我在回答中包含了它。我指的是“日志资源管理器”中日志的屏幕截图。你可以通过点击屏幕截图中的“查看日志”到达那里,但这可能会过滤掉除stacktrace之外的所有内容。我也希望看到stacktrace周围的日志。
$ python3
Python 3.8.3 (v3.8.3:6f8c8320e9, May 13 2020, 16:29:34) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> d=None
>>> d['3']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable
dataJSON = request.json
json_string = json.dumps(dataJSON)
data = json.loads(json_string)