我想这是关于最佳做法的问题。
我对网络开发,网络框架等有点新意。我计划用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是一个显示结果列表的模板?
当然,在这里我不会让我的anagram程序打印任何东西,而是将它作为一个字符串数组返回。
另外,如果compute_all_anagrams需要一段时间 - 比如说10秒呢?怎么会改变事情?
由于
答案 0 :(得分:1)
如果需要花费很长时间进行计算,您可以考虑使用ajax或类似的客户端“呈现...”消息。那么你就会产生一个后台工作 - 最简单的方法就是完全运行一个外部进程 - 然后每次“它完成了吗?”请求进来,你检查它是否仍在运行,如果没有,返回结果(比如文件),如果它仍在运行,那么告诉客户端。
默认情况下,当你在前台做很多事情时,内置的开发web服务器会阻塞 - 这对多用户来说很糟糕,但对于单用户来说很好“我只想控制一些任务来自我的电话”。这就是为什么有许多其他服务器可以插入烧瓶或任何其他正常的python Web框架。这些称为WSGI服务器。一个好的'默认'是'waitress'http://waitress.readthedocs.org/en/latest/,这是一个纯python服务器,因此不需要任何额外的库或任何东西。同样好的是gevent WSGI服务器,gunicorn,uwsgi ......但对于小型(或少数)用户应用程序而言,这并不重要。
如果你把东西放在互联网上,公众可以访问它们,那么通常最好将你的烧瓶应用程序隐藏在nginx(或类似的)后面作为“反向代理”,这可能会限制请求没有吓坏,只是一般保持理智。
但无论如何,对于长时间的计算任务,响应时间为10秒。如果事情需要花费的时间超过一分钟,那么我会说你应该为这些任务研究某种外部过程,并对其进行监控。
你需要小心别人不能开始这样的工作 - 很多人都很容易让你的计算机用DOS来请求需要很长时间计算的工作。你应该对这些服务保留密码(至少!)保护。
你对路线的使用是错误的 - /result/<word>
就足够了。什么事后呢?实际上并不是路线的一部分 - 它是一个请求参数。您可以通过flask.request对象访问它们(查看文档)。
玩得开心! : - )