405 Method Not Allowed Error on POST Request to Flask Endpoint

I’m encountering a 405 Method Not Allowed error when making a POST request to the /generate endpoint in my Flask application. I’ve ensured that the endpoint is configured to handle POST requests, but the error persists.

Here are the details:

Flask Application (app.py):

from flask import Flask, request, jsonify, render_template, send_from_directory
from flask_cors import CORS
import openai
import logging
import os
import pdfplumber
import docx

# Set up logging
logging.basicConfig(level=logging.INFO)

# Initialize Flask app
app = Flask(__name__, static_folder='frontend', template_folder='frontend')

# Allow CORS for all routes by default with credentials
CORS(app, resources={r"/*": {"origins": "*", "supports_credentials": True}})

# Load OpenAI API key directly
openai.api_key = 'YOUR_OPENAI_API_KEY'  # Replace 'YOUR_OPENAI_API_KEY' with your actual OpenAI API key

# Set the upload folder
UPLOAD_FOLDER = 'uploads'
if not os.path.exists(UPLOAD_FOLDER):
    os.makedirs(UPLOAD_FOLDER)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

# Serve the index.html file
@app.route('/')
def index():
    return render_template('index.html')

# Serve static files (CSS, JS, etc.)
@app.route('/<path:filename>')
def serve_static(filename):
    return send_from_directory(app.static_folder, filename)

# Generate lesson plan
@app.route('/generate', methods=['POST'])
def generate():
    data = request.json
    lcontent = data.get('lcontent', '')
    grade_level = data.get('grade_level')
    learning_outcomes = data.get('learning_outcomes')
    student_count = data.get('student_count')
    learning_styles = data.get('learning_styles')
    technology = data.get('technology')
    prerequisite_skills = data.get('prerequisite_skills')
    duration = data.get('duration')
    additional_instructions = data.get('additional_instructions')

    if not (grade_level and learning_outcomes and student_count and learning_styles and technology and prerequisite_skills and duration and additional_instructions):
        return jsonify({'error': 'All fields are required'}), 400

    lesson_plan = generate_lesson_plan(lcontent, grade_level, learning_outcomes, student_count, learning_styles, technology, prerequisite_skills, duration, additional_instructions)
    return jsonify({'lesson_plan': lesson_plan})

# Other endpoints and functions...

if __name__ == '__main__':
    app.run(debug=True)

JavaScript Code:

$(document).ready(function () {
    function generateLessonPlan() {
        console.log("generateLessonPlan called");
        const form = $('#lessonPlanForm');
        if (form[0].checkValidity() === false) {
            form.addClass('was-validated');
            return;
        }

        const lessonPlanData = {
            grade_level: $('#grade_level').val(),
            learning_outcomes: $('#learning_outcomes').val(),
            student_count: $('#student_count').val(),
            learning_styles: $('#learning_styles').val(),
            technology: $('#technology').val(),
            prerequisite_skills: $('#prerequisite_skills').val(),
            duration: $('#duration').val(),
            additional_instructions: $('#additional_instructions').val()
        };

        console.log("Collected data:", lessonPlanData);
        showLoadingSpinner();

        $.ajax({
            type: 'POST',
            url: '/generate',
            contentType: 'application/json',
            data: JSON.stringify(lessonPlanData),
            success: function (response) {
                $('#lesson-plan').text(response.lesson_plan);
                localStorage.setItem('lessonPlanContent', response.lesson_plan);
                hideLoadingSpinner();
            },
            error: function (xhr, status, error) {
                console.error('Error generating lesson plan:', error);
                alert('Error generating lesson plan: ' + error);
                hideLoadingSpinner();
            }
        });
    }

    $('#generateButton').click(generateLessonPlan);
});

Error Details:

When I make a POST request to the /generate endpoint, either via the frontend or using curl, I receive a 405 Method Not Allowed error.

Log Output:

2024-06-09T12:36:28.631907+00:00 heroku[router]: at=info method=POST path="/generate" host=oecslearning-4a5f5abe2dbb.herokuapp.com request_id=73785910-8ef9-4c37-9ee6-56686ed171c2 fwd="69.80.2.203" dyno=web.1 connect=0ms service=1ms status=405 bytes=712 protocol=https

Environment:

  • Flask Version: 1.1.2
  • jQuery Version: 3.5.1
  • Running on: Heroku

Request:

Could someone help me identify what might be causing the 405 error and how to resolve it? Any insights or suggestions would be greatly appreciated.

What I’ve Tried:

  1. Verified that the /generate endpoint is correctly configured to handle POST requests.
  2. Checked the URL and ensured it matches the endpoint.
  3. Tested the endpoint using curl and received the same error:
    curl -X POST http://127.0.0.1:5000/generate 
    -H "Content-Type: application/json" 
    -d '{"lcontent": "Sample content", "grade_level": "5", "learning_outcomes": "Understand key concepts", "student_count": 30, "learning_styles": "Visual, Auditory", "technology": "Computers, Projectors", "prerequisite_skills": "Basic Math, Reading", "duration": "60 minutes", "additional_instructions": "Use interactive activities"}'