在 django 中执行 views.py 中的函数,进入无限循环

In django on executing a function in views.py , goes into infinite loop

我有一个函数,它使用 matplotlib 和 pandas 从 txt 文件处理推文并绘制图表。

我在 django 的 views.py 中使用该脚本。 第一次正确显示输出,但是第二次执行网页会导致无限循环。

我想找出原因,但无法解决。 这是 views.py 函数:

def main():
    print 'Reading Tweets\n'
    tweets_data_path = 'twitter_data.txt'
    tweets_data = []
    tweets_file = open(tweets_data_path, "r")

    for line in tweets_file:
        try:
            tweet = json.loads(line)
            tweets_data.append(tweet)
        except:
            continue

    print 'Structuring Tweets\n'
    tweets = pd.DataFrame()
    tweets['text'] = map(lambda tweet: tweet['text'], tweets_data)
    tweets['lang'] = map(lambda tweet: tweet['lang'], tweets_data)

    print 'Adding programming languages tags to the data\n'

    tweets['python'] = tweets['text'].apply(
        lambda tweet: word_in_text('python', tweet)
    )
    tweets['javascript'] = tweets['text'].apply(
        lambda tweet: word_in_text('javascript', tweet)
    )
    tweets['ruby'] = tweets['text'].apply(
        lambda tweet: word_in_text('ruby', tweet)
    )

    print 'Analyzing tweets by programming language\n'
    prg_langs = ['python', 'javascript', 'ruby']

    tweets_by_prg_lang = [
        tweets['python'].value_counts()[True],
        tweets['javascript'].value_counts()[True], 
        tweets['ruby'].value_counts()[True]
    ]

    x_pos = list(range(len(prg_langs)))
    width = 0.8
    fig, ax = plt.subplots()
    plt.bar(x_pos, tweets_by_prg_lang, width, alpha=1, color='g')
    ax.set_ylabel('Number of tweets', fontsize=15)
    ax.set_title('Ranking:', fontsize=10, fontweight='bold')
    ax.set_xticks([p + 0.4 * width for p in x_pos])
    ax.set_xticklabels(prg_langs)
    plt.grid()
    plt.show()
return render('analytics.html')

这是调用主函数的url:

 url(r'^analytics/$', 'newsletter.analytics.main', name='analytics'),

它在终端中执行我想要的次数。但卡在网页上。 请给我一些启示! P.S 我是 Django 新手

您的函数需要将请求作为 arg & return 可以在浏览器中呈现的响应。

然后你需要决定如何显示它,所以基本上你需要做;

def main(request, *args, **kwargs):
    # all your existing code first, then respond to the request;

    canvas = FigureCanvas(fig)
    response= HttpResponse(mimetype='image/png')
    canvas.print_png(response)
    return response

然后为了 IE 支持(某些版本忽略 content_type),您的 URL 应该指定图像扩展名;

url(r'^ analytics/simple.png$', 'newsletter. analytics.main'),

如果您希望它出现在弹出窗口或类似窗口中,也许您可​​以考虑创建一个 ajax 响应。因此,不要像那样 return,而是检查 if request.is_ajax: 然后 return 类似 HttpResponse(json_data, mimetype="application/json").

的东西

我刚看到您添加 return render('analytics.html') 的编辑。那只会呈现您所拥有的模板。你想传递上下文,以便你可以显示你处理过的数据,或者只是 return 你处理过的与上面类似的图像。