首页 > 解决方案 > 使用烧瓶登录外部网站

问题描述

我目前在使用烧瓶 webapp 时遇到了一些问题,我将其编写如下,但是当我尝试运行烧瓶应用程序时,我遇到了错误请求错误。(浏览器(或代理)发送了此服务器无法理解的请求)

本质上,我试图让用户通过烧瓶 webapp 登录到外部网站

这个错误的原因是什么?抱歉,如果我犯了一个愚蠢的错误,我对烧瓶很陌生。

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)

此外,如果与仅显示用户登录到flask webapp本身的传统教程相比,我可以参考其他资源来允许用户从flask webapp登录到外部URL,请执行分享给我,谢谢!

标签: pythonpython-3.xauthenticationflaskpython-requests

解决方案


您的端点有两个 Http 动词["POST", "GET"]。您应该如下指定您的方法。

@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

编辑块

@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')

推荐阅读