405 Метод не разрешен, метод = ["POST", "GET"] не работает - PullRequest
0 голосов
/ 21 апреля 2020

Я учусь на уроке flask онлайн и смотрю видео на POST и GET. Одним из упражнений является запуск простой отправки формы, возвращающей имя пользователя в новом @ app.route (). Я попытался добавить пароль и имя пользователя, чтобы попытаться смоделировать вход в систему, потому что я думал, что я крутой, но не удалось. Код ниже.

from flask import Flask, redirect, url_for, render_template, request

app = Flask(__name__)


realUser: str = "name"
realPass: str = "pass"


@app.route("/")
def home():
    return render_template("extension.html")


@app.route("/login", methods=["POST", "GET"])
def login():
    if request.method == "POST":
        user = request.form["un"]
        password = request.form["password"]
        if realUser == user and password == realPass:
            return redirect(url_for("user", usr=user))
    else:
        return render_template("extension.html")


@app.route("/<usr>")
def user(usr):
    return f"<h1>{usr}</h1>"


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

расширение. html:

{% extends "ThePurpleLounge.html" %}
{% block title %}Home Page{% endblock %}
{% block content %}
    <h1>Login</h1>
<form method="post">
    <p>Name:</p>
    <p><input type="text" name="un" /></p>

    <p>Password:</p>
    <p><input type="text" name="password" /></p>
    <p><input type="submit" value="submit" /></p>
</form>
{% endblock %}

ThePurpleLounge. html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {% block content %}
    {% endblock %}
</body>
</html>

Я даже пытался упростить свой код to:

from flask import Flask, redirect, url_for, render_template, request

app = Flask(__name__)


@app.route("/")
def home():
    return render_template("extension.html")


@app.route("/login", methods=["POST", "GET"])
def login():
    if request.method == "POST":
        user = request.form["un"]
        return redirect(url_for("user", usr=user))
    else:
        return render_template("extension.html")


@app.route("/<usr>")
def user(usr):
    return f"<h1>{usr}</h1>"


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

Тем не менее, он по-прежнему говорит 405 Метод не разрешен. Учебное пособие вошло прямо в код, поэтому, возможно, мне придется что-то установить или настроить.

1 Ответ

0 голосов
/ 21 апреля 2020

В @app.route("/") вы не разрешаете метод POST. Поэтому, когда вы пытаетесь отправить форму с URL http://127.0.0.1: 5000 / , сервер отклоняет ее. Но если вы исправите эту проблему, вы столкнулись с другой проблемой: вы реализовали метод входа по другому URL-адресу (@app.route("/login", methods=["POST", "GET"])).

Вот рабочая модификация вашего кода (/ перенаправляет на /login)

from flask import Flask, redirect, url_for, render_template, request

app = Flask(__name__)


realUser: str = "name"
realPass: str = "pass"


@app.route("/")
def home():
    return redirect(url_for("login"))


@app.route("/login", methods=["POST", "GET"])
def login():
    if request.method == "POST":
        user = request.form["un"]
        password = request.form["password"]
        if realUser == user and password == realPass:
            return redirect(url_for("user", usr=user))
    else:
        return render_template("extension.html")


@app.route("/<usr>")
def user(usr):
    return f"<h1>{usr}</h1>"


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

Этот код интересен для понимания работы flask. Чтобы узнать немного подробнее о методах аутентификации go, вам следует взглянуть на Flask HTTP Basicauth - Как это работает? .

...