flask накопление необходимого логина fla sh сообщений на хроме - PullRequest
0 голосов
/ 28 мая 2020

Я использую Python Flask для создания веб-сайта, включая несколько вызовов ajax, которые обновляют индикатор выполнения. Тем не менее, проблема возникает, особенно в Chromium (явно не возникает в firefox, safari или IE).

В Chromium, похоже, постоянно нарастает «мигающий» messages "из диспетчера входа в систему, говоря" Пожалуйста, войдите в систему, чтобы получить доступ к этой странице. ", даже для страниц, которые не используют декоратор @login_required. Вот как это выглядит:

enter image description here

Этот конкретный c снимок был сделан на странице входа, на которой нет декоратора @login_required. Вот функция просмотра:

@bp.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('main.index'))
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user is None or not user.check_password(form.password.data):
            flash('Invalid username or password')
            return redirect(url_for('auth.login'))
        login_user(user, remember=form.remember_me.data)
        next_page = request.args.get('next')
        if not next_page or url_parse(next_page).netloc != '':
            next_page = url_for('main.index')
        return redirect(next_page)
    return render_template('auth/login.html', title='Sign In', form=form)

Вот страница входа html:

{% extends 'base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}

{% block app_content %}

    <h1 style="color:white">Sign In</h1>
    <div class="row" style="color:white">
        <div class="col-md-4">
            {{ wtf.quick_form(form) }}
        </div>
    </div>
    <br>
    <p style="color:white">
        Forgot Your Password?
        <a href="{{ url_for('auth.reset_password_request') }}">Click to Reset It</a>
    </p>
    <p style="color:white">New User? <a href="{{ url_for('auth.register') }}">Click to Register!</a></p>
{% endblock %}

А вот «base. html», откуда я подозреваю, что проблема. Вы заметите внизу функцию AJAX, которая обновляется каждую секунду. При запуске страницы эти мигающие поля входа накапливаются, поэтому, когда я обновляю sh страницу через 30 секунд, появляются 30 из этих полей. Когда я обновляю sh страницу через 60 секунд, появляются 60 полей, et c, все с class = "alert alert-info" .

{% block content %}
    <div class="container">
    {% if current_user.is_authenticated %}
        {% with tasks = current_user.get_tasks_in_progress() %}
        {% if tasks %}
            {% for task in tasks %}
            <div class="alert alert-success" role="alert">
                {{ task.description }}
                <span id="{{ task.id }}-progress"></span>
            </div>
            {% endfor %}
        {% endif %}
        {% endwith %}
        {% endif %}
        {% with messages = get_flashed_messages() %}
        {% if messages %}
            {% for message in messages %}
            <div class="alert alert-info" role="alert">{{ message }}</div>
            {% endfor %}
        {% endif %}
        {% endwith %}

        {# application content needs to be provided in the app_content block #}
        {% block app_content %}{% endblock %}
    </div>
{% endblock %}

{% block scripts %}
    {{ super() }}
    {{ moment.include_moment() }}
    <script>
       function set_task_progress(task_id, progress) {
            $('#' + task_id + '-progress').text(progress);
        }
        function set_task_popup (notification_data){
                switch(notification_data.progress) {
                    case 1:
                        set_task_progress(notification_data.task_id, 'Stage 1')
                        break;
                    case 2:
                        set_task_progress(notification_data.task_id, 'Stage 2')
                        break;
                    case 3:
                        set_task_progress(notification_data.task_id, 'Stage 3')
                        break;
                    case 0:
                        set_task_progress(notification_data.task_id, 'Finished!')
                        break;
                    }
                }

        {% if current_user.is_authenticated %}
        $(function() {
            var since = 0;
            setInterval(function(){
                    $.ajax('{{ url_for('main.notifications') }}?since=' + since).done(
                    function(notifications) {
                        for (var i = 0; i < notifications.length; i++)
                        {
                            set_task_popup(notifications[i].data);
                            since = notifications[i].timestamp;
                        }})}, 1000);
        });
        {% endif %}
    </script>
{% endblock %}

Мой главный вопрос is - почему это происходит только для Chromium? Это проблема с моим кодом или браузером? Я предполагаю, что первое более вероятно, и если да, как я могу исправить это? Спасибо.

...