由于 @ 是在回复中进行的,所以在回复的函数中添加此功能;
from models import Model
Model = Model
class Reply(Model):
@classmethod
def valid_names(cls):
names = super().valid_names()
names = names + [
('content', str, ''),
('topic_id', str, 0),
('user_id', str, 0),
]
return names
def user(self):
from .user import User
u = User.one(id=self.user_id)
return u
- 这里为什么添加
Model = Model
就不得而知了,其它类没有; - flask 里面数据的关系通过
id
来联结,与django
不一样
from flask import (render_template, request, redirect, url_for, Blueprint, )
from models.mail import Mail
from routes import *
from models.reply import Reply
from utils import log
main = Blueprint('reply', __name__)
def users_from_content(content):
# 不能解决 @在文本中间 比如 123@name abc,这样就不能获得name了
parts = content.split(' ')
users = []
for p in parts:
if p.startswith('@'):
username = p[1:]
u = User.one(username=username)
users.append(u)
return users
- 获取用户名的方式有待商榷
# 有个 bug 如果回复内容中含有 @ ,而后面跟着不是用户名,将会报错
def send_mails(sender, receivers, content):
for r in receivers:
form = dict(
title='你被 {} AT 了'.format(sender.username),
content=content,
sender_id=sender.id,
receiver_id=r.id,
)
m = Mail.new(form)
log(m)
- 发送消息,即将数据保存到相应用户下
@main.route("/add", methods=["POST"])
def add():
log('reply add')
form = request.form
u = current_user()
# 发邮件
log('before send mail', form)
content = form['content']
log('reply', content)
users = users_from_content(content)
log('reply', users)
send_mails(u, users, content)
log('after send mail')
m = Reply.new(form, user_id=u.id)
return redirect(url_for('topic.detail', id=m.topic_id))
- 保存回复内容和 topic_id 就可以实现回复了,Topic 类会遍历下属回复;
网友评论