Я генерирую блок-схемы и использую 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 шаблон.
Пожалуйста, помогите, я в полной растерянности.