关于restfull api 接口问题。
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), unique=True, index=True)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
password_hash = db.Column(db.String(128))
confirmed = db.Column(db.Boolean, default=False)
name = db.Column(db.String(64))
location = db.Column(db.String(64))
about_me = db.Column(db.Text())
member_since = db.Column(db.DateTime(), default=datetime.utcnow)
last_seen = db.Column(db.DateTime(), default=datetime.utcnow)
avatar_hash = db.Column(db.String(32))
posts = db.relationship('Post', backref='author', lazy='dynamic')
comments = db.relationship('Comment', backref='author', lazy='dynamic')
def to_json(self):
json_user = {
'url': url_for('api.get_post', id=self.id, _external=True),
'username': self.username,
'member_since': self.member_since,
'last_seen': self.last_seen,
'posts': url_for('api.get_user_posts', id=self.id, _external=True),
'post_count': self.posts.count()
}
return json_user
class Post(db.Model):
__tablename__ = 'posts'
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.Text)
body_html = db.Column(db.Text)
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
comments = db.relationship('Comment', backref='post', lazy='dynamic')
def to_json(self):
json_post = {
'url': url_for('api.get_post', id=self.id, _external=True),
'body': self.body,
'body_html': self.body_html,
'timestamp': self.timestamp,
'author': url_for('api.get_user', id=self.author_id,
_external=True),
'comments': url_for('api.get_post_comments', id=self.id,
_external=True),
'comment_count': self.comments.count()
}
return json_post
2个类的定义如上,然后,假设现在需要获取设计两个接口:
获取某个文章详细信息的接口。
获取某个人发表的文章详细信息。
我看到很多教程都是类似这样设计的:
@api.route('/posts/')
def get_post(id):
post = Post.query.get_or_404(id)
return jsonify(post.to_json())
@api.route('/users//posts/')
def get_user_posts(id):
user = User.query.get_or_404(id)
page = request.args.get('page', 1, type=int)
pagination = user.posts.order_by(Post.timestamp.desc()).paginate(
page, per_page=current_app.config['FLASKY_POSTS_PER_PAGE'],
error_out=False)
posts = pagination.items
prev = None
if pagination.has_prev:
prev = url_for('api.get_posts', page=page-1, _external=True)
next = None
if pagination.has_next:
next = url_for('api.get_posts', page=page+1, _external=True)
return jsonify({
'posts': [post.to_json() for post in posts],
'prev': prev,
'next': next,
'count': pagination.total
})
对于接口返回的数据我有几个疑问:
1:为什么很多详细信息都是返回URL而不是实体。
比如:Class User类的to_json()方法为什么不像这样设计?
def to_json(self):
json_user = {
'url': url_for('api.get_post', id=self.id, _external=True),
'username': self.username,
'member_since': self.member_since,
'last_seen': self.last_seen,
'posts': [post.to_json() for post in self.posts],
'post_count': self.posts.count()
}
return json_user
2:如果要返回实体信息要怎么操作好?
3:我在github中看到很多flsk开源的项目,里面序列化或者反序列化都是用类似上面to_json, to_dict实现的,包括很多教程都是这样设计的。这种方法,个人觉得对于Model有几十个属性就感觉很无力,有什么好的办法?
相关阅读:
为什么console.log("click" in document )会报false?
grunt怎样写日志文件
java的中文到底占几个字节?
sql语句查询经纬度范围
laravel怎么实现文件下载功能?
MongoDB里findOne()是不是相当于SQL中LIMIT 1
SSL的保密性、真实性、完整性和不可否认性具体怎么体现?
git不显示文件状态图标
java里面如何像php那样解析json
关于flask全文搜索flask_whooshalchemyplus模块用法问题
调用类内方法不起作用
C++ 子类调用父类方法(不是虚函数), 一定要用this指针指着吗?
mysql in出现次数排序
iOS 获取系统所有的语言列表
sublime text3如何设置代码检测?
flask-mail 从环境变量中提取账号密码 一直
python 中的for循环如何修改循环变量?
同样的进维度坐标在高德地图跟百度地图位置不同
想请教一下大家崩溃日志是怎么处理的
Python 的装饰器如何既支持 @deco 也支持 @deco(p) 调用?