Flask GET-запрос не загружает страницу - PullRequest
0 голосов
/ 27 марта 2020

Добрый вечер. Я пытаюсь не дать пользователю зайти на мой сайт с reCaptcha v3. Тем не менее, шаблон для этого не загружается, несмотря на мои журналы отладки, показывающие, что запрос GET был отправлен, и страница была найдена:

соответствующие биты route.py

from flask import url_for, render_template, redirect, request, render_template_string
from flask import current_app as app
from .forms import *
from .filewriter import *
from .mailserver import *
from .rcvalidator import *
from flask_jsglue import JSGlue

jsglue = JSGlue(app)

@app.route('/', methods=('GET', 'POST'))
def home():
    reqform = ReqForm()
    delform = DelForm()
    error = 0
    if request.method == "POST":
        gtoken = request.json['gtoken']
        if not rc_form_valid(gtoken):
            print("working")
            return redirect(url_for('inv'))
    return render_template('home.html',
                           reqform=reqform,
                           delform=delform,
                           csrf_token=0,
                           errors=error)

@app.route('/invalid')
def inv():
    print("loaded inv")
    return render_template_string("get out now")

Печатается как «рабочий», так и «загруженный инв». В моем файле layout.py на сервер отправляется сообщение ajax JSON для предоставления токена R C:

layout. html

<!DOCTYPE html>

<html lang="en">

  <head>
    {{ JSGlue.include() }}
    {% include 'meta.html' %}
    {% block styles %}{% endblock %}
    <script src="https://kit.fontawesome.com/e3deaeba31.js" crossorigin="anonymous"></script>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script src="https://www.google.com/recaptcha/api.js?render=6LeRCuMUAAAAAEWkxJ1IsbM4h-RQbGuxDxCXmdtr"></script>
    <link href="https://fonts.googleapis.com/css?family=Poppins:200,300,500" rel="stylesheet">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
    <script>

      var csrftoken = $('meta[name=csrf-token]').attr('content')

      $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type)) {
                xhr.setRequestHeader("X-CSRFToken", csrftoken)
            }
          }
      })

      grecaptcha.ready(function() {
        grecaptcha.execute('secret token is here', {action: 'homepage'})
        .then(function(token) {
          //appending the token to the end of the form so that the thing can go in and submit the token in the background and find the number
          $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: Flask.url_for("home"),
            data: JSON.stringify({"gtoken":token}),
            })
        });
      });
    </script>
  </head>

  <body class="{{template}}">
    {% block content %}{% endblock %}
    {% block javascript %}{% endblock javascript %}
  </body>

</html>

meta. html предоставляет соответствующие переменные.

Журналы:

 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 502-140-539
127.0.0.1 - - [26/Mar/2020 16:21:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [26/Mar/2020 16:21:02] "GET /jsglue.js HTTP/1.1" 200 -
{'success': True, 'action': 'homepage', 'hostname': 'localhost', 'score': 0.9, 'challenge_ts': 'xxxxx'}
working
127.0.0.1 - - [26/Mar/2020 16:21:03] "POST / HTTP/1.1" 302 -
loaded inv
127.0.0.1 - - [26/Mar/2020 16:21:03] "GET /invalid HTTP/1.1" 200 -

Журналы заканчиваются здесь, и страница такая же. Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Мне удалось заставить это работать после оооочень долго. Из-за асинхронного характера AJAX перенаправления не загружаются после выполнения вызова AJAX. Что вам нужно сделать, это добавить строку успеха в сообщение AJAX JSON, в котором будет указано

success: function(response) {window.location.href = response.redirect}

, а затем в flask при обработке запрос в функции, вы просто возвращаете JSON с атрибутом redirect:

return jsonify({'redirect': url_for("success")})

0 голосов
/ 27 марта 2020

Если вы заходите на ваш сайт с GET-запросом, условие if method == 'POST' ложно, все команды в if игнорируются. Следующая команда должна отобразить шаблон home. html, который наблюдается.

Возможно, вы хотите перенаправить на свой веб-сайт после того, как клиент отправил запрос POST, и он был проверен?

@app.route('/', methods=('GET', 'POST'))
def home():
    reqform = ReqForm()
    delform = DelForm()
    error = 0
    if request.method == "POST":
        gtoken = request.json['gtoken']
        if not rc_form_valid(gtoken):
            print("working")
            return redirect(url_for('inv'))
        else:
            return redirect(url_for('main_website'))

    return render_template('home.html',
                           reqform=reqform,
                           delform=delform,
                           csrf_token=0,
                           errors=error)
...