Получение ошибки 404 с помощью Flask после входа в Discord Oauth

#python #flask

#python #flask

Вопрос:

Я создаю бота Discord с панелью мониторинга. Однако, когда я вхожу в систему с учетной записью discord в Oauth, и она перенаправляется на login.html , отображается ошибка 404.

Код (main.py ):

 from flask import Flask, render_template, request, session
from oauth import Oauth

app = Flask(__name__)
app.config["SECRET_KEY"] = "PRIVATE"


@app.route("/")
def home():
    return render_template("index.html", discord_url=Oauth.discord_login_url)


@app.route("/")
def login():
    code = request.args.get("code")

    at = Oauth.get_access_token(code)
    session["token"] = at

    user = Oauth.get_user_json(at)
    user_name, user_id = user.get("username"), user.get("discriminator")

    return render_template("login.html", username=user_name, userdiscrim=user_id)


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

Код (oauth.py ):

 import requests

class Oauth:
    client_id = "SECRET"
    client_secret = "SECRET"
    redirect_uri = "http://127.0.0.1:5000/login.html"
    scope = "guilds identify email"
    discord_login_url = "SECRET"
    discord_token_url = "https://discord.com/api/oauth2/token"
    discord_api_url = "https://discord.com/api"
 
    @staticmethod
    def get_access_token(code):
        payload = {
            "client_id": Oauth.client_id,
            "client_secret": Oauth.client_secret,
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": Oauth.redirect_uri,
            "scope": Oauth.scope
        }
 
        access_token = requests.post(url=Oauth.discord_token_url, data=payload).json()
        return access_token.get("access_token")

    @staticmethod
    def get_user_json(access_token):
        url = f"{Oauth.discord_api_url}/users/@me"
        headers = {"Authorization": f"Bearer {access_token}"}
 
        user_object = requests.get(url=url, headers=headers).json()
        return user_object
 

Дерево:

Дерево

index.html работает

login.html не делает

Ответ №1:

Вы / дважды определяете маршрут в своем коде, и для вашего redirect_uri in Oauth установлен URL, который не существует, поэтому Flask отвечает 404.

Установите маршрут для вашей функции входа в систему на /login :

 @app.route("/login")
def login():
    code = request.args.get("code")

    at = Oauth.get_access_token(code)
    session["token"] = at

    user = Oauth.get_user_json(at)
    user_name, user_id = user.get("username"), user.get("discriminator")

    return render_template("login.html", username=user_name, userdiscrim=user_id)
 

Затем установите значение redirect_uri в вашем Oauth классе на http://127.0.0.1:5000/login вместо http://127.0.0.1:5000/login.html

Комментарии:

1. Спасибо! Это очень помогло. Итак, чтобы уточнить, является ли /login каталогом, а шаблон не имеет ничего общего с каталогом?

2. В Flask вы не получаете доступ к HTML-файлам напрямую 127.0.0.1:5000/login.html , вместо этого вы пишете маршруты, которые отображают указанный HTML-файл для браузера. В моем коде /login есть маршрут, который отображает login.html ( return render_template(...) ) , маршрут может быть чем угодно (например /my-route ), он вообще не зависит от имени вашего HTML-файла.