python - HTML 表单和 argparse

标签 python html argparse

我目前使用 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'] 中。 cgiurlparse 模块(或查看您的框架)中有多种工具可用于解析此字符串。解析后的请求最终应该看起来很像 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

http://webpython.codepoint.net/wsgi_request_parsing_get

关于python - HTML 表单和 argparse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21586315/

相关文章:

javascript - 哪个位置更适合压缩图像?在浏览器中还是在服务器上?

javascript - 我们可以在 webGL 中用 HTML 元素制作平面几何吗?

html - 为什么 CSS 文件没有加载到 React 应用程序中

html - 当基本 href 设置为该子目录时,如何链接到该子目录中的主 URL?

python - 多值参数的自定义使用消息

python - python 中的简单命令行应用程序 - 解析用户输入?

python - flask +Pyspark : duplicate spark session

python - 为 Jupyter QtConsole 设置默认配置

python - 如何在Python中显示关键搜索词之前和之后的2个单词

python - 在组间使用互斥