无法将参数传递给烧瓶中的装饰函数

时间:2018-04-27 16:31:05

标签: python-3.x flask tweepy textblob

我是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

这里是调用情绪()的地方:

@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'

提前致谢!我知道我的代码有点基础,因为我还处于编码的初级阶段,所以请在回复中轻松一下!

1 个答案:

答案 0 :(得分:0)

你真的很接近正确的解决方案!定义上方的路径还应包含函数所需的参数:@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

返回:this image

相关问题