html - 如何不仅从 python CGI 脚本打开 HTML 文件,还将字符串和 JSON 文件等数据传递给 HTML 脚本?
问题描述
一段时间以来,我一直试图弄清楚如何在不使用框架的情况下做到这一点(例如,我可以使用 Flask 来完成这项工作),但到目前为止我还没有找到任何东西。我有两个 html 脚本和一个 python cgi 脚本。本质上,我有第一个 html 文件,其中用户输入了一个字符串,该字符串我读入了我的 python cgi 脚本,该脚本又做了很多事情,最终给了我一堆字符串和 json 文件,我需要将它们传递给另一个 html 文件并且能够在那里阅读它们。
到目前为止,前半部分有效,我可以使用不优雅的重定向打开第二个 html,但以下代码没有其他任何效果:
#!/Users/<username>/opt/anaconda3/bin//python
import pandas as pd
import numpy as np
import cgi
import cgitb
import sys
cgitb.enable()
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
protein_name = form.getvalue('protein_name')
####### function search_results takes in protein_name and gives me the data ###
####### I need to pass to the html file: results.html #########################
if ((search_results(protein_name)!="No protein entered")&(search_results(protein_name)!="No results found")):
all_vars = search_results(protein_name)
##### all_vars is a tuple of strings like gene_name, json files and integers
print("Content-type: text/html","\n\n")
print ('''
<head><meta http-equiv="refresh" content="0;URL='http://localhost/results.html'" /></head>
''')
关于如何进行的任何建议?任何帮助表示赞赏,谢谢!
解决方案
正如您可能已经发现的那样,您当前的技术会重定向到“results.html”,但会丢弃任何结果。我不确切知道您的目标是什么,但一种方法是将“results.html”视为一个简单的模板。您的脚本将填充它并返回它以响应每个请求。在下面的示例中,“results.html”可以包含任意 HTML,以及将替换为您的输出的“##RESULTS##”行。
#!/Users/<username>/opt/anaconda3/bin/python
import sys
import pandas as pd
import numpy as np
import cgi
import cgitb
cgitb.enable()
def process_results(results):
if results=='No protein entered' or results=='No results found':
return results
# else do something with results, e.g., format into an HTML table
buf = '<table>\n'
for result in results:
buf += f'<tr><td>{cgi.escape(str(result))}</td></tr>\n'
buf += '</table>\n'
return buf
form = cgi.FieldStorage()
protein_name = form.getvalue('protein_name')
results = search_results(protein_name)
print("Content-type: text/html\n")
with open('results.html') as template:
for line in (x.rstrip() for x in template):
if line == '##RESULTS##':
print(process_results(results))
else:
print(line)
祝你好运。