Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.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
Python 如何在无需渲染模板的情况下在flask中实现按钮?_Python_Flask_Jinja2 - Fatal编程技术网

Python 如何在无需渲染模板的情况下在flask中实现按钮?

Python 如何在无需渲染模板的情况下在flask中实现按钮?,python,flask,jinja2,Python,Flask,Jinja2,我对Python&Flask非常陌生,从rn开始,我正在尝试建立一个网站,只需按下一个按钮就可以生成随机颜色,但其想法是,您也可以将这些随机颜色保存在您的个人资料中,然后再对其进行管理、删除、移动等 我现在面临的问题是,在我的随机页面上,我似乎不知道如何实现保存按钮,而不呈现整个页面,再次随机颜色,从而将错误的颜色保存到数据库中。以下是我目前掌握的情况: app.py app.html 我有点理解我已经编写的代码中的缺陷,以及它再次呈现模板的原因,但我只需要一个提示或查看位置,这样在if语句之后

我对Python&Flask非常陌生,从rn开始,我正在尝试建立一个网站,只需按下一个按钮就可以生成随机颜色,但其想法是,您也可以将这些随机颜色保存在您的个人资料中,然后再对其进行管理、删除、移动等

我现在面临的问题是,在我的随机页面上,我似乎不知道如何实现保存按钮,而不呈现整个页面,再次随机颜色,从而将错误的颜色保存到数据库中。以下是我目前掌握的情况:

app.py

app.html


我有点理解我已经编写的代码中的缺陷,以及它再次呈现模板的原因,但我只需要一个提示或查看位置,这样在if语句之后,它就不会刷新页面或进一步了。任何关于如何更好地实施这一点的建议、意见和提示,我们都将不胜感激

这比你想象的要复杂得多。您将需要使用某种异步更新。在这种情况下,不用学习React等,使用JQuery可能更容易。基本上,您希望截取表单提交以保存最喜爱的颜色便笺,我在英国,因此在下面的示例中我的拼写可能不一致,抱歉,然后只更改DOM中的特定元素

下面有很多代码,但它提供了一个自包含的示例—只需运行脚本并转到127.0.0.1:5000即可。主要变化:

我已经切换到Alchemy ORM对象关系映射器。这部分是因为我更容易建立一个简单的示例,但通常在应用程序开发中也更容易。因此,我创建了两个类来为您创建数据库表。 我已经实现了两个使用AJAX的JavaScript函数。一个附加到按钮单击,另一个截取表单提交。 我已将烧瓶路由拆分,以便可以分别处理不同的事件 基本上:

如果我们不知道用户最喜欢的颜色,我们只会给出一个白色背景。 如果他们随机选择一种新颜色,我们将只更新背景颜色。我们还将更新表单中的隐藏字段,以保存他们的首选项,以防他们希望保留该字段。 如果他们单击“收藏夹”,我们会将其写入数据库。如果在此点之后关闭页面并再次打开,您将注意到我们加载了他们以前的收藏夹 不要在实际代码中使用render\u template\u字符串,它只允许我将模板放入单个脚本中

这仅用于说明目的。目的是在一般设置上连接点;它缺少表单验证等内容


还有很多,还有很多可以实现,但已经太长了。希望您可以运行它并逐个完成各个点。

这比您想象的要复杂得多。您将需要使用某种异步更新。在这种情况下,不用学习React等,使用JQuery可能更容易。基本上,您希望截取表单提交以保存最喜爱的颜色便笺,我在英国,因此在下面的示例中我的拼写可能不一致,抱歉,然后只更改DOM中的特定元素

下面有很多代码,但它提供了一个自包含的示例—只需运行脚本并转到127.0.0.1:5000即可。主要变化:

我已经切换到Alchemy ORM对象关系映射器。这部分是因为我更容易建立一个简单的示例,但通常在应用程序开发中也更容易。因此,我创建了两个类来为您创建数据库表。 我已经实现了两个使用AJAX的JavaScript函数。一个附加到按钮单击,另一个截取表单提交。 我已将烧瓶路由拆分,以便可以分别处理不同的事件 基本上:

如果我们不知道用户最喜欢的颜色,我们只会给出一个白色背景。 如果他们随机选择一种新颜色,我们将只更新背景颜色。我们还将更新表单中的隐藏字段,以保存他们的首选项,以防他们希望保留该字段。 如果他们单击“收藏夹”,我们会将其写入数据库。如果在此点之后关闭页面并再次打开,您将注意到我们加载了他们以前的收藏夹 不要在实际代码中使用render\u template\u字符串,它只允许我将模板放入单个脚本中

这仅用于说明目的。目的是在一般设置上连接点;它缺少表单验证等内容

还有很多,还有很多可以实现,但已经太长了。希望你能运行它,一个接一个地完成各个点

@app.route("/l_randomize", methods=["GET", "POST"])
def l_randomize():
if request.method == "GET":
    return render_template("l_randomize.html")
else:
    color = '#{:02x}{:02x}{:02x}'.format(*random.sample(range(256), 3))
    if 'favourite' in request.form:
        db.execute("INSERT INTO fav (user_id, color) VALUES (:user_id, :color)", user_id=session["user_id"], color=color)
    return render_template("l_randomized.html",color=color)
{%block body%}
<div class="container">
<h3>Your color is</h3>
<div id="l_randomized" style="background-color: {{ color }};">
<form method="post" action="/l_randomize">
    <input type="submit" name = "randomize" value="Randomize" >
    <input type="submit" name = "favourite" value="Favourite" >
</form>
</div>
</div>
{%endblock%}
from flask import Flask, render_template_string, session, request
from flask_sqlalchemy import SQLAlchemy

import random

# =============================================================================
# BASIC APP INIT
# =============================================================================
db = SQLAlchemy()

app = Flask('__main__')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['SECRET_KEY'] = 'change_me'
db.init_app(app)

# =============================================================================
# DATABASE MODELS
# =============================================================================
class Users(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String)
    

class Fav(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id')) 
    color = db.Column(db.String)

with app.app_context():
    db.create_all()

    user = Users(username='testing') # Create a fake user
    db.session.add(user)
    db.session.commit()

# =============================================================================
# TEMPLATE
# =============================================================================

l_randomize_html = """
{%block body%}
<div class="container">
   <h3>Your color is</h3>
   <div id="l_randomized" style="background-color: {{ color }};">
      <button onclick="changeColor()">Change</button>
      <form method="post" action="{{ url_for('l_save_favourite') }}" id="favColorForm">
         <input type="hidden" name="currentColor" id="currentColor" value="{{ color }}">
         <input type="submit" name="favourite" value="Favourite" >
      </form>
      <div id="colorSaveResp"></div>
   </div>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script>
   function changeColor() {
       $.ajax({
           type: 'POST',
           url: "{{ url_for('change_color') }}",
           success: function(color) {
               $("#currentColor").val(color);
               $("#l_randomized").css("backgroundColor", color);
           }
       });
   }
</script>
<script>
   $("#favColorForm").submit(function(e) {
       e.preventDefault();
       var form = $(this);
       var url = form.attr('action');
    
       $.ajax({
           type: "POST",
           url: url,
           data: form.serialize(),
           context: form,
           success: function(resp) {
               $("#dynamic_div").html(resp);    
           }
       });
   });
</script>
{%endblock%}
"""

# =============================================================================
# ROUTES
# =============================================================================

@app.route('/', methods=['GET'])
def l_randomize():
    session['user_id'] = 1 # Add to the session
    # See whether we have a favourite colour 
    favourite = Fav.query.filter_by(user_id=session['user_id']).first()
    if favourite:
        color = favourite.color
    else:
        # They don't, give a default
        color = '#FFF' 
    return render_template_string(l_randomize_html, color=color)


@app.route('/change_color', methods=['POST'])
def change_color():
    return '#{:02x}{:02x}{:02x}'.format(*random.sample(range(256), 3))


@app.route('/save_color', methods=['POST'])
def l_save_favourite():
    data = request.form.to_dict()
    
    favourite = Fav.query.filter_by(user_id=session['user_id']).first()
    if not favourite:
        # We don't know this user's favourite colour yet, add it
        favourite = Fav(user_id=session['user_id'],
                        color=data['currentColor'])
        db.session.add(favourite)
        db.session.commit()
    else:
         # We'll update their favourite
        favourite.color = data['currentColor']
    db.session.commit()
    return "Saved"


if __name__ == '__main__':
    app.run(debug=True)