使用Flask应用作为非网页程序的接口

0 投票
1 回答
1311 浏览
提问于 2025-04-18 00:32

我想这其实是关于最佳实践的问题。

我对网页开发和网页框架还比较陌生。现在我打算用Flask做一个网站。我想做一个应用程序,它实际上是一个命令行程序的界面。比如说,我有一个Python命令行程序,它可以接受一个单词,然后打印出这个单词的所有有效的变位词。那么,这个逻辑应该放在我的Flask应用的哪里呢?是不是像这样?

from anagram import compute_all_anagrams

@app.route("/result?word=<word>") # I'm not sure if this is correct usage of route
def result_page(word):
    result = compute_all_anagrams(word) # returns a list of anagrams
    render_template("result.html", result=result)

这里的result.html是一个模板,用来显示结果列表吗?

当然,在这里我不会让我的变位词程序打印任何东西,而是把结果作为一个字符串数组返回。

另外,如果compute_all_anagrams这个过程需要一些时间,比如说10秒,那会有什么变化呢?

谢谢!

1 个回答

1

没错,你理解得很对。

如果计算需要很长时间,你可以考虑使用ajax或者类似的客户端“正在处理...”的消息。这样的话,你可以启动一个后台任务——最简单的方法其实是完全运行一个外部进程。然后每次收到“完成了吗?”的请求时,你就检查一下它是否还在运行。如果没有在运行,就返回结果(比如从一个文件中),如果还在运行,就告诉客户端还在处理。

默认情况下,flask自带的开发用网页服务器在前台执行长时间任务时会被阻塞——这对多用户来说不好,但对于单用户“我只想用手机控制几个任务”来说是可以的。这就是为什么有很多其他服务器可以和flask或其他普通的python网页框架一起使用。这些被称为WSGI服务器。一个不错的“默认”选择是‘waitress’ http://waitress.readthedocs.org/en/latest/,这是一个纯python的服务器,不需要额外的库或其他东西。还有gevent WSGI服务器、gunicorn、uwsgi等也不错……但对于小型的单用户(或少数用户)应用来说,这些其实没什么太大关系。

如果你把东西放到互联网上,让公众可以访问,通常把你的flask应用放在nginx(或类似的东西)后面作为“反向代理”是个好主意,这样可以限制请求的数量而不会崩溃,并且一般来说能保持系统的稳定。

不过,10秒的响应时间对于长时间计算的任务来说是可以接受的。如果任务需要超过一分钟,那我建议你一定要考虑使用某种外部进程来处理这些任务,并进行监控。

你需要小心,确保其他人不能随便启动这样的任务——很多人同时请求需要很长时间计算的任务,很容易让你的电脑瘫痪。你应该至少给这样的服务加上密码保护。

不过你使用的路由是错的——/result/<word>就足够了。问号后面的内容其实不是路由的一部分——它是请求参数。你可以通过flask.request对象来访问这些参数(可以查查文档)。

祝你玩得开心!:-)

撰写回答