首页 > 解决方案 > 如何不仅从 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>    
''')

关于如何进行的任何建议?任何帮助表示赞赏,谢谢!

标签: htmljsonpython-3.xcgi

解决方案


正如您可能已经发现的那样,您当前的技术会重定向到“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)

祝你好运。


推荐阅读