毕业设计社交网站消息显示故障排查求助
社交网站消息无法在页面显示的问题修复
问题描述
毕业设计开发的社交网站中,数据库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
相关产品推荐
相关产品推荐

