折腾:
【已解决】把文本格式的剧本内容用Python批量导入后台系统
期间,用代码:
<code>logging.info("curScriptDict=%s", curScriptDict)
saveScriptResp = requests.post(CreateScriptUrl, headers=gHeaders, data=curScriptDict)
logging.info("saveScriptResp=%s", saveScriptResp)
</code>结果导致服务器内部500错误:
<code>20180717 11:22:49 BatchImportScript.py:199 INFO curScriptDict={'operate_mark': 'save', 'place': 'School canteen', 'title': 'Have lunch', 'age_start': 3, 'age_end': 4, 'topic': 'Food', 'second_level_topic': '', 'dialogs': [{'type': '0', 'speaker': 'J', 'content': 'What did you have for lunch?'}, {'type': '0', 'speaker': 'L', 'content': 'I ate rice, fish and bread.'}, {'type': '0', 'speaker': 'J', 'content': 'Do you like rice?'}, {'type': '0', 'speaker': 'L', 'content': 'Yes, I do.'}, {'type': '0', 'speaker': 'J', 'content': 'Do you like fish?'}, {'type': '0', 'speaker': 'L', 'content': 'Yes, I do.'}, {'type': '0', 'speaker': 'J', 'content': 'Do you like bread?'},{'type': '0', 'speaker': 'L', 'content': 'No, I don’t.'}, {'type': '0', 'speaker': 'J', 'content': 'What did you drink?'}, {'type': '0', 'speaker': 'L', 'content': 'I drank milk.'}, {'type': '0', 'speaker': 'J', 'content': 'Do you like milk?'}, {'type': '0', 'speaker':'L', 'content': 'Yes, I do.'}]}
20180717 11:23:10 BatchImportScript.py:201 INFO saveScriptResp=<Response [500]>
</code>出错log是:
<code>0_response six.reraise(exc_type, exc_value, tb) File "/Users/crifan/Library/Python/3.6/lib/python/site-packages/six.py", line 693, in reraise raise value File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner response = get_response(request) File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response response = self.process_exception_by_middleware(e, request) File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/usr/local/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view return view_func(*args, **kwargs) File "/usr/local/lib/python3.6/site-packages/rest_framework/viewsets.py", line 103, in view return self.dispatch(request, *args, **kwargs) File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 483, in dispatch response = self.handle_exception(exc) File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 443, in handle_exception self.raise_uncaught_exception(exc) File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 480, in dispatch response = handler(request, *args, **kwargs) File "/Users/crifan/dev/dev_root/xxx/apps/script/views.py", line 136, in create if i['type'] == '0': TypeError: string indices must be integers </code>
对应代码查到是:
<code> script.save()
# dialog 创建
dialogs = request.data.get('dialogs', [])
if dialogs:
for i in dialogs:
if i['type'] == '0':
dialog = Dialog(type=i['type'], speaker=i['speaker'],
content=i['content'], script=script)
elif i['type'] == '1':
dialog = Dialog(type=i['type'],
audio_file_id=i['audio_file_id'],
audio_file_name=i['audio_file_name'],
script=script)
dialog.save()
serializer = ScriptSerializer(script, many=False)
return Response(serializer.data, status=status.HTTP_201_CREATED)
</code>看起来自己输出的post的body的json:

貌似没问题啊。
python TypeError string indices must be integers
python错误:TypeError: string indices must be integers – CSDN博客
string indices must be integers –GP调用执行Python时报错 – CSDN博客
“反复测试分析后确定原因:
在.py文件中写的data={“a”:”123″,”b”:”456″},data类型为dict
而在.py文件中通过data= arcpy.GetParameter(0) 获取在GP中传过来的参数{“a”:”123″,”b”:”456″},data类型为字符串!!!
所以在后续的.py中用到的data[‘a’]就会报如上错误!!!”
感觉这个倒是有可能。
突然想到:估计是没有传递content-type是json
导致默认按照txt去解析,所以出错了。去加上试试
此处果然看到了web端提交同样请求时,加上的:

<code>newOptions.headers = {
Accept: 'application/json',
'Content-Type': 'application/json; charset=utf-8',
</code>把自己的此处的header改为:
<code>gHeaders = {
'Content-Type': 'application/json; charset=utf-8',
"Accept": 'application/json',
"Authorization": "",
}
</code>结果就可以了。
【总结】
此处调用后台接口,但是后台代码:
<code>if i['type'] == '0': </code>
出错:
TypeError string indices must be integers
的原因是:
此时i是字符串类型,而不是原以为的json dict类型
而之所以变成这样是因为:
调用后台接口时,没有传递
<code>'Content-Type': 'application/json', </code>
的header,导致服务器后端默认按照text类型去解析。
解决办法:
调用后台接口时加上header:
<code>gHeaders = {
'Content-Type': 'application/json; charset=utf-8',
"Accept": 'application/json',
"Authorization": "",
}
</code>即可。
转载请注明:在路上 » 【已解决】Python调用接口出错:TypeError string indices must be integers