from flask import request is not working in my python Flask app

155 Views Asked by At

from flask import request is not working in my python Flask app I have compared the code multiple times to another Flask App that I have made that functions, yet I cannot find the problem.

This is the error that I get when I try to use the request.form function. enter image description here.

I am trying to use the request function of flask to submit a form and create a "request" in my database.

Here is my controller:

from flask_app import app
from flask import render_template, Flask, request
from flask_app.models.request_model import Request

# Create Request
@app.route('/request')
def request():
    page = 'request'
    print(request)
    return render_template('request.html', page = page)

@app.route('/request/create', methods = ['POST'])
def new_request():
    if not Request.validate(request.form):
        return redirect('/request')
    Request.create(request.form)
    return render_template('submission.html')

Here is my model:

from flask_app.config.mysqlconnection import connectToMySQL
from flask_app import DATABASE
from flask import flash #part of data validation
import re #regex access

EMAIL_REGEX = re.compile(r'^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9._-]+\.[a-zA-Z]+$') 

class Request:
    def __init__(self, data):
        self.id = data['id']
        self.first_name = data['first_name']
        self.last_name = data['last_name']
        self.email = data['email']
        self.phone = data['phone']
        self.message = data['message']
        self.created_at = data['created_at']
        self.updated_at = data['updated_at']

# create
    @classmethod
    def create(cls, data):
        query = "INSERT INTO requests (first_name, last_name, email, phone, message) VALUES (%(first_name)s, %(last_name)s, %(email)s, %(phone)s, %(message)s);"
        return connectToMySQL(DATABASE).query_db(query, data)


# get all requests
    @classmethod
    def get_requests(cls):
        query = "SELECT * FROM requests;"
        return connectToMySQL(DATABASE).query_db(query)


# validations
    @staticmethod
    def validate(request_data):
        is_valid = True
        if len(request_data['first_name']) < 2:
            flash("First name is required", "first_name")
            is_valid = False
        if len(request_data['last_name']) < 2:
            flash("Last name is required", "last_name")
            is_valid = False
        if len(request_data['email']) < 1:
            flash("Please provide email", "email")
            is_valid = False
        if len(request_data['message']) < 5:
            flash("Please tell us what you're interested in", "message")
        elif not EMAIL_REGEX.match(request_data['email']):
            flash("Invalid email", "reg")
            is_valid = False
        return is_valid

and here is the html:

        <!-- request form -->
        <form id="form" class="p-3 col-4 form" action="/request/create" method="POST">
            <label class="pt-2 text-dark form-label" for="first_name">First Name:*</label>
            {% for message in get_flashed_messages(category_filter = ['first_name']) %}
            <p class="text-danger">*{{message}}</p>
            {% endfor %}
            <input class="form-control" type="text" name="first_name" id="first_name">
            
            <label class="pt-2 text-dark form-label" for="last_name">Last Name:*</label>
            {% for message in get_flashed_messages(category_filter = ['last_name']) %}
            <p class="text-danger">*{{message}}</p>
            {% endfor %}
            <input class="form-control" type="text" name="last_name" id="last_name">
            
            <label class="pt-2 text-dark form-label" for="email">Email:*</label>
            {% for message in get_flashed_messages(category_filter = ['email']) %}
            <p class="text-danger">*{{message}}</p>
            {% endfor %}
            <input class="form-control" type="text" name="email" id="email">

            <label class="pt-2 text-dark form-label" for="phone">Phone:</label>
            <input class="form-control" type="text" name="phone" id="phone">

            <label class="pt-2 text-dark form-label" for="message">Message:*</label>
            {% for message in get_flashed_messages(category_filter = ['message']) %}
            <p class="text-danger">*{{message}}</p>
            {% endfor %}
            <textarea class="form-control" name="message" id="message" cols="30" rows="5"></textarea>

            <a href="/request">Clear</a>
            <button type="submit">Submit</button>

        </form>
1

There are 1 best solutions below

1
Detlef On

You have defined a function request and thus overlaid the import with the same identifier. Your request function does not have a form attribute, as the error message says.
Change the name of your first endpoint or import with an alias.