我正在尝试编写一个简单的消息传递功能,尽管进行了搜索,但在想出可行的解决方案时遇到了麻烦。在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")
答案 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_for
与redirect
方法一起使用,以将用户重定向到原始模板。
在这里,我展示了一个基本示例:
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"))
输出:
N.B .:在这里,我使用静态字典搜索模拟了数据库查询。