在 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 你处理过的与上面类似的图像。
我有一个函数,它使用 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 你处理过的与上面类似的图像。