Flask-数据与路由

图书数据库的地址

# 基地址 # 关键字搜索 ?q={}&start={}&count={} # isbn搜索 {isbn} # 豆瓣api https://api.douban.com/v2/book/1003078 搜索关键字

根据上面的地址可以知道搜索的时候有两种方式,而对于isbn搜索,又分为两种isbn13 由13个0-9在数字组成,isbn10 由10表0-9表数字组组成,中间可能包含' - ' ,所以要分开来判断

在函数中要注意:isdigit()可以判断是否为数字 ,replace()用来替换,

@app.route("/search/<q>/<page>") def search(q,page): """ 搜索书籍路由 :param q: 关键字 OR isbn :param page: 页码 """ isbn_or_key = 'key' # 1. 判断长度是否为13且是否为数字 if len(q) == 13 and q.isdigit(): isbn_or_key = 'isbn' # 2. 把-替换掉,判断是否为纯数字 short_q = q.replace('-', '') if '-' in q and len(short_q) == 10 and short_q.isdigit(): isbn_or_key = 'isbn' pass

多逻辑判断的时候,应该把结果看着为假的放到前面,对数据库操作的放到后面,这样有利于节约资源

简单的重构

上面的代码都写到视图中这样不妥,体现不了封装性,看起来不好,应该把一个实现的功能封装起来,建立一个函数,方便日后的管理

在目录下建立一个helper.py文件,这个文件主要就是提供一些方法,把上面的内容放到这里,只需要返回一个值就可以了

# -*- coding: utf-8 -*- def is_isbn_or_key(word): isbn_or_key = 'key' if len(word) == 13 and word.isdigit(): isbn_or_key = 'isbn' short_word = word.replace('-', '') if '-' in word and len(short_word) == 10 and short_word.isdigit(): isbn_or_key = 'isbn' return isbn_or_key

在主文件中调用这个方法就可以了,记得传值,和接收返回的值

# -*- coding: utf-8 -*- from flask import Flask,make_response # 1. 这里要导入 from helper import is_isbn_or_key app = Flask(__name__) app.config.from_object('config') @app.route('/book/search/<q>/<page>') def search(q,page): # 2. 调用方法即可 is_or_key = is_isbn_or_key(q) pass if __name__ == '__main__': app.rundebug=app.config['DEBUG']) requests请求

因为这个项目要访问不同的网址,所以在目录下新建一个http.py文件,专门用来提供访问网址

这里使用的requests,要先进行安装,注意:代码写的时候一定要简洁,千万不要使用python的关键字,以免与Python的模块冲突并导致此错误,把这个类名http改为别的名称

# -*- coding: utf-8 -*- import requests class aaa: # 传入url和是否返回的是json数据,这里是静态方法 @staticmethod def get(url,return_json=True): # 发送get请求 r = requests.get(url) # 因为有的url返回的json数据,但是有的并不是,所以加一个判断,不是的话返回文本 # 还要判断状态码,200的话就是访问成功有数据 if r.status_code != 200: return {} if return_json else '' return r.json() if return_json else r.text # 下面的写法太low # if r.status_code == 200: # if return_json: # return r.json() # else: # return r.text # else: # if return_json: # return {} # else: # return '' 从API中获取数据

首先在目录下定义一个类,用于用于获取数据,ShanqiuBook,

# -*- coding: utf-8 -*- from http import aaa class ShanqiuBook: isbn_url = 'http://t.yushu.im/v2/book/search/isbn/{}' keyword_url = 'http://t.yushu.im/v2/book/search?q={}&count={}&start={}' # 根据isbn进行搜索,这里使用这个静态装饰器,调用类变量更加的方便 @classmethod def search_by_isbn(cls,isbn): # 调用类变量, url = cls.isbn_url.format(isbn) # 调用上面的方法用于请求网址 result = aaa.get(url) # 这里返回的是json数据,但是在py中就是字典了 return result # 根据关键字进行搜索 @classmethod def search_by_keyword(cls,keyword,count=15,start=0): url = cls.keyword_url.format(keyword,count,start) result = aaa.get(url) return result

然后在视图中获取返回的数据

# -*- coding: utf-8 -*- from flask import Flask from helper import is_isbn_or_key from flask import jsonify # 实例化 from shanqiu_book import ShanQiuBook app = Flask(__name__) # 载入这个配置文件 app.config.from_object('config') @app.route('/book/search/<q>/<page>') def search(q,page): is_or_key = is_isbn_or_key(q) if is_or_key == 'isbn': # 这里直接使用使用类名调用就可以 result = ShanQiuBook.search_by_isbn(q) else: result = ShanQiuBook.search_by_keyword(q) # 因为返回的是json数据,要手动的进行解析,这样写的话非常麻烦 # return json.dumps(result), 200, {'content-type': 'application/json'} # 这里使用flask自带的jsonify替换麻烦的json.dumps和元组 return jsonify(result) if __name__ == '__main__': app.run(debug=app.config['DEBUG']) 将视图函数拆分到单独的文件中

如果视图函数都写在主文件中,不利于维护,而是应该把他们放入到一个文件中,每一个模块就是一个试图,用的时候直接引用,这样有利于维护

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppwjw.html