Flask,无法返回用户选择的静态文件

时间:2015-03-31 17:23:46

标签: python json flask

我正在创建一个json数据的可视化,由用户从下拉框中选择。下拉框由app / static / Crews文件夹中的json文件名填充。 javascript d3代码调用一个使用所选json文件的函数

d3.json("/data", function(error, graph)

这是我用来填充下拉框的代码,

class userInput(Form):
    json_fileCrew = SelectField(u"Filename", choices=[(f, f) for f in filenamesCrew])

这是我获取json文件的函数。

def get_data(json_fileCrew):
        json = send_from_directory ("/myproject/app/static/Crews" , json_fileCrew)
        return json

我使用

在views.py中调用它
@app.route("/data", methods=['GET']) 
def data():
        u = userInput()
        json = u.get_data()
        return json

我收到此错误

    json = u.get_data()
  File "\project\myproject\forms.py", line 34,
in get_data
    json = send_from_directory ("/myproject/app/static/Crews" , json_fileCrew)
  File "C:\Python34\lib\site-packages\flask\helpers.py", line 612, in send_from_
directory
    filename = safe_join(directory, filename)
  File "C:\Python34\lib\site-packages\flask\helpers.py", line 574, in safe_join
    filename = posixpath.normpath(filename)
  File "C:\Python34\lib\posixpath.py", line 335, in normpath
    initial_slashes = path.startswith(sep)
AttributeError: 'userInput' object has no attribute 'startswith'

我不明白为什么我收到这个错误。我想查看该文件夹并返回与用户选择的名称相同的json文件(例如1981.json)。

编辑以下是userInput类的完整代码

class userInput(Form):
    json_fileCrew = SelectField(u"Filename", choices=[(f, f) for f in filenamesCrew])

    def get_data(json_fileCrew):
        json = send_from_directory ("/myproject/app/static/Crews",json_fileCrew)
        return json

我也尝试了下面的代码,但它没有用。

 if os.path.isfile(os.path.join(crewPath, json_fileCrew)):
            return send_from_directory(crewPath, json_fileCrew)

1 个答案:

答案 0 :(得分:0)

get_data方法是......一种方法。所以它获得的第一个arg是self,即使你调用arg“json_fileCrew”。您希望该方法可以访问SelectField的表单值。您可以使用self.json_fileCrew.data

的方法访问该文件
class UserInput(Form):
    filename = SelectField(choices=[(f, f) for f in crew_files])

    def get_data(self):
        return send_from_directory(crew_path, self.filename.data)

表单不接收json数据,get_data不返回json数据,所以不清楚为什么你这样命名它们。

您正在使用一些非常规变量名称。有关大多数Python程序员所期望的标准格式,请参阅PEP 8