求助关于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/<int:id>')
def get_post(id):
post = Post.query.get_or_404(id)
return jsonify(post.to_json())
@api.route('/users/<int:id>/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:python问答之如果要返回实体信息要怎么操作好?
3:我在github中看到很多flsk开源的项目,里面序列化或者反序列化都是用类似上面to_json, to_dict实现的,包括很多教程都是这样设计的。这种方法,个人觉得对于Model有几十个属性就感觉很无力,有什么好的办法?
按照自己对Restful
的理解,接口是针对资源进行操作。github
曾经设计API
接口是针对单独的资源,而获取每个资源的接口,里面提供一些url
,以便可以获取下一个,或者返回上一个资源。
设计两个接口,一个针对user
这个资源获取详细信息,另外一个针对post
这个资源获取详细信息。
其中在获取用户发布文章的详细信息的接口。涉及user
和post
两个资源。根据查询条件是先找到user
,再通过user去找post。因此可以看成是获取user
这个资源,而user
里涵盖了post
资源,因此post
字段换成获取post
详细信息的接口,以便逻辑继续进行。
可以理解为一个资源就是一个表,一个接口只请求这个表的字段,至于外键字段的实体资源,则提供查询的url
接口。抛开那些实体之间的join
操作。
看原来的设计,是获取user
下某篇post
的详细信息,关联了post_id
,你改的那个是获取user的发布的post
列表。
直接查询实体返回即可。
其实尽管restful
的提出了很久,也有所谓很多实践。不同的人理解不一样,也没有比较统一的说法。github
的api
是一个比较好的例子。
实际开发中,几乎是不可能设计这样针对单个资源,资源之间通过url
获取的接口的。因为先阶段来说,客户端工程师都希望一个接口搞定所有需要的数据,才不会管你什么资源啊,实体啊。通常喜欢减少网络的请求,哪怕传输的数据变多。
如果是自己想实现restful
风格的程序,可以参考github
的api
。在工作中,估计没有人会让你这么做,客户端要求什么,就写什么,不需要纠结。
玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd18581.html
相关文章 Recommend
- • Python操作Redis数据库方面的问题
- • 豆瓣API 40次/分钟的访问限制怎么办
- • 问浏览器地址栏如何执行虚拟主机脚本关于环境
- • python异常的问题有代码求指教,关于raise语句
- • 关于web.py性能优化方法大家闲聊讨论下
- • 关于在android平台使用Python代码的小问题
- • 求大家帮解一道关于python分割的算法题
- • 关于设置WTForms初始化默认值的一个问题
- • 求大牛帮优化一段python代码关于循环里重复sele
- • python逻辑返回问题求助
- • 关于python编码检测与chardet模块应用的一些小问题
- • 求Pycharm打包Python脚本方法
必知PYTHON教程 Must Know PYTHON Tutorials
- • python 解释器
- • python idle
- • python dir函数
- • python 数据类型
- • python type函数
- • python 字符串
- • python 整型数字
- • python 列表
- • python 元组
- • python 字典
- • python 集合
- • python 变量
- • python print
- • python 函数
- • python 类定义
- • python import
- • python help
- • python open
- • python 异常处理
- • python 注释
- • python continue
- • python pass
- • python return
- • python global
- • python assert
- • python if语句
- • python break
- • python for循环
- • python while循环
- • python else/elif
- • lambda匿名函数
必知PYTHON模块 Must Know PYTHON Modules
- • os 模块
- • sys 模块
- • re 正则表达式
- • time 日期时间
- • pickle 持久化
- • random 随机
- • csv 模块
- • logging 日志
- • socket网络通信
- • json模块
- • urlparse 解析URL
- • urllib 模块
- • urllib2 模块
- • robotparser 解析
- • Cookie 模块
- • smtplib 邮件
- • Base64 编码
- • xmlrpclib客户端
- • string 文本
- • Queue 线程安全
- • math数学计算
- • linecache缓存
- • threading多线程
- • sqlite3数据库
- • gzip压缩解压
最新内容 NEWS
- • django app提供pv信息的方法是什么
- • Django项目版本升级如何操作?
- • django较多数据传递如何优雅的呈现
- • django1.7获取参数问题求助
- • Django1.7使用内置comment遇到问题
- • python mysql数据库做insert操作时报_mysql_ex
- • 关于python mysql的duplicate insert机制的疑问
- • pymongo使用insert函数批量插入被中断要怎么
- • Python程序员解决棘手问题的常用库
- • 求助关于restfull api接口几个问题
图文精华 RECOMMEND
-
django1.7获取参数问题求助
-
Python程序员解决棘手问题的常用库
-
求问str()同__str__原理上有什么不同
-
scrapy框架里面用link extractor怎么能
-
python {}.fromkeys创建字典append添加操
-
python3 类型Type str doesn't support th
热点文章 HOT
- 学习Python有什么好的书籍推荐?
- Python匿名函数 Lambda表达式作用
- Python与Java、C、Ruby、PHP等编程语言有什么
- Python 正则中文网页字符串提取问题
- 如何为实时性应用存取经纬度?django my
- 想用python做个客户端,在二维码登录这个地
- 有让IDE可识别Python函数参数类型的方法吗
- Python字符串转换成列表正则疑问