Ошибка Flask: «Метод не разрешен. Метод не разрешен для запрошенного URL» (вход и домашняя страница)

@app.route("/")
@app.route("/home",methods=['GET', 'POST'])
def home():
if current_user.is_authenticated:
    posts=mongo.db.articles
    #allpost=posts.find().limit(5)
    it=current_user.user_json['interest']
    allpost=posts.find( {'NewsType': it } ).limit(10)
    #flash(session['email'])

    return render_template('home.html', posts=allpost)
return render_template('login.html', title='Login',form=LoginForm()) 

Это мой код для домашней страницы

@app.route("/login", methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
    return redirect(url_for('home'))
form = LoginForm()
if form.validate_on_submit():
    users = mongo.db.users
    loginuser_json = users.find_one({'email': form.email.data})
    if loginuser_json and bcrypt.check_password_hash(loginuser_json['password'], form.password.data):
        # Create a custom user and pass it to login_user:
        loginuser = User(loginuser_json)
        login_user(loginuser,duration=d)
        next_page = request.args.get('next')
        return redirect(next_page) if next_page else redirect(url_for('home'))
        return redirect(url_for('home'))
    else:
        flash('Login Unsuccessful. Please check username and password', 'danger')
return render_template('login.html', title='Login', form=form)

и это для маршрута входа

Когда я пишу localhost: 5000 в браузере, он открывает страницу входа (потому что, если пользователь не аутентифицирован, он должен сначала перейти на страницу входа)

Но когда я пытаюсь войти в систему с этой страницы, появляется ошибка «Метод не разрешен. Метод не разрешен для запрошенного URL».

Что я должен делать

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
2 802
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем коде неясно, какой код вызывается, когда используется метод GET (обычно при рендеринге вашей страницы входа), а какой должен вызываться, когда метод - POST (вызывается при отправке формы). Чтобы убрать путаницу, сделайте это в своем логине

@app.route("/login", methods=['GET', 'POST'])
def login():
    # code that runs for both GET and POST goes here
    if request.method == 'POST':
        if form.validate_on_submit():
            #authenticate user and redirect to next page/home page
    return render_template('login.html', title='Login', form=form) #this runs when method is get

Обратите внимание на отступ и соответствующий код, работающий под ним.

ПРИМЕЧАНИЕ в вашем шаблоне входа, убедитесь, что метод формы публикует что-то вроде этого

<form method=post>
  <dl>
    {{ render_field(form.email) }}
    {{ render_field(form.password) }}
    {{form.hidden_tag()}} 
  </dl>
  <input type=submit value=Submit>
</form>

Наконец, на вашей домашней странице у вас есть два маршрута, которые образуют url_for (home) - хотя я не думаю, что это причина вашей ошибки - убедитесь, что оба они принимают метод POST, если вы собираетесь использовать его там

@app.route("/",methods=['GET', 'POST'])#add post on this route
@app.route("/home",methods=['GET', 'POST'])
def home():

Надеюсь, это поможет вам разобраться с ошибкой

Также я бы рекомендовал заменить return render_template ('login.html' ....) в домашней функции на другое перенаправление возврата для входа в систему. По крайней мере, я думаю, что это должно произойти там.

gittert 31.12.2018 21:20

Большое спасибо за рекомендации и помощь

adnan 01.01.2019 11:00

@adnan, добро пожаловать, если ответ решает проблему, и вы не забываете принять его, в противном случае сообщите нам, если вам потребуется дополнительная помощь

Moses N. Njenga 01.01.2019 19:37

Да, ответ решит мою проблему. Я принял его, но там написано, что ваш ответ записан, но не отображается, потому что у меня меньше 15 очков репутации.

adnan 02.01.2019 05:35

@adnan Accepting - это щелчок по серой галочке между голосами за и против. Только голоса за и против требуют большей репутации. (И вы получаете репутацию 2, когда принимаете ответ)

Moses N. Njenga 02.01.2019 05:58

Другие вопросы по теме