Я пытаюсь научить себя Flask, но я пытаюсь понять, что я не могу отображать даты, используя момент колбы с Safari (13.0.2). Они отображаются нормально в Chrome. Ниже приведено минимальное приложение, демонстрирующее такое поведение.
У меня недостаточно опыта работы с веб-разработчиком, чтобы определить, является ли это ошибкой в flask-момент, ошибкой в moment.js, ошибкой в jQuery илипросто недоразумение, которое я мог бы исправить с небольшим изменением где-нибудь. Я попытался отредактировать разметку, которая отправляется в браузер, но мне там не повезло. В частности, я изменил атрибут «display: none» на «display: inline», но это привело к отображению неформатированных временных меток, а не форматированных дат (я думаю, это лучше, чем ничего вообще?).
С другой стороны, работающий минимальный пример javascript показывает, что это не проблема moment.js / Safari как таковая, но я думаю, что это как-то связано с магией jQuery / bootstrap, происходящей за кулисами.
main.py:
from flask_bootstrap import Bootstrap
from flask_moment import Moment
from flask import Flask, render_template
from datetime import datetime
app = Flask(__name__)
bootstrap = Bootstrap(app)
moment = Moment(app)
@app.route('/')
def index():
return render_template('index.html', current_time=datetime.utcnow())
if __name__ == '__main__':
app.run()
base.html:
{% extends "bootstrap/base.html" %}
{% block head %}
{{ super() }}
{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{% endblock %}
{% endblock %}
{% block content %}
{% block page_content %}
{% endblock %}
{% endblock %}
index.html:
{% extends 'base.html' %}
{% block page_content %}
Current time: {{ moment(current_time).format('LLL') }}.
{% endblock %}
Вывод Safari:
Вывод Chrome:
Редактировать: Полезный комментарий предложил использовать инструменты разработчика Safari, чтобы разобраться в проблеме. Когда я загружаю консоль javascript, я вижу некоторые ошибки:
После некоторого поиска в Google я решил, что мне нужно добавить Access-Control-Allow-Исходный заголовок и обновленная функция просмотра:
from flask import make_response
...
@app.route("/")
def index():
resp = make_response(render_template('index.html', current_time=datetime.utcnow()))
resp.headers['Access-Control-Allow-Origin'] = '*'
return resp
К сожалению, я получаю точно такой же набор ошибок. Я также попробовал библиотеку flask-cors, которая содержит декоратор cross_origin
, который, вероятно, должен учитывать эту проблему, но результаты все те же.
Редактировать 2: я "исправил" проблему. Функция include_moment()
содержит аргумент sri
(для «целостности подресурса»), который, если имеет значение true, проверяет, был ли обработан извлекаемый ресурс. Если я установлю это в false, ошибки исчезнут, и дата отобразится нормально. Мне было бы любопытно, если это можно исправить без отключения проверки ...