Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将变量从Flask传递到JavaScript_Javascript_Python_Flask_Pubnub - Fatal编程技术网

将变量从Flask传递到JavaScript

将变量从Flask传递到JavaScript,javascript,python,flask,pubnub,Javascript,Python,Flask,Pubnub,我查看了类似的论坛,但没有找到任何有效的解决方案。我试图将变量从Flask传递到我的JavaScript文件。然后,这些值将用于我的JavaScript文件中的PubNub 以下是我的Python代码的一部分: @app.route("/mysettings/") def user_settings(): return render_template('Settings.html', project_name = session['project_name'] , publi

我查看了类似的论坛,但没有找到任何有效的解决方案。我试图将变量从Flask传递到我的JavaScript文件。然后,这些值将用于我的JavaScript文件中的PubNub

以下是我的Python代码的一部分:

@app.route("/mysettings/")
def user_settings(): 
        return render_template('Settings.html',  project_name = session['project_name'] , publish_key = session['publish_key'] , subscribe_key = session['subscribe_key'] )
下面是我的JavaScript代码(app.js)的一部分:


如果我在Settings.html文件中使用此代码,但在app.js文件中不使用此代码,则此代码有效。

原因是需要使用
jinja2
来执行替换,而您的代码中似乎没有执行此替换

很有可能您将
app.js
作为一个静态文件提供,这意味着模板引擎不会查看它,而是按原样提供

您可以通过提供
app.js
来完成您所描述的内容,该URL与通过Flask的
render_template
函数传递
app.js
内容的操作相关联,执行
jinja2
替换和所有其他自定义信息,但这意味着
jinja2
必须解析整个文件,这可能会很昂贵

您可以尝试使用AJAX请求传递这些变量,该请求由一个以JSON格式发回相同数据的操作响应。这是一个更为常见的做法,并且增加了对其他资源可见的数据的附加值。

< p>答案是相当好的,但是有“黑客”你应该考虑。定义Javascript方法以接收参数并将数据作为参数发送到函数

main.py

@app.route('/')
def hello():
    data = {'username': 'Pang', 'site': 'stackoverflow.com'}
    return render_template('settings.html', data=data)
@app.route('/')
def hello():
    data = {'username': 'Pang', 'site': 'stackoverflow.com'}
    return render_template('settings.html', data=data)
app.js

function myFunc(vars) {
    return vars
}
function myFunc() {
    return username + site
}
settings.html

<html>
    <head>
         <script type="text/javascript" {{ url_for('static', filename='app.js')}}></script>
         <script type="text/javascript">
            myVar = myFunc({{vars|tojson}})
         </script>
    </head>
</html>
<html>
    <head>
         <script type="text/javascript">
            var username = {{ data.username }}
            var site = {{ data.site }}
        </script>
        <script type="text/javascript" src="app.js"></script>
    </head>
</html>

myVar=myFunc({{vars|tojson}})

通过@mauro提到的简单示例,将变量从flask视图传递到模板,再传递到javascript文件的简单方法

main.py

@app.route('/')
def hello():
    data = {'username': 'Pang', 'site': 'stackoverflow.com'}
    return render_template('settings.html', data=data)
@app.route('/')
def hello():
    data = {'username': 'Pang', 'site': 'stackoverflow.com'}
    return render_template('settings.html', data=data)
settings.html

<html>
    <head>
         <script type="text/javascript" {{ url_for('static', filename='app.js')}}></script>
         <script type="text/javascript">
            myVar = myFunc({{vars|tojson}})
         </script>
    </head>
</html>
<html>
    <head>
         <script type="text/javascript">
            var username = {{ data.username }}
            var site = {{ data.site }}
        </script>
        <script type="text/javascript" src="app.js"></script>
    </head>
</html>

var username='{data.username}}'
var site='{data.site}}'

这对我来说很正常,不是黑客。vars/tojson:这救了我作为非web开发人员的命:DThanks@MauroBaraldi不,我有@context_processor for translations dictionary,需要链接一些单独的js文件,在该文件中需要使用{{translations.somevar{tojson}}这可能吗?你是说
{data{tojson}
.FYI-Docs for tojson和其他过滤器:只有在我将
data.username
更改为
data.username | tojson
后,这个答案才对我有效(我正在传递名称包含斜杠的变量,如“/example/name”(如果有必要)