我正在尝试自学Flask,但是遇到了无法使用Safari浏览器(13.0.2)使用flask-moment显示日期的问题。它们在Chrome中显示正常。下面是一个演示这种行为的最小应用程序。
我对Web开发人员的经验不足,无法确定这是烧瓶瞬间的错误,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开发工具来调查问题。加载JavaScript控制台时,我看到一些错误弹出窗口:
在谷歌搜索后,我确定我需要添加一个Access-Control-Allow-Origin标头,并将视图函数更新为:
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,错误将消失并且日期显示良好。如果不能在不禁用检查的情况下解决此问题,我会很好奇。