无法将参数传递给烧瓶中的装饰函数
Having trouble passing arguments to decorated function in flask
我是 Flask 的新手,python 正在创建一个项目,该项目使用 TextBlob 来提取 Twitter 数据以对搜索词执行情绪分析,以显示一些视觉统计数据。我已经将一些统计数据保存为变量(正面、负面和中性推文的百分比),并试图将它们传递到一个函数中以生成饼图。此函数经过修饰,因此它将生成的 PNG 文件传递到 HTML 页面。我似乎在将这些变量传递到我的绘图函数时遇到了问题。
以下是我的部分情绪分析:
def sentiment(userinput):
# creating object of TwitterClient Class
api = TwitterClient(userinput)
# calling function to get tweets
#searchterm = input("Enter query: ")
tweets = api.get_tweets(query=api.searchterm, count=10)
# picking positive tweets from tweets
ptweets = [tweet for tweet in tweets if tweet['sentiment'] == 'positive']
# percentage of positive tweets
ptweet_analyses_pie = 100 * len(ptweets) / len(tweets)
# picking negative tweets from tweets
ntweets = [tweet for tweet in tweets if tweet['sentiment'] == 'negative']
# percentage of negative tweets
ntweets_analyses_pie = (100 * len(ntweets) / len(tweets))
# percentage of neutral tweets
#leftoverTweets = tweets - ntweets - ptweets
nut_tweet_analyses_pie = (100 * (len(tweets) - len(ntweets) - len(ptweets)) / len(tweets))
pie_chart_img = pie_chart(ptweet_analyses_pie, nut_tweet_analyses_pie, ntweets_analyses_pie)
return ptweets, ntweets, ptweet_analyses, ntweets_analyses, nut_tweet_analyses, pie_chart_img
这里是调用 sentiment() 的地方:
@app.route('/render_Data', methods = ['GET', 'POST'])
def render_Data():
if request.method == 'POST':
tweets=request.form['tweets']
ptweets, ntweets, ptweet_analyses, ntweets_analyses, nut_tweet_analyses, pie_chart_img = sentiment(tweets)
return render_template('render_Data.html', ptweets = ptweets, ntweets = ntweets, ptweet_analyses = ptweet_analyses,
ntweets_analyses = ntweets_analyses, nut_tweet_analyses = nut_tweet_analyses, pie_chart_img = pie_chart_img)
这里是我制作 pie_chart.png 并给它一个 url 以呈现为 html 而不保存到静态。
@app.route('/pie_chart.png')
def pie_chart(x,y,z):
labels = 'Positive', 'Negative', 'Neutral'
sizes = [x,y,z]
colors = ['gold', 'pink', 'lightskyblue']
explode = (0, 0, 0) # explode 1st slice
# Plot
plt.axis('equal')
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
autopct='%1.1f%%', shadow=True, startangle=140)
img = BytesIO()
plt.savefig(img)
response = make_response(img.getvalue())
response.mimetype = 'image/png'
return response
最后 HTML:
<img src='{{url_for('pie_chart')}}'>
不幸的是,当我尝试呈现结果时出现错误:pie_chart() 缺少 3 个必需的位置参数:'x'、'y' 和 'z'
提前致谢!我知道我的代码有点初级,因为我仍处于编码的初级阶段,所以请在回复时放轻松!
您真的很接近正确的解决方案!定义上面的路由还应该包含函数需要的参数:@app.route('/piechart.png/<x>/<y>/<z>')
,调用url时也应该指定这些参数:<img src='{{url_for('pie_chart', x=1, y=2, z=3)}}'>
from flask import Flask, render_template_string, url_for, make_response
from io import BytesIO
import matplotlib
matplotlib.use('Agg')
from matplotlib import pyplot as plt
app = Flask(__name__)
@app.route('/piechart.png/<x>/<y>/<z>', methods=['GET', 'POST'])
def chart_maker(x, y, z):
labels = 'Positive', 'Negative', 'Neutral'
sizes = [x, y, z]
colors = ['gold', 'pink', 'lightskyblue']
explode = (0, 0, 0)
plt.axis('equal')
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
autopct='%1.1f%%', shadow=True, startangle=140)
img = BytesIO()
plt.savefig(img)
response = make_response(img.getvalue())
response.mimetype = 'image/png'
return response
@app.route('/display_chart')
def display_chart():
return render_template_string('<img src="{{url_for("chart_maker", x=1, y=2, z=3)}}">')
app.run()
访问时 http://127.0.0.1:5000/display_chart
returns: :
我是 Flask 的新手,python 正在创建一个项目,该项目使用 TextBlob 来提取 Twitter 数据以对搜索词执行情绪分析,以显示一些视觉统计数据。我已经将一些统计数据保存为变量(正面、负面和中性推文的百分比),并试图将它们传递到一个函数中以生成饼图。此函数经过修饰,因此它将生成的 PNG 文件传递到 HTML 页面。我似乎在将这些变量传递到我的绘图函数时遇到了问题。
以下是我的部分情绪分析:
def sentiment(userinput):
# creating object of TwitterClient Class
api = TwitterClient(userinput)
# calling function to get tweets
#searchterm = input("Enter query: ")
tweets = api.get_tweets(query=api.searchterm, count=10)
# picking positive tweets from tweets
ptweets = [tweet for tweet in tweets if tweet['sentiment'] == 'positive']
# percentage of positive tweets
ptweet_analyses_pie = 100 * len(ptweets) / len(tweets)
# picking negative tweets from tweets
ntweets = [tweet for tweet in tweets if tweet['sentiment'] == 'negative']
# percentage of negative tweets
ntweets_analyses_pie = (100 * len(ntweets) / len(tweets))
# percentage of neutral tweets
#leftoverTweets = tweets - ntweets - ptweets
nut_tweet_analyses_pie = (100 * (len(tweets) - len(ntweets) - len(ptweets)) / len(tweets))
pie_chart_img = pie_chart(ptweet_analyses_pie, nut_tweet_analyses_pie, ntweets_analyses_pie)
return ptweets, ntweets, ptweet_analyses, ntweets_analyses, nut_tweet_analyses, pie_chart_img
这里是调用 sentiment() 的地方:
@app.route('/render_Data', methods = ['GET', 'POST'])
def render_Data():
if request.method == 'POST':
tweets=request.form['tweets']
ptweets, ntweets, ptweet_analyses, ntweets_analyses, nut_tweet_analyses, pie_chart_img = sentiment(tweets)
return render_template('render_Data.html', ptweets = ptweets, ntweets = ntweets, ptweet_analyses = ptweet_analyses,
ntweets_analyses = ntweets_analyses, nut_tweet_analyses = nut_tweet_analyses, pie_chart_img = pie_chart_img)
这里是我制作 pie_chart.png 并给它一个 url 以呈现为 html 而不保存到静态。
@app.route('/pie_chart.png')
def pie_chart(x,y,z):
labels = 'Positive', 'Negative', 'Neutral'
sizes = [x,y,z]
colors = ['gold', 'pink', 'lightskyblue']
explode = (0, 0, 0) # explode 1st slice
# Plot
plt.axis('equal')
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
autopct='%1.1f%%', shadow=True, startangle=140)
img = BytesIO()
plt.savefig(img)
response = make_response(img.getvalue())
response.mimetype = 'image/png'
return response
最后 HTML:
<img src='{{url_for('pie_chart')}}'>
不幸的是,当我尝试呈现结果时出现错误:pie_chart() 缺少 3 个必需的位置参数:'x'、'y' 和 'z'
提前致谢!我知道我的代码有点初级,因为我仍处于编码的初级阶段,所以请在回复时放轻松!
您真的很接近正确的解决方案!定义上面的路由还应该包含函数需要的参数:@app.route('/piechart.png/<x>/<y>/<z>')
,调用url时也应该指定这些参数:<img src='{{url_for('pie_chart', x=1, y=2, z=3)}}'>
from flask import Flask, render_template_string, url_for, make_response
from io import BytesIO
import matplotlib
matplotlib.use('Agg')
from matplotlib import pyplot as plt
app = Flask(__name__)
@app.route('/piechart.png/<x>/<y>/<z>', methods=['GET', 'POST'])
def chart_maker(x, y, z):
labels = 'Positive', 'Negative', 'Neutral'
sizes = [x, y, z]
colors = ['gold', 'pink', 'lightskyblue']
explode = (0, 0, 0)
plt.axis('equal')
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
autopct='%1.1f%%', shadow=True, startangle=140)
img = BytesIO()
plt.savefig(img)
response = make_response(img.getvalue())
response.mimetype = 'image/png'
return response
@app.route('/display_chart')
def display_chart():
return render_template_string('<img src="{{url_for("chart_maker", x=1, y=2, z=3)}}">')
app.run()
访问时 http://127.0.0.1:5000/display_chart
returns: