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

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: :