金字塔呈现的JSON响应以字符串形式返回

时间:2014-06-22 10:32:07

标签: python json urllib2 pyramid

我正在使用金字塔网络框架并编写一些接收和响应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"]}

有谁知道为什么我会得到一个字符串结果?

1 个答案:

答案 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)现在可能已经过时了。