我有一个使用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的新手
答案 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')
。那只是渲染你已经获得的模板。您希望将上下文与其一起传递,以便您可以显示已处理的数据,或只返回与上述类似的处理图像。