Flask send_from_directory, обслуживающий файл html вместо указанного файла - PullRequest
0 голосов
/ 08 января 2020

Я генерирую блок-схемы и использую Flask send_from_directory для их обслуживания.

Это работает как ожидалось:

в контроллере:

    elif fcf.validate_on_submit():
        subtopic = fcf.subtopicSelect.data
        topic = fcf.topicSelect.data
        t = Tree(topic, subtopic)
        token = t.getFlowChart()
        fileName = '{}.png'.format(token)
        filePath = SSTempDirectory
        return send_from_directory(filePath, fileName, as_attachment=True, attachment_filename = "flowchart.png")

и соответствующая функция в модели:

    def getFlowChart(self):
        graph = pydot.Dot(graph_type='digraph')


        nodeDict = {}
        for c in self.cards:
            newNode = pydot.Node(c.title, style="filled", fillcolor="#ffffff")
            nodeDict[c.id] = newNode
            graph.add_node(newNode)

        for c in self.cards:
            if self.triggers[c.id] != {}:
                for triggerID, trigger in self.triggers[c.id].items():
                    nodeA = nodeDict[trigger.cardId]
                    nodeB = nodeDict[trigger.destinationCardId]
                    graph.add_edge(pydot.Edge(nodeA, nodeB, label=trigger.label))

        token = secrets.token_urlsafe()
        graph.write_png(os.path.join(SSTempDirectory, '{}.png'.format(token)))

        return token

Все это работает как положено; файл .png обслуживается без ссылки на страницу sh, и пользователь может загрузить ее.

Теперь вот еще один кусок кода. Обратите внимание, что они точно такие же:

контроллер:

        if af.hitCountSubmit.data:
            subtopic = af.subtopicSelect.data
            topic = af.topicSelect.data
            t = Tree(topic, subtopic)
            token = t.countCardHits()
            fileName = '{}.png'.format(token)
            filePath = SSTempDirectory
            return send_from_directory(filePath, fileName, as_attachment=True, attachment_filename = "flowchart.png")

модель:

    def getAnalyticGraph(self, cardHits):
        graph = pydot.Dot(graph_type='digraph')


        nodeDict = {}
        for c in self.cards:
            try:
                newNode = pydot.Node(c.title + " - " + str(cardHits[c.id]), style="filled", fillcolor="#ffffff")
            except KeyError:
                newNode = pydot.Node(c.title + " - " + str(0), style="filled", fillcolor="#ffffff")
            nodeDict[c.id] = newNode
            graph.add_node(newNode)

        for c in self.cards:
            if self.triggers[c.id] != {}:
                for triggerID, trigger in self.triggers[c.id].items():
                    nodeA = nodeDict[trigger.cardId]
                    nodeB = nodeDict[trigger.destinationCardId]
                    graph.add_edge(pydot.Edge(nodeA, nodeB))

        token = secrets.token_urlsafe()
        graph.write_png(os.path.join(SSTempDirectory, '{}.png'.format(token)))

        return token

Я вижу, что файл сгенерирован правильно с правильным уникальным идентификатором в правильное местоположение. Я вижу, что передаю правильное имя файла и путь к файлу. Все точно так же, как и другой кусок кода. Но когда файл обслуживается, это файл HTML для страницы, а не указанный файл png.

Я пытался отлаживать это весь день, но я просто не могу ничего понять, все так же, как рабочий код, все выполняется правильно до тех пор, пока функция send_from_directory произвольно не возвращает HTML шаблон.

Пожалуйста, помогите, я в полной растерянности.

1 Ответ

0 голосов
/ 08 января 2020

Я понял это. Мое подключение к базе данных не было должным образом закрыто. Я понятия не имею, как они связаны, и на данный момент у меня нет времени, чтобы узнать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...