【问题标题】:Having trouble passing arguments to decorated function in flask在烧瓶中将参数传递给装饰函数时遇到问题
【发布时间】:2018-10-08 13:19:16
【问题描述】:

我是 flask 和 python 的新手,我正在创建一个项目,该项目可以提取 Twitter 数据,以使用 TextBlob 对搜索词进行情绪分析,以显示一些视觉统计数据。我已将一些统计数据保存为变量(正面、负面和中性推文的百分比),并试图将它们传递给函数以生成饼图。此函数经过修饰,以便将生成的 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”

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

【问题讨论】:

  • 只是一个想法,您是否想使用谷歌图表来可视化您模板上的饼图,我认为它可能会给您带来更多的优雅和灵活性。如果你这样做了,你只需要将数字传递给你的模板,然后 js 处理显示图表。如果你这样做,我可以提供一个工作示例,上面有你的代码
  • 感谢摩西的回复!不幸的是,我的团队成员坚持使用 matplotlib。我没想过要使用谷歌图表,但我花了一秒钟来检查它们。我同意它们确实看起来更干净、更优雅。我期待在其他项目上与他们合作。

标签: python-3.x flask tweepy textblob


【解决方案1】:

您真的很接近正确的解决方案!定义上面的路由还应该包含函数所需的参数:@app.route('/piechart.png/&lt;x&gt;/&lt;y&gt;/&lt;z&gt;'),并且在调用url时也应该指定这些参数:&lt;img src='{{url_for('pie_chart', x=1, y=2, z=3)}}'&gt;

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时返回:

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 2013-02-02
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2013-07-09
    • 1970-01-01
    相关资源
    最近更新 更多