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

时间:2015-12-06 10:57:21

标签: python django pandas matplotlib 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')

这是调用main函数的url:

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

它在终端中执行的次数是我想要的次数。但卡在网页上。 请对我说清楚!! P.S我是Django的新手

1 个答案:

答案 0 :(得分:0)

您的功能需要将请求作为arg& amp;返回可以在浏览器中呈现的响应。

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

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(r'^ analytics/simple.png$', 'newsletter. analytics.main'),

如果您想要弹出窗口或类似内容,也许您可​​以查看创建ajax响应。因此,不要像那样返回,请检查if request.is_ajax:然后返回类似HttpResponse(json_data, mimetype="application/json")的内容。

我刚刚看到您编辑的地方已添加了return render('analytics.html')。那只是渲染你已经获得的模板。您希望将上下文与其一起传递,以便您可以显示已处理的数据,或只返回与上述类似的处理图像。