You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

毕业设计社交网站消息显示故障排查求助

社交网站消息无法在页面显示的问题修复

问题描述

毕业设计开发的社交网站中,数据库messages表已成功存储消息,但HTML页面无法渲染展示这些消息。已排查6小时,修改过命名规范、变量、表单、模型及服务器路由,问题仍未解决。

相关代码

HTML模板

{% block body %}

<h1>My Messages:</h1>
<ul>
{% for message in messages %}
    <li>
        <a href="/messages/{{ message.message }}">{{ message.sender }} {{ message.message }}</a>
    </li>
{% endfor %}
</ul>
{% endblock %}

Flask路由

@app.route('/messages', methods=['GET', 'POST'])
@login_required
def messages():
    message_form = MessageForm()
    message_form.recipient.choices = [(user.id, user.username) for user in User.query.all()]
    
    if message_form.validate_on_submit():
        sender_id = current_user.id
        recipient_id = int(message_form.recipient.data)
        message = message_form.message.data  
        new_message = Message(sender_id=sender_id, recipient_id=recipient_id, message=message)
        db.session.add(new_message)
        db.session.commit()
        flash('Message sent!')
        return render_template('messages.html', message_form=message_form, message=message)

Message模型

class Message(db.Model):
   __tablename__ = "messages"
    
    message_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    sender_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    recipient_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    date_time = db.Column(db.DateTime, default=datetime.utcnow)
    message = db.Column(db.String, nullable=False)
    
    sender = db.relationship('User', foreign_keys=[sender_id])
    recipient = db.relationship('User', foreign_keys=[recipient_id])
    
    def get_time(self):
        return self.timestamp.strftime("%b %d, %Y %H:%M:%S")
    
    def __repr__(self):
        return f"<Message={self.message}>"

Flask表单

class MessageForm(FlaskForm):
    sender_id = HiddenField('Sender')
    recipient = SelectField('Recipient', validators=[DataRequired()])
    message = TextAreaField('Message', validators=[DataRequired()])
    submit = SubmitField('Submit')

问题根源及修复方案

1. 路由未传递消息列表到模板

当前路由仅在POST提交后返回模板,但未处理GET请求的消息查询;且POST返回时传递的是单个消息文本message,而非模板所需的消息列表messages。

修复路由:

@app.route('/messages', methods=['GET', 'POST'])
@login_required
def messages():
    message_form = MessageForm()
    # 排除当前用户自己,避免发给自己
    message_form.recipient.choices = [(user.id, user.username) for user in User.query.all() if user.id != current_user.id]
    
    # 查询当前用户收到的所有消息,按时间倒序
    user_messages = Message.query.filter_by(recipient_id=current_user.id).order_by(Message.date_time.desc()).all()
    
    if message_form.validate_on_submit():
        sender_id = current_user.id
        recipient_id = int(message_form.recipient.data)
        message_text = message_form.message.data  
        new_message = Message(sender_id=sender_id, recipient_id=recipient_id, message=message_text)
        db.session.add(new_message)
        db.session.commit()
        flash('Message sent!')
        # 提交后重定向,避免刷新页面重复提交
        return redirect(url_for('messages'))
    
    # 统一传递消息列表到模板
    return render_template('messages.html', message_form=message_form, messages=user_messages)

2. 模型方法字段名错误

get_time方法中使用了不存在的self.timestamp字段,实际字段名为date_time,会导致调用时出错。

修复模型:

def get_time(self):
    return self.date_time.strftime("%b %d, %Y %H:%M:%S")

3. 模板显示用户对象而非用户名

模板中message.sender直接显示的是User对象的repr字符串,需要显示用户名message.sender.username;同时消息链接应使用message_id而非消息内容,避免URL异常。

修复模板:

{% block body %}

<h1>My Messages:</h1>
<ul>
{% for message in messages %}
    <li>
        <a href="/messages/{{ message.message_id }}">{{ message.sender.username }}: {{ message.message }}</a>
        <small style="margin-left: 10px;">{{ message.get_time() }}</small>
    </li>
{% else %}
    <li>暂无消息</li>
{% endfor %}
</ul>

<!-- 添加消息发送表单(如果模板中没有的话) -->
<form method="POST">
    {{ message_form.hidden_tag() }}
    <div style="margin: 10px 0;">
        {{ message_form.recipient.label }}<br>
        {{ message_form.recipient() }}
    </div>
    <div style="margin: 10px 0;">
        {{ message_form.message.label }}<br>
        {{ message_form.message(cols=50, rows=5) }}
    </div>
    <div>{{ message_form.submit() }}</div>
</form>
{% endblock %}

内容的提问来源于stack exchange,提问作者Damien779

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:25:42