我正在使用金字塔网络框架并编写一些接收和响应JSON的函数。
以下是我编写的一些代码,用于返回给定目录中的文件和目录
@view_config(route_name='file', renderer='json')
def file(request):
values = request.json_body
path = os.path.dirname(__file__) + '/files' + values['path']
if os.path.isdir(path):
files = [ f for f in os.listdir(path) if os.path.isfile(os.path.join(path,f)) ]
dirs = [ f for f in os.listdir(path) if os.path.isdir(os.path.join(path,f)) ]
if files is None:
files = []
if dirs is None:
dirs = []
response = dict()
response['version']='1.0'
response['files']=files
response['directories']=dirs
return response
else:
response = dict()
response['version']='1.0'
response['files']=[]
response['directories']=[]
return response
@view_config(route_name='files', renderer='templates/filesTest.jinja2')
def files(request):
if 'form.submitted' in request.params:
json_payload = json.dumps({'path':request.params['path']})
headers = {'Content-Type':'application/json; charset=utf-8'}
req = urllib2.Request(request.route_url('file'), json_payload, headers)
resp = urllib2.urlopen(req)
data = resp.read()
return dict(dirs=[], files=[], saveURL = request.route_url('files'), pathDefault=request.params['path'])
return dict(dirs=[], files=[], saveURL = request.route_url('files'), pathDefault='/')
我主要遇到文件功能问题。 type(data)
正在返回<type 'str'>
。将字符串发送到我的模板会显示{"files": ["file1.jpg", "file2.png"], "version": "1.0", "directories": ["Directory1"]}
有谁知道为什么我会得到一个字符串结果?
答案 0 :(得分:1)
当您发出请求时,服务器会向您发送一些字节。你如何解释这些字节取决于你。如果您请求XML而不是JSON,那么您也不会收到XML对象,而是可以解释为XML的字节。
发出明确的请求是多余的。这在以下情况下是有意义的:
在这种情况下,所有代码都在同一个组件中,并且使用相同的语言。更好的解决方案是帮助函数:
def fetch_files_and_directories(path):
path = os.path.dirname(__file__) + '/files' + path
if os.path.isdir(path):
files = [ f for f in os.listdir(path) if os.path.isfile(os.path.join(path,f)) ]
dirs = [ f for f in os.listdir(path) if os.path.isdir(os.path.join(path,f)) ]
# Note that the is None check is nonsense.
# The result of an empty list comprehension is an empty list, not None
else:
files = []
directories = []
return dict(directories=dirs, files=files)
@view_config(route_name='file', renderer='json')
def file(request):
response = fetch_files_and_directories(request.json_body['path'])
# you might want to move this into the fetch_* function.
response['version']='1.0'
return response
@view_config(route_name='files', renderer='templates/filesTest.jinja2')
def files(request):
if 'form.submitted' in request.params:
path = request.params['path']
data = fetch_files_and_directories(path)
# You did not use data below here, so neither did I.
return dict(dirs=[], files=[], saveURL = request.route_url('files'), pathDefault=path)
return dict(dirs=[], files=[], saveURL = request.route_url('files'), pathDefault='/')
请记住,file(request)
现在可能已经过时了。