将变量从js代码传递到db中的flask或类似的东西

时间:2017-02-24 22:00:28

标签: javascript python flask

我是英文,Python和Flask的全新版本,如果我写的是非常糟糕的事情,我很抱歉。

我有以下任务:当用户转到pfofile.html时,页面会加载数据库中的值。 如果用户更改颜色,则启动JavaScript函数(调用onchange())。 我必须编写更改数据库中字段text_color_in_chat的代码。 我以为我做得很好,但我有以下错误:jinja2.exceptions.UndefinedError: 't' is undefined。 而且我不明白我如何能够通过" t"使用Flask从JavaScript到Python的变量,或者如何正确调用大括号{{}}

<script type="text/javascript" charset="utf-8">
function change_color(t) {
    alert( {{ current_user.change_color_in_db(t.value) }} );
}
</script>
<div>
    Check your color in chat:
    <input type="color" value="{{ user.text_color_in_chat }}" onchange="change_color(this);">
</div>

以下是models.py的一部分:

...
text_color_in_chat = db.Column(db.String(8), default='#000000')
...
def change_color_in_db(self, new_color):
        # re.search(r'^#[0-9a-f]{6,6}$', "#000000"
        self.text_color_in_chat = new_color
        db.session.add(self)
        return True
...

在我的Python函数中,我使用RegEx测试变量new_color。如果不匹配则返回None,否则返回该对象。并且,我不了解如何使用if条件。

1 个答案:

答案 0 :(得分:0)

让我们看看并理解客户端/服务器应用程序的工作方式:

来自用户的浏览器:

  1. 用户在表单中输入值;
  2. 用户提交表单;
  3. 将表单数据发布到服务器并等待响应。
  4. 在服务器上:

    1. 服务器获取HTTP请求并对其进行解码;
    2. 将网址翻译为&#34;路线&#34;;
    3. 服务器调用附加到路由的函数或方法;
    4. 该功能完成它的工作,必须返回HTTP响应(数据+状态代码);
    5. 将响应(通常是HTML页面)发送回浏览器。
    6. 在用户的浏览器上:

      1. 浏览器呈现HTML页面(或其他类型的数据);
      2. 然后用户可以继续浏览。
      3. ...循环完成。

        来自用户的浏览器:

        您想要的是一种注册用户对数据库的更改的方法。

        为此,您可以使用经典HTML表单或Ajax请求。由于您使用的是JavaScript,因此Ajax请求是最好的方法。例如,您可以使用jQuery.post来执行此操作:

        这是草稿:

        <script type="text/javascript" charset="utf-8">
        function change_color(t) {
            var url = "/route/to/change_color";
            var data = {color: $('#chat-color').val()};
            $.post(url, data);
        }
        </script>
        

        此代码获取{em> id 为input的{​​{1}}字段的值,并将其发布到网址&#34; / route / to / change_color&#34;

        当然,您需要像这样更改HTML表单,以添加#chat-color ID

        #chat-color

        在服务器上:

        您需要为路线定义一个功能&#34; / route / to / change_color&#34;。

        该功能可以是:

        <div>
            Check your color in chat:
            <input id="chat-color" type="color" value="{{ user.text_color_in_chat }}" onchange="change_color(this);">
        </div>
        

        这是一个使用全局变量而不是数据库的小解决方案(为了简单起见):

        import re
        from flask import request
        
        @app.route('/route/to/change_color', methods=['POST'])
        def change_color():
            new_color = request.form['color']
            if re.match(r'^#[0-9a-f]{6,6}$', new_color):
                self.text_color_in_chat = new_color
                db.session.add(self)
                ...
            ...