php resetfull,restful,python_关于restfull api 接口问题。,restful,python,flask,序列化 - phpStudy...

本文讨论了RESTful API接口的设计,特别是获取文章详细信息和用户发表文章的接口实现。在模型类中定义了`to_json()`方法,用于将数据转化为JSON格式,但返回的是URL而非实体信息。疑问在于为何选择返回URL而不是实体,以及如何返回实体信息。此外,还提及了使用`to_json()`或`to_dict()`进行序列化的常见做法在面对大量模型属性时可能效率低下,并寻求优化策略。
摘要由CSDN通过智能技术生成

关于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) 调用?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值