Day 080 - Project 80 : Actually logging in!

Thanks, I forgot about that :smiley:

I take it back I’m on like day 40 so I don’t know any html or what flask is

from flask import Flask, request

app = Flask(__name__, static_url_path="/static")

@app.route('/login', methods=["POST"])
def prosess():
  page=""
  form = request.form
  if form["Username"] == "Gaurav291" and form["Password"] == "p23anther":
    page += """<html>
    <head>
    <title>Logged In</title>
    <link href="/static/Css/style_l.css" rel="stylesheet" >
    </head>
    <body>
    <h1>You are logged in </h1>
    </body>
    </html>"""
  elif form["Username"] == "Gaurav591" and  form["Password"] == "p23anther291": 
    page += """<html>
    <head>
    <title>Logged In</title>
    <link href="/static/Css/style_l.css" rel="stylesheet" >
    </head>
    <body>
    <h1>You are logged in </h1>
    </body>
    </html>"""
  elif form["Username"] == "Vinay291" and form["Password"] == "p23anther591":
    page += """<html>
    <head>
    <title>Logged In</title>
    <link href="/static/Css/style_l.css" rel="stylesheet" >
    </head>
    <body>
    <h1>You are logged in </h1>
    </body>
    </html>"""
  else:
    page += """<html>
    <head>
    <title>Logged In</title>
    <link href="/static/Css/style_r.css" rel="stylesheet" >
    </head>
    <body>
    <h1>Incorrect Passward and Username</h1>
    </body>
    </html>"""
  return page

@app.route('/')
def index():
  page = """<!DOCTYPE html>
<html>
  <head>
    <titl>Login Page</titl>
    <link href="/static/Css/style.css" rel="stylesheet">
  </head>
  <body>
    
    <h1>Login</h1>
    <form method="post" action="/login">
      <p>Username: <input type="text" name="Username" required></p>
      <p>Email: <input type="Email" name="Email"></p>
      <p>Password: <input type="Password" name="Password" required></p>
      <button type="submit">Login</button>
    </form>
  </body>
</html>"""
  return page

app.run(host="0.0.0.0", port="81")`

This Code can also be written in this form ( is this is right)

Yes, you can write the HTML inside main.py. Kind of unreadable imo though.

1 Like

Question: I have set up a Flask server with the correct app route and linked my HTML file with that correctly I beleive. still, the server is not running. Afaiu code is fine. Please guide me as I am beginner in programming


Repl link: https://replit.com/@mayankk985/Day80100Days#main.py

from flask import Flask, request

app = Flask(__name__)


@app.route("/process", methods=["POST"])
def process():
    form = request.form
    page = ""

    if form["baldies"] == "david":
        page += f"You're alright {form['username']}"
    else:
        page += f"You've picked wrong {form['username']}"
    return page


@app.route("/")
def index():
    page = ""
    f = open("index.html", "r")
    page = f.read()
    f.close()
    return page


app.run(host="0.0.0.0", port=81)

<!DOCTYPE html>
<html>
  
  <body>
  <form method = "post" action="/process">
    <p>Name: <input type="text" name="username" required> </p>
    <p>Email: <input type="Email" name="email"> </p>
    <p>Website: <input type="url" name="website"> </p>
    <p>Age: <input type="number" name="age"> </p>
    <p><input type="hidden" name="userID" value="232"> </p>

    <p>
      Fave Baldy: 
      <select name="baldies">
        <option value ='david'>David</option>
        <option value= 'luc'>Jean Luc Picard</option>
        <option value='yul'>Yul Brynner</option>
      </select>
    </p>

    <button type="submit">Save Data</button>
  </form>
  
  </body>
  </html>

Hi @mayankk985 interesting error message in your code (keep it SFW please, as per Replit Ask Community Standards). When I fork the Repl it works fine for me, asks for a username, email and password.

Do you still see the same error when you run your Repl?

2 Likes

Hey @IanAtCSTeach I am sorry about that msg,I was going crazy while debugging it, I didn’t notice that before posting the link here🙃. unfortunately it’s still not working. I don’t get any error message on console, however it not opening in webview or on browser. on the browser/ webview it says ’ It looks like day80100days.mayankk985.repl.co closed the connection’

Try using

app.run(host='0.0.0.0', port=8080) 

instead of port 81. Replit might be using the other ports.

1 Like

As far as I’m aware, pid1 (Replit’s init program, which is the only program that Replit runs inside repls that accepts TCP connections, other than a VNC server, which listens on port 5900 and is only started when graphical programs are used) currently only listens on the following addresses:

  • 127.0.0.1:8283
  • 0.0.0.0:22

If I missed any, feel free to edit this.

1 Like

It seems like your replit account doesn’t have a TLS certificate (for *.mayankk985.repl.co) right now, try waiting a while.

1 Like

After day 80 I tried to write a program where I used Pyjokes library with a simple form (to select the language), however once inside the form I’m struggling to make the “next one” (reload) button work. Could anyone help me, please? :pray:t2:

https://replit.com/@Sibelius11/Jokesa

I have managed to do the form by myself for a set of data for one user but had to look at the solution for the dictionary of data and still didn’t manage to get the return for login to say “Welcome {USER}” with the {USER} being from the form.user

I’m not sure what I’m missing in my solution. I’ve checked it and triple-checked it for pathway errors, extra commas, hidden capitals, missing indents, and all the rest but my process subroutine is not returning the messages in new webpages. Everything else works: the CSS and the HTML and the login subroutine, but there’s something about the process that’s off because realAccounts = True has a warning on it that says it’s defined by not locally used.

Anyways, here’s what I’m working with:

 from flask import Flask, request

app = Flask(__name__, static_url_path='/static')

accounts = {}

accounts["username1"] = {"email": "username1@gmail.com", "password": "password1"}
accounts["username2"] = {"email": "username2@gmail.com", "password": "password1"}
accounts["username3"] = {"email": "username3@gmail.com", "password": "password3"}


@app.route("/process", methods=["POST"])
def process():
  form = request.form
  
  realAccount = False
  details = {}
  try:
    details = accounts[form["username"]]
    realAccount = True
  except:
    return "Username, email, or password incorrect. Try again."
  if form["email"] == details["email"] and form["password"] == details["password"]:
    return "Login successful."
  else:
    return "Username, email, or password incorrect. Try again."
  

@app.route('/')
def login():
  css = "login.css"
  
  page = ""
  with open("static/html/login.html", "r") as f:
    page = f.read()

  page = page.replace("{css}", css)
  return page
  
app.run(host='0.0.0.0', port=81)

HTML:

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>My Website</title>
  <link href="/static/css/{css}" rel="stylesheet" type="text/css" />
</head>

<body>
  <h1>Login to your account</h1>
  <form method="post" action="/process">
    <p><label>Username: </label><input type="text" name="username" required></p>
    <p><label>Email: </label><input type="email" name="email" required></p>
    <p><label>Password: </label><input type="password" name="password" required></p>

    <button type="submit">Login</button>
  </form>
  
</body>

</html>

Anyone have an ideas?

Shouldn’t need to unless the error message tells you to

Wait what’s the actual warning?

Alright, after much troubleshooting—spending hours and hours messing with all parts of the code, defining additional subroutines to handle dafaulted get methods, pouring over developer tools’ network error messages, gnashing my teeth!—I finally found my answer. It turns out that all I had to do was bring the URL of the webpage out from within Replit’s web viewer tab and into my main browser…
:face_with_spiral_eyes:

Thanks, I’m realizing that slowly. I’m still fairly new to programming so all the back-end operations are a labyrinth to me (I couldn’t even tell you what I mean by that yet).

I ended up getting rid of the realAccount variable to no apparent detriment to my program, but the message was “local variable ‘realAccount’ is assigned to but never used.”

Replit displays a blank page when I use my form to login.
The console gives me the HTTP 405 status “Method not allowed”
I can’t seem to figure out what I’m doing wrong.

Here’s my main code:

from flask import Flask, request

users = {
    "Jim": "potat0",
    "Marc": "MarcIsCool",
    "Simon": "12345"
}

app = Flask(__name__)

@app.route("/login", methods=["POST"])
def login():
    # page = ""
    # file = open("home.html", "r")
    # page = file.read()
    # file.close()
    # form = request.form
    # print(form)
    # if form["username"] in users:
    #     if form["password"] == users[form["username"]]:
    #         page.replace("{message}", "Welcome home.")
    #     else:
    #         page.replace("{message}", "Wrong password.")
    # else:
    #     page.replace("{message}", "Wrong username.")
    # return page
    page = ""
    form = request.form
    print(form)
    if form["username"] in users:
        if form["password"] == users[form["username"]]:
            page = "Welcome home."
        else:
            page = "Wrong password."
    return page

@app.route('/')
def index():
    page = ""
    file = open("index.html", "r")
    page = file.read()
    file.close()
    return page

app.run(host='0.0.0.0', port=81)

And the index’s html:

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>replit</title>
</head>

<body>

<div style="display: grid; grid-gap: 10px grid-template-columns: 1fr 1fr 1fr">
    <div>
        .
    </div>
    <div style="display: grid; grid-gap: 10px; grid-template-rows: 1fr 1fr 1fr">
        <div>.</div>
        <div>
            <div style="border: 2px solid black; box-shadow: 3px 3px 3px; corner-radius: 25%;">
                <div style="text-align: center;">
                    <span style="font-size: 2em; font-weight: bold; color: #0F0F0">Welcome to Login.</span>
                    <form method="post" action="/login">
                    <table>
                        <tr>
                            <td>
                                Username: 
                            </td>
                            <td>
                                <input type="text" name="username" required>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                Password: 
                            </td>
                            <td>
                                <input type="password" name="password" required>
                            </td>
                        </tr>
                        <tr>
                            <td colspan=2><button type="submit">Login</button></td>
                        </tr>
                    </table>
                    </form>
                </div>
            </div>
        </div>
        <div>.</div>
    </div>
    </div>
    <div>
        .
    </div>

</div>

</body>

</html>

So after some good ol’ internet research, I’ve learned that my /login app.route needed to support the “GET” method as well. The tutorial only mentions “POST” for that bit.

Now that I’ve added “GET” to it, everything works fine.

@app.route("/login", methods=["GET", "POST"])
def login():
1 Like
from flask import Flask, request

app = Flask(__name__)

@app.route("/process", methods=["POST"])
def process():
  validNames = ['Bob01','Sara222','Canada']
  validPasswords = ['Nissan14', 'beautybay789', 'ricmatt1']

  page = ""
  form = request.form

  if form["username"] in validNames and form["password"] in validPasswords:
    page += "You are logged in."
  else:
    page += "Username, email or password incorrect."

  return page


@app.route('/')
def index():
  page = """<form method = "post" action="/process">
    <p>Name: <input type="text" name="username" required> </p>
    <p>Email: <input type="Email" name="email"> </p>
    <p>Password: <input type="password" name="password"> </p>
    <input type="hidden" name="userID" value="232"> </p>

    <button type="submit">Save Data</button>
  </form>


    """
  return page
app.run(host='0.0.0.0', port=81)

Hey @AmandaCunela13!

What seems to be the problem? Can you provide more information, like a link to your Repl?

1 Like