我目前使用 argparse 在 python 中编写命令行驱动的脚本。我正在考虑制作一个为许多这些脚本提供前端的服务器(有些计算机可能没有 RAM、处理速度等,无法在本地运行它们)。所以我想知道通过网页连接到这些脚本的不同方法。
目标是让 argparse 内容生成网页的等价物(例如,带有选项的参数将显示为组合框, bool 型参数将显示为复选框,等等)。由于 argparse 定义得相当好,我想可以围绕 argparse 函数创建一个包装器来生成所需的 HTML。
对于如何轻松地执行此操作有什么建议吗?
编辑:这是我设想的示例。
这是一个使用 argparse 的简单脚本,下面是一些我设想从 argparse 翻译过来的 html。
import argparse, sys
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file', nargs='?', help="The fasta file to process.", type=argparse.FileType('r'), default=sys.stdin)
parser.add_argument('-o', '--out', nargs='?', help="The file to write processed file to.", type=argparse.FileType('w'), default=sys.stdout)
parser.add_argument('--something', help="This does something", choices=['a','b'], type=str, default='a')
parser.add_argument('--somethingelse', help="This does something else", action='store_true', type=bool)
def main():
args = parser.parse_args()
#do stuff here such a reading in files, processing, and delivering output
if __name__ == "__main__":
sys.exit(main())
对于 html 是这样的(我对 HTML 很糟糕,所以它可能是错误的/hack)
<form>
File: <input type="text" name="file"><br>
Out: <input type="text" name="out"><br>
<select name="something">
<option value="a" selected>a</option>
<option value="b">b</option>
</select><br>
Somethingelse: <input type="checkbox" name="somethingelse" value="true"><br>
<input type="submit" value="Submit">
</form>
然后点击提交将导致服务器使用这些参数执行脚本。本质上,我希望我的服务器像我输入的那样发送命令,如果我们正在使用输出文件,它会给用户一些可下载的东西(但这是另一个问题)
最佳答案
这大概就是您想要做的吗?
import argparse
parser = argparse.ArgumentParser(description='sample parser')
arg1 = parser.add_argument('--foo')
print parser
print arg1
html = """
<form name="%(prog)s action="%(action)s" method="get">
%(description)s
<input type="text" name="%(dest)s"><br>
<input type="submit" value="Submit">
</form>
"""
d = vars(parser)
d.update(vars(arg1))
d['action'] = 'html_form.xxx'
print html%d
显示:
ArgumentParser(prog='stack21586315.py', usage=None, description='sample parser',
version=None, formatter_class=<class 'argparse.HelpFormatter'>,
conflict_handler='error', add_help=True)
_StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None,
default=None, type=None, choices=None, help=None, metavar=None)
<form name="stack21586315.py action="html_form.xxx" method="get">
sample parser
<input type="text" name="foo"><br>
<input type="submit" value="Submit">
</form>
我正在从 parser
及其 action
的属性生成一个字典,并使用它们来填充 form
中的槽字符串。
一个基本的 WSGI 函数包括通过 start_response
发送一个 response
,并接收一个 request
(这里是 envirion
参数)。细节因框架而异。
此模块(和函数)的 url 在表单的 action
属性中指定。如何发送值取决于方法
(获取/发布)。这些值位于 environ['QUERY_STRING']
中。 cgi
或 urlparse
模块(或查看您的框架)中有多种工具可用于解析此字符串。解析后的请求最终应该看起来很像 vars(args)
。
def my_send_app(environ, start_response):
status = '200 OK' # HTTP Status
headers = [('Content-type', 'text/plain')] # HTTP Headers
start_response(status, headers)
# The returned object is going to be printed
# create the HTML including the form; return as list of strings
return [...]
def my_receive_app(envirion, start_responce):
# Returns a dictionary containing lists as values.
d = urlparse.parse_qs(environ['QUERY_STRING'])
# d should be similar to vars(args)
# apply the values in d
# use start_responce to reply to the browser
关于python - HTML 表单和 argparse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21586315/