Swaroop
Swaroop

Reputation: 109

Python global variable not updating in real time flask

value=user_id is not taking the new value defined by def login():.for e.g. if the entered user_id from HTML page is 200, 300 and 100. The values will be assigned as 0, 200, 300. That is, when home page is displayed it will be showing user 0 for entered value 200, and for second time it is showing 200 for entered value 300 and for third time it is showing 300 for entered value 100. I need a real time values i.e. for entered value 200 home page should have value 200, and for 300 it should be 300. Could anyone please help me with this? Please advice. Thanks in advance. Note: HTML code is not optimized.

from flask import Flask, render_template  # Flask is the class within the flask library
from flask import request, redirect


user_id = int(0)
app = Flask(__name__)  # Instance of the object Flask. __name__: this  gets value of name of python script


@app.route('/', methods=["GET", "POST"])  # login page
def login():
    if request.method == "POST":
        global user_id
        user_id = request.form['userid']
        print(user_id)
    return render_template("login.html")


@app.route('/home/')  # This the URL i.e. home page
def home():
    return render_template("home.html", value=user_id)

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

HTML Code for Login page here.

    <!DOCTYPE html>
<html>
  <head>
      <title>Recommender System App</title>
      <link rel="stylesheet" type="text/css"  href="{{url_for('static',filename='css/main.css')}}">
  </head>
  <body>
    <header>
      <div class="container">
        <h1 class="logo">Movie Recommender System</h1>
        <strong><nav>
          <ul class="menu">
            <a href="{{ url_for('login') }}"></a>
          </ul>
        </nav></strong>
      </div>
    </header>
    <form action="{{ url_for('login') }}" method="post">
     <div class = "Login Fields">
             <b>Username:</b>  <input type="number" placeholder="Numbers only" name='userid'>
             <p><b>Password:</b> <input type="password" placeholder="Enter Password" name= 'password' id="pwd"></p>
      &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
      <input type="submit" onclick="check(this.form)" class="button">
     </div>
        <p></p>
        <p></p>
        <div>
            <p>Test User IDs:</p>
            <li>224</li>
            <li>216</li>
            <li>681</li>
            <li>19</li>
            <li>82</li>
            <li>305</li>
            <li>44</li>
            <li>268</li>
            <p>Password: 123Swaroop</p>
        </div>
    </form>

  <script language="javascript">
    function check(form)/*function to check userid & password*/
    {
        if(form.password.value == "123Swaroop")
        {
            window.open(href = "{{ url_for('home') }}")
        }
        else
        {
            alert("Wrong Password or User Id")/*displays error message*/
        }
    }
   </script>
  </body>
</html>

HTML code for home page here:

<!DOCTYPE html>
<html>
  <head>
      <title>Home</title>
      <link rel="stylesheet" type="text/css"  href="{{url_for('static',filename='css/main.css')}}">
  </head>
    <body>
        <header>
            <div class="container">
            <h1 class="logo">Welcome User: {{ value }}</h1>
        <strong><nav>
            <ul class="menu">
            <a href="{{ url_for('home') }}"></a>
            </ul>
        </nav></strong>
            </div>
        </header>
        <div class = "home">
            <h1>Top Rated Movies</h1>
            <p>This is test website</p>
        </div>
    </body>
</html>

Upvotes: 0

Views: 4453

Answers (1)

Montmons
Montmons

Reputation: 1436

You also need to call the global value within your home() function:

from flask import Flask, render_template, request, redirect  


user_id = int(0) 
app = Flask(__name__)  

@app.route('/', methods=["GET", "POST"])
def login():
    if request.method == "POST":
        global user_id
        user_id = request.form['userid']
        print(user_id)
    return render_template("login.html")


@app.route('/home/')  
def home():
    global user_id
    return render_template("home.html", value=user_id)

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

However, using global variables is usually considered bad practice so you could also consider something like this:

from flask import Flask, render_template, request, redirect  

    app = Flask(__name__)  

    @app.route('/', methods=["GET", "POST"])
    def login():
        return render_template("login.html")

    def get_user_id():
        try:
            if request.method == "POST":
                user_id = request.form['userid']
                return user_id
            else:
                # Handle error or do something else
        except:
            # Handle error or do something else

    @app.route('/home/')  
    def home():
        try:
            return render_template("home.html", value=get_user_id())
        except:
            # Handle error or do something else

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

Upvotes: 1

Related Questions