maz
maz

Reputation: 37

Logging into an external website with flask

I'm currently having some trouble with my flask webapp, where I have written it as below, but when I try to run the flask app, I run into a Bad Request Error. (The browser (or proxy) sent a request that this server could not understand)

Essentially, I am trying to allow users to log in to an external website through the flask webapp

What is the cause of this error? Apologies if I am making a stupid mistake, I'm very new to flask.

from flask import Flask,render_template, request, redirect
import requests
from bs4 import BeautifulSoup as bs


app = Flask(__name__)

@app.route('/', methods = ["POST", "GET"])
def login():
    username = request.form['username']
    pin = request.form['password']
    s = requests.Session()
    r = s.get("https://www.example.com/User/Login")
    soup = bs(r.text, 'html.parser')
    loginToken = soup.findAll(attrs={"name" : "__RequestVerificationToken"})[0]['value']
    #Create Login Payload
    login_payload = {
    "__RequestVerificationToken" : loginToken,
    "UserName" : username,
    "Password" : pin,
    "returnUrl" : "https://example.com/user-action/?action=login&returnUrl=https://www.example.com/User/Information",
    }
    #Post Login Payload
    r = s.post("https://www.example.com/Account/Login", data = login_payload)
    if r.status_code == 200:
        return render_template('home.html')
    else:
        return render_template('login.html')
    return render_template('login.html')

@app.route('/home') #If login works, redirect to this page
def hello_world():
    return 'Hello, World!'


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

In addition, if there are other resources that I could refer to with regards to allowing a user to log in to a external URL from the flask webapp as compared to the conventional tutorials that only show a user logging in to the flask webapp itself, do share it with me, thank you!

Upvotes: 0

Views: 846

Answers (1)

MertG
MertG

Reputation: 763

Your endpoint' s has two Http verbs ["POST", "GET"]. You should specify your methods as below.

@app.route('/', methods = ["POST", "GET"])
def login():
   if request.method == "GET":
     #something do stuff
     return render_template("your_html_page")
   if request.method == "POST":
     #something do stuff
     return your_response, 200

Edited Block

@app.route('/', methods = ["POST", "GET"])
def login():
    if request.method == "GET":
        return render_template('login.html')
    if request.method == "POST":
        #same logic here
        if status_code == 200:
            return redirect(url_for('home'))
        return render_template('login.html')

Upvotes: 1

Related Questions