Возникают проблемы с передачей аргументов декорированной функции в колбе
Я новичок в 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 без сохранения в static.
@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 ответ
Вы действительно близки к правильному решению! Маршрут над определением также должен содержать аргументы, необходимые для функции: @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
возвращает: :