【问题标题】:How do I update my Flask app's data?如何更新我的 Flask 应用程序的数据?
【发布时间】:2017-06-01 10:34:44
【问题描述】:

我正在使用 Python 和 Flask 构建一个简单的网站。当我在终端中运行以下命令时,我注意到了:

sudo python app.py

它设置了所有内容并让我的网站可以从本地端口在网络浏览器中访问。我的问题是我的 Flask app.py 文件进行了一些网络抓取,并在访问时在网站中显示结果。

遗憾的是,每次有人访问我的网站时,这些网络抓取数据似乎都不会更新。相反,当我输入sudo python app.py 时,网络抓取代码似乎只运行一次,因此访问 URL 时的结果是静态的。我希望 app.py 在每次有人访问该站点时运行以获取最新的实时抓取数据。这可能吗?我将如何使用烧瓶和 python 做到这一点?

我的app.py 包含:

from flask import Flask, flash, redirect, render_template, request, session, abort
from sklearn.externals import joblib
import praw
import datetime
from operator import attrgetter
import sys
import numpy as np

class Post:
    def __init__(self, subreddit):
        self.subreddit = subreddit


class HotPost:
    def __init__(self, subreddit, ):
        self.subreddit = subreddit


reddit = praw.Reddit(client_id='myClientId',
                     client_secret='myClientSecret',
                     user_agent='pythonscript:com.example.hotandrisingcheckerandbarker:v0.1 (by /u/myusername)',
                     username='myusername',
                     password='mypassword')
subredditsToScan = ["Art", "videos", "worldnews"]
svm = joblib.load('modelSvm.pkl')
trendingPosts = []

for subreddit in subredditsToScan:
    for submission in reddit.subreddit(subreddit).hot(limit=150):

        trendingPosts.append(Post(subreddit))

app = Flask(__name__)

@app.route("/")
def index():
    #return "Flask App!"
    return render_template(
        'list.html',name=len(trendingPosts))

@app.route("/hello/<string:name>/")
def hello(name):
    return render_template(
        'list.html',trendingPosts=trendingPosts)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

【问题讨论】:

  • app.py 中有什么内容?
  • app.py 包含我所有抓取网站的代码以及 @app.route("/hello//") 和告诉网站什么的 hello 函数 def 。 html 页面显示它们
  • 抽象地描述它不是很有帮助。请edit您的问题并将最重要的部分添加为minimal reproducible example
  • 添加了这个,虽然这与我的特定代码关系不大,更多的是与架构和使用烧瓶部署网站有关,所以不确定我的代码是否会为答案增加很多洞察力,但也许我错了。

标签: python flask terminal


【解决方案1】:

当您加载页面时,代码中唯一会运行的部分是附加到相关路由的函数中的任何内容。您构建trendingPosts 的部分仅在您启动服务器时运行一次。

如果您将 for 循环移动到 index() 内,您应该会得到您正在寻找的行为:

@app.route("/")
def index():
    for subreddit in subredditsToScan:
        for submission in reddit.subreddit(subreddit).hot(limit=150):
            trendingPosts.append(Post(subreddit))

    return render_template(
        'list.html',name=len(trendingPosts))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多