将参数传递给烧瓶GET函数

时间:2020-06-02 03:14:05

标签: python flask

我正在尝试编写一个简单的消息传递功能,尽管进行了搜索,但在想出可行的解决方案时遇到了麻烦。在get函数上,代码检索存储的消息并将其传递以呈现。

post函数存储所有正常工作的消息,但是我试图将用户重定向回他们来自的原始页面以显示新消息,因此尝试将接收用户变量传递给get函数。

到目前为止我的代码。我是Flask的新手,因此不胜感激其他任何指针。提前致谢!

@app.route("/messaging", methods=["GET", "POST"])
@login_required
def messaging():
    if request.method == "GET":

        clicked_user = request.args.get('user')
        messages = db.execute("SELECT * FROM messages WHERE (m_sending_user = :self_user AND m_receiving_user = :other_user) OR (m_sending_user = :other_user AND m_receiving_user = :self_user)",
                        self_user = session["user_id"],
                        other_user = clicked_user)

        return render_template("messaging.html", messages=messages, clicked_user=clicked_user)

    if request.method == "POST":

        receiving_user = request.form.get("recipient")

        db.execute("INSERT INTO messages (m_sending_user, m_receiving_user, message) VALUES (:m_sending_user, :m_receiving_user, :message)",
                        m_sending_user = session["user_id"],
                        m_receiving_user = receiving_user,
                        message = request.form.get("reply"))

        flash("Sent!")
        return render_template("messaging.html")

2 个答案:

答案 0 :(得分:0)

为什么你不仅仅拥有post函数,还像这样调用get函数

def get_function(clicked_user):
    messages = db.execute("SELECT * FROM messages WHERE (m_sending_user = :self_user AND m_receiving_user = :other_user) OR (m_sending_user = :other_user AND m_receiving_user = :self_user)",
                  self_user = session["user_id"],
                  other_user = clicked_user)

    return render_template("messaging.html", messages=messages, clicked_user=clicked_user)

@app.route("/messaging", methods=["GET", "POST"])
@login_required
def messaging():
    if request.method == "GET":

        clicked_user = request.args.get('user')

        return get_function(clicked_user)

    if request.method == "POST":

        receiving_user = request.form.get("recipient")

        db.execute("INSERT INTO messages (m_sending_user, m_receiving_user, message) VALUES (:m_sending_user, :m_receiving_user, :message)",
                        m_sending_user = session["user_id"],
                        m_receiving_user = receiving_user,
                        message = request.form.get("reply"))

        flash("Sent!")
        return get_function(m_receiving_user)

但是当然具有更好的命名函数;)

答案 1 :(得分:0)

如果您在GET请求中发送数据,则该数据将在URL参数中可见。相反,您可以使用session对象存储变量。有关session对象的更多信息,请参见[会话对象的官方文档]。(https://flask.palletsprojects.com/en/1.1.x/quickstart/#sessions

您可以将url_forredirect方法一起使用,以将用户重定向到原始模板。

在这里,我展示了一个基本示例:

messaging.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Post request redirect</title>
  </head>
  <body>
    {% with messages = get_flashed_messages() %}
      {% if messages %}
        <ul>
        {% for message in messages %}
          <li>{{ message }}</li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endwith %}

    {% if clicked_user %}
      Clicked user: {{ clicked_user }}
    {% endif %}

    {% if messages %}
      Messages: {{ messages }}
    {% endif %}

    <h3>Send a Message</h3>
    <form action='{{url_for("messaging")}}' method="post">
      Recipient:
      <input type="text" name="recipient">
      <input type="submit" value="Submit">
    </form>
  </body>
</html>

app.py

from flask import Flask, render_template, redirect, url_for, session, request, flash

app = Flask(__name__)
# Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'



@app.route("/messaging", methods=["GET", "POST"])
def messaging():
    if request.method == "GET":
        data = {
            "shovon": "some messages for shovon",
            "arsho": "other messages for arsho"
        }
        receiving_user = None
        messages = None
        if 'receiving_user' in session:
            receiving_user = session["receiving_user"]
        messages = data.get(receiving_user)
        return render_template("messaging.html", messages=messages, clicked_user=receiving_user)

    if request.method == "POST":
        receiving_user = request.form.get("recipient")
        session["receiving_user"] = receiving_user
        flash("Sent!")
        return redirect(url_for("messaging"))

输出:

  • 提交表单之前:

before form submission

  • 提交表单后:

after form submission

N.B .:在这里,我使用静态字典搜索模拟了数据库查询。