#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-файла.