从零开始写博客系统——查询分类和标签
背景
在前面的文章中,我们已经把博客的主要接口已经写好了,在一般的博客系统中,还会有按分类查询和按照标签查询的需求。本文我们来执行这部分功能的开发。
分析
在开始开发之前我们先要对功能做一下分析,在我们定义的数据结构里面。分类这个字段是一个字符串,标签是一个数组。也就是说每篇文章只有一个分类,但是会有多个标签。
做完了上面分析之后,就可以得出我们开发的逻辑了,对于按分类查询的需求,我们首先要有一个接口可以查询到所有分类,然后还要有一个接口查询某个分类下的所有文章。
对于标签查询的需求也是类似,也需要一个查询所有标签的接口和查询某个标签下所有文章的接口。
实现方案
这种查询类的接口,从实现上来说有两种方式。
方案一:
实时计算,在查询请求过来的时候,去获取所有文章的分类或者标签,然后去重后返回一个列表。
方案二:
在项目初始化的时候,就把所有文章的分类或者标签加载到内存中,查询请求过来的时候就直接返回列表即可。但是这种方案在新增接口或者修改接口修改到标题的时候,要去内存新增或者刷新数据。
在做方案选择的时候首先要明白一个道理,没有最好的设计,只有最适合的设计。
方案一实现简单,逻辑清晰。在数据量不大的情况下,方案一无疑是比较合适的方案。
方案二实现复杂度高。但是在数据量大的情况下,具备请求相应快,计算资源消耗少的优势。
所以我们这里选择方案一来实现。
编码
article.py
class Articles(object):
...
def get_categorys(self) -> list:
categorys = []
for x in self.articles:
if x.category not in categorys:
categorys.append(x.category)
return categorys
def get_tags(self) -> list:
tags = []
for x in self.articles:
for tag in x.tag:
if tag not in tags:
tags.append(tag)
return tags
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
我们在Articles
类中实现这部分功能。然后在补上接口即可。
app.py
...
@app.route("/get_category")
def get_category():
return jsonify({"code": 0, "msg": "success", "data": articles.get_categorys()})
@app.route("/get_tag")
def get_tag():
return jsonify({"code": 0, "msg": "success", "data": articles.get_tags()})
2
3
4
5
6
7
8
9
10
11
有了前面的经验,这部分总体实现难度不大。
验证我们做的功能
这部分难度也不大,跟之前是一样的。
curl 'http://127.0.0.1:5000/get_category'
{"code":0,"data":["\u4ece\u96f6\u5f00\u59cb\u5b66\u535a\u5ba2","python"],"msg":"success"}
$ curl 'http://127.0.0.1:5000/get_tag'
{"code":0,"data":["Python","Flask","\u535a\u5ba2"],"msg":"success"}
2
3
4
5
可以发现已经能正常返回了。
当然,这里我们也可以跟之前的功能做一下联动,比如我新增一篇文章,然后再查询一下分类或者标签。
curl -X POST -H "Content-Type: application/json" -d '{"title": "test_title", "content": "test_content", "author": "testuser", "category": "python", "tag": ["Python","test"]}' http://127.0.0.1:5000/add_article
{"code":0,"data":{"insert_id":3},"msg":"success"}
curl 'http://127.0.0.1:5000/get_tag'
{"code":0,"data":["Python","Flask","\u535a\u5ba2","test"],"msg":"success"}
2
3
4
5
可以看到,这里我们新增文章的标签test
已经被正确的获取到了。
总结
本章我们学习了如何查询博客的分类和标签。基本上能够独立完成到这里并且理解这些代码作用的读者,已经具备了一定后端开发的基础了。
同样,如果写起来有困难的同学,也可以参考代码 代码浏览 - blog - 从零开始写一个博客系统 - svenweng (coding.net)
思考
我们是按照方案一来进行编码的。读者可以尝试使用方案二来进行编码。注意点我已经在设计上提到了。