Возникли проблемы с передачей аргументов в декорированную функцию в колбе

Я новичок в 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'

Заранее спасибо! Я знаю, что мой код немного прост, поскольку я все еще нахожусь на начальной стадии кодирования, поэтому, пожалуйста, не торопитесь с ответом!

Просто подумайте, хотите ли вы использовать диаграммы Google для визуализации круговой диаграммы в своем шаблоне, я думаю, это может дать вам больше элегантности и гибкости. Если вы это сделаете, вам просто нужно передать цифры в свой шаблон, а затем js обработает отображение диаграммы. Если вы это сделаете, я мог бы предоставить рабочий пример с вашим кодом выше.

Moses N. Njenga 27.04.2018 20:47

Спасибо за ответ, Моисей! К сожалению, члены моей команды придерживаются matplotlib. Я не думал использовать диаграммы Google, но мне потребовалась секунда, чтобы проверить их. Я согласен с тем, что они кажутся чище и элегантнее. Я с нетерпением жду возможности поработать с ними над другими проектами.

EFryer 30.04.2018 01:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 возвращает: this image:

Другие вопросы по теме