如何更新Flask应用程序的数据?

时间:2017-06-01 01:50:16

标签: python flask terminal

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

sudo python app.py

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

可悲的是,每次有人访问我的网站时,这些网页数据都不会更新。相反,当我输入sudo python app.py时,网页抓取代码似乎只运行一次,因此当访问网址时的结果是静态的。每当有人访问该网站以获取最新的实时抓取数据时,我希望app.py运行。这是可能的,我将如何使用flask和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)

1 个答案:

答案 0 :(得分: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))