Forums

How do I run my main() function? I get an error when I call it directly.

I put a print("test") inside my main function for my flask webapp, and the print doesn't ever run, unless i call main() at the end of my function, which then gives me a context error. I'm new to pythonanywhere and very confused, could someone please take a look and give some advice?

from flask import Flask, render_template
import openpyxl

app = Flask(__name__,
            template_folder='/home/twalker/mysite/templates/')

@app.route('/')
def main():
  print("test")
  wb1 = openpyxl.load_workbook("/home/twalker/mysite/spreadsheet1.xlsx")
  sheet1 = wb1.active

  wb2 = openpyxl.load_workbook("/home/twalker/mysite/spreadsheet2.xlsx")
  sheet2 = wb2.active

  up_sales_dollars = []
  down_sales_dollars = []
  up_ordered_units = []
  down_ordered_units = []

  for row in sheet1.iter_rows(min_row=2):
    product_title = row[0].value
    ordered_revenue1 = row[1].value
    ordered_units1 = row[2].value

    for row2 in sheet2.iter_rows(min_row=2):
      if row2[0].value == product_title:
        ordered_revenue2 = row2[1].value
        ordered_units2 = row2[2].value
        break

    if ordered_revenue1 > ordered_revenue2:
      up_sales_dollars.append((product_title, ordered_revenue1, ordered_revenue2))
    elif ordered_revenue1 < ordered_revenue2:
      down_sales_dollars.append((product_title, ordered_revenue1, ordered_revenue2))
    if ordered_units1 > ordered_units2:
      up_ordered_units.append((product_title, ordered_units1, ordered_units2))
    elif ordered_units1 < ordered_units2:
      down_ordered_units.append((product_title, ordered_units1, ordered_units2))

  context = {
    'up_sales_dollars': up_sales_dollars,
    'down_sales_dollars': down_sales_dollars,
    'up_ordered_units': up_ordered_units,
    'down_ordered_units': down_ordered_units
  }
  app.update_template_context(context)
  return render_template("compare_spreadsheets.html")

main() # if i don't put this here, main() doesn't ever run, and print("test") never shows up
       # but when I do run it like this, i get Error - AttributeError: 'NoneType' object has no attribute 'app'

For reference, I am trying to have python compare two excel files, then format the data on the frontend using d3js in graph form from my template file "compare_spreadsheets.html)

Thank you!

You've set up main as a Flask endpoint, so it will only work in the context of a Flask application when the URL it is defined for receives a request. You will need to configure a web app to run your Flask code, then you can make requests to the / endpoint in order to run the code in main. See https://help.pythonanywhere.com/pages/Flask/