-1

I'm trying to make a database with two linked tables Info and User, I also want to be able to post to the database online, whenever I run the code below, after I click submit on my index page, I get given an error : 'The method is not allowed for the requested URL.', and nothing is posted into my database. Im new to python and SQLAlchemy, so I'm unsure where the error is occurring. This is my python code:

from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import relationship, backref, sessionmaker
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:////Users/me/attempt1/attempt.db"
app.debug = True
db = SQLAlchemy(app)
engine = create_engine('sqlite:////Users/me/attempt1/attempt.db')
connection = engine.connect()
Base = declarative_base()
session = sessionmaker(bind=engine)


class Info(Base):
    __tablename__ = 'info'
    id = Column(Integer, primary_key=True)
    username = Column(String(80), unique=True, nullable=False)
    age = Column(Integer, nullable=False)
    country = Column(String(120), nullable=False)


class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    email = Column(String(225), unique=True, nullable=False)
    username = relationship('Info', backref=backref('users', lazy='True'))
    password = Column(String(225), nullable=False)

# this will be the home page


Base.metadata.create_all(engine)

session = session()


@app.route('/')
def index():
    return render_template('dashboard.html')


# sign up page


@app.route('/signup', methods=['POST'])
def signup():
    info = Info(request.form['username'], request.form['age'], request.form['country'])
    user = User(request.form['email'], request.form['password'])
    session.add(info)
    session.add(user)
    session.commit()
    return redirect(url_for('login'))


@app.route('/login')
def login():
     return 'You are now logged in'


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

this is my html code for dashboard.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Sign Up Today</title>
</head>
<body>
        <form method ="signup" action="/signup">
            <label>Email:</label>
            <input id="email" name="email" type="text"/>
            <label>Username:</label>
            <input id="username" name="'username" type="text"/>
            <label>Password:</label>
            <input id="password" name="password" type="'text"/>
            <label>Age:</label>
            <input id="'age" name="age" type="text"/>
            <label>Country:</label>
            <input id="country" name="country" type="text"/>
            <input type="submit"/>
        </form>

 </body>
 </html>
1
  • the form method must be post. Commented Feb 16, 2018 at 12:40

2 Answers 2

1

Your form method should be "post".

<form method="post" action="/signup">
Sign up to request clarification or add additional context in comments.

Comments

0

Make your method post in template

<form method="post" action="/signup">
<!--   -->
</form>

You forgot to create form as well.

class UserForm(Form):
    username = StringField("User Name")
    age = IntegerField("Enter Age")
    # add more fields

Inside the view validate your form first also

@app.route('/signup', methods=['POST'])
def signup():
    form = UserForm()
    if form.validate_on_submit():
        user_data = {
            username = form.username.data,
            age = form.age.data,
            # so on
        }
        session.add(user_data) 
        session.commit()
     return redirect(url_for('login'))
 return render_template('dashboard.html', form=form)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.