[FIXED] python flask session , login and index not working

Issue

I have a python flask app with login module implemented using extension python flask. In my login method.

The Error Message

enter image description here

app.py

# import the Flask class from the flask module
from flask import Flask, render_template, redirect, url_for, request, session

# create the application object
app = Flask(__name__)
app.secret_key = "hello"

# use decorators to link the function to a url
#@app.route('/')
#def home():
 #   return "Hello, World!"  # return a string

@app.route('/index', methods=['GET'])
def index():
    if session.get ('username'):
        return render_template('index.html')
    else:    
        return render_template('login.html')  # render a template

# route for handling the login page logic
@app.route('/', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] != 'admin' or request.form['password'] != 'admin':
            error = 'Invalid Credentials. Please try again.'  
        else:    
         session['username'] = True
         return redirect(url_for('index'))
    return render_template('login.html', error=error)


# start the server with the 'run()' method
if __name__ == '__main__':
    app.run(debug=True)

login page
login.html

<html>
  <head>
    <title>Flask Intro - login page</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
  </head>
  <body>
    <div class="container">
      <h1>Please login</h1>
      <br>
      <form action="" method="post">
        <input type="text" placeholder="Username" name="username" value="{{
          request.form.username }}">
         <input type="password" placeholder="Password" name="password" value="{{
          request.form.password }}">
        <input class="btn btn-default" type="submit" value="Login">
      </form>
      {% if error %}
        <p class="error"><strong>Error:</strong> {{ error }}</p>
      {% endif %}
    </div>
  </body>
</html>

index.html

<DOCTYPE Html>
    <html>
    <head>
    <tile>Addressing a Site</tile>
    </head>
    <body>
    <address>welcome.</address>
    </body>
    </html>

i am trying to create a session between login and index page,just getting started with python flask framework, login session not working well.

Solution

It seems like you are actually having an issue with the methods rather than the session not working.

The Method Not Allowed error means that you are sending a GET/POST request to a page that does not accept that type of request.

Try changing the start of your login form to this

<form action="{{ url_for('login') }}" method="POST">

I just got it running on my computer and this works, the reason it did not work before was because the form was sending the post request to the /index route, which only accepts GET request.

Also, I noticed something else you may want to change.

You currently have this on your index route

if session.get ('username'):
        return render_template('index.html')
    else:    
        return render_template('login.html') 

But it would be better to change that to this

if session.get ('username'):
        return render_template('index.html')
    else:    
        return redirect(url_for('login'))

That way the user is sent back to the login page rather than just being shown the login template from the index page.

I hope all of that helps.

Answered By – MarcusWilliams

Answer Checked By – Mildred Charles (Easybugfix Admin)

Leave a Reply

(*) Required, Your email will not be published