【问题标题】:How can I pass information from a Python code to a web information display?如何将信息从 Python 代码传递到 Web 信息显示?
【发布时间】:2019-11-08 22:34:05
【问题描述】:

我想制作一个功能类似于https://www.howmanypeopleareinspacerightnow.com/ 的网站,其中我有一个网站信息显示,它会定期刷新显示一条河流穿过城镇的水流。我正在使用 Beautiful Soup 抓取数据,并想创建一个网站,该网站使用我的 python 处理数据来生成预先确定的网站内容(例如,'水现在很高,它的流速为 XXX/s' 或'水现在很低')。

根据我的阅读,我可以创建一个托管在 heroku 上的 Python 应用程序,但是我必须在程序中创建一个 GUI,对吗?如何在不让用户运行程序的情况下将我的程序变成 html 页面的信息源?

我觉得这有一个名字,但我的谷歌搜索到目前为止还没有出现任何东西:(

【问题讨论】:

    标签: python user-interface heroku web-applications beautifulsoup


    【解决方案1】:

    听起来您想构建一个动态 SPA(单页应用程序)。

    您需要应用服务器托管后端,该后端将处理路由和提供动态内容(水流量)。

    然后您需要一些前端代码来呈现漂亮的 UI 并显示后端提供的内容。

    听起来你想使用 python(根据问题标签)。

    实现此目的的一种快速方法是创建一个 python Flask 应用程序。 Flask 将允许您构建应用服务器。此外,Flask 有一个“模板引擎”Jinja2,它允许您通过组合 HTML 和 python 对象来创建 UI。

    例如:

    创建一个名为 waterprojectwaterproject/templates/ 的文件夹 然后创建2个文件,waterproject/app.pywaterproject/templates/index.html

    # waterproject/app.py
    from flask import Flask, render_template
    import json
    
    app = Flask(__name__)
    
    def read_water_level():
        with open('/file/where/data/is/stored.txt') as file:
            water_level = file.read()
    
        return water_level
    
    @app.route('/index', methods=['GET'])
    def index():
    
        render_template('index.html', water_level=read_water_level())
    
    @pp.route('/waterlevel', methods=['GET'])
    def get_water_level():
        return json.dumpss({'waterlevel': read_water_level()})
    
    if __name__ == "__main__":
        app.run(host='localhost',debug=True)
    

    我们在上面创建了 2 条路线。一个服务于主页,另一个是只返回水位的 api 端点。这个端点将用于允许前端自动轮询后端的水位,而无需重新渲染(或刷新)整个页面。 还假设您的网络爬虫将水位保存在文件中的“/file/where/data/is/stored.txt”

    然后您将创建上述路由呈现的 .html 文件 (index.html)。

    # in /waterproject/templates/index.html
    <!DOCTYPE html> 
    <html> 
    
    <head> 
    <script src="jquery-3.4.1.min.js"></script>
    
        <title>Water Level of River</title> 
        <style> 
            body { 
                text-align: center; 
            } 
    
            #water { 
                color: blue; 
            } 
        </style> 
    
        <script>
            var get_water_level = function() {
                $.get( "/waterlevel", function( data ) {
                  $( "#water" ).html( data['waterlevel'] );
                });
            };
            var interval = 1000 * 60 * X; // where X is your every X minutes
    
            setInterval(get_water_level, interval);
    
        </script>
    </head> 
    
    <body>
        <div id="water">
            {{water_level}}
        </div>
    </body> 
    
    </html> 
    

    注意这个 html 文件是如何将 {{water_level}} 对象嵌入到 html 中的。这不是正确的 html,但是 Flask 使用的模板引擎允许我们有效地将 water_level 对象从应用服务器的 python 代码传递到 html 文档中。

    此外,.html 页面中有一些 javascript,用于每 X 分钟获取一次水位,并更新页面。因此,如果用户访问您的页面并在其上停留 10 分钟,则该页面将每分钟自动刷新一次。

    要部署应用程序,请查看 Flask 的文档,那里有一些不错的选项和说明,包括 Heroku 的说明。 https://flask.palletsprojects.com/en/1.0.x/deploying/

    *注意我实际上并没有运行这段代码,但它应该给你一个很好的起点。 将 css、javascript 和 html 组织在不同的文件中也是一种很好的做法,但是对于这么小的应用程序,为了简单起见,所有内容都显示在一个文件中。

    【讨论】:

      【解决方案2】:

      看看 Flask,你可以通过 python 生成你的内容并用 Flask 轻松展示。

      【讨论】:

      • 谢谢,flask 已经出现在一些搜索中,我认为这可能是我运行代码所需要的。但是前端美学呢?据我了解,flask 以这种方式受到限制,因此我对 UI 的评论?
      • @ayduh,只要有一点 html 和 css 知识,您就可以轻松地为页面设置样式,flask 允许您在页面中实现 JavaScript。
      【解决方案3】:

      Django 是使用 Python 创建网页的首选方式 - 它有一个非常全面的 tutorial,并且可以处理所有后端内容。您仍然需要弄清楚托管;云服务(如 AWS 或 Azure)可以很好地与 Django 配合使用,或者您可以在自己的计算机上进行托管。

      对于前端开发,您可以使用 WYSIWYG(所见即所得)设计器,它可以让您拖放来创建页面。然后,您可以导出页面并将其用作 Django 中的模板。如果您的网站比较复杂,您需要学习一些基本的基于文​​本的 HTML 技能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-12
        • 2014-09-18
        • 1970-01-01
        相关资源
        最近更新 更多