Flask-数据与路由

Flask-数据与路由,第1张

概述数据 图书数据库的地址 搜索关键字 1. 根据上面的地址可以知道搜索的时候有两种方式,而对于isbn搜索,又分为两种 ,`isbn10 由10表0 9表数字组组成,中间可能包含' ' 数据

图书数据库的地址

# 基地址http://t.yushu.im# 关键字搜索http://t.yushu.im/v2/book/search?q={}&start={}&count={}# isbn搜索http://t.yushu.im/v2/book/search/isbn/{isbn}# 豆瓣APIhttps://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_keyapp = 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)    passif __name__ == '__main__':    app.rundeBUG=app.config['DEBUG'])
requests请求因为这个项目要访问不同的网址,所以在目录下新建一个http.py文件,专门用来提供访问网址这里使用的requests,要先进行安装,注意:代码写的时候一定要简洁,千万不要使用python的关键字,以免与Python的模块冲突并导致此错误,把这个类名http改为别的名称
# -*- Coding: utf-8 -*-import requestsclass 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 aaaclass 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 Flaskfrom helper import is_isbn_or_keyfrom flask import Jsonify# 实例化from shanqiu_book import ShanQiuBookapp = 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'])
将视图函数拆分到单独的文件中如果视图函数都写在主文件中,不利于维护,而是应该把他们放入到一个文件中,每一个模块就是一个试图,用的时候直接引用,这样有利于维护在根目录下建立一个app/web文件夹,在这个文件夹下面建立一个book.py文件,专门用来存放book模块,然后在主文件中引用这个模块就可以了,book.py
# -*- Coding: utf-8 -*-from flask import Jsonifyfrom helper import is_isbn_keyfrom ShanqiuBook import ShanqiuBook# 为了让book.py模块可以使用app对象from demo import [email protected]('/book/search/<q>/<page>')def hello(q,page):    # 调用方法判断用户是根据什么查的    is_or_key = is_isbn_key(q)    if is_or_key == 'isbn':        result = ShanqiuBook.search_by_isbn(q)    else:        result = ShanqiuBook.search_by_keyword(q)    return Jsonify(result)
此时的主文件中
# -*- Coding: utf-8 -*-from flask import Flask# 为了可以注册book.py中的路由from app.web import bookapp = Flask(__name__)app.config.from_object('config')if __name__ == '__main__':    app.run(deBUG=app.config['DEBUG'])
但是这样写的话,会出现404,因为出现了循环引用循环引入流程分析因为在整个的流程中,app两次初始化,如图

整个流程中,出现了两次核心app对象的初始化,注册路由是在蓝色流程中初始化的app注册的。但是启动服务是红色流程中的app启动的book中注册路由所使用的app对象,是他自己所导入fisher模块的app对象(蓝色流程中),而不是红色主流程中所实例化的app对象问题1:因为都是由fisher引入book,一个模块只会引入另一个模块一次,所以只执行了一次book问题2:由于一次是主流程执行fisher文件;一次是由book模块导入 fisher为了验证我们的结论,我们在app实例化,启动,注册路由是哪个地方加入日志信息,
print("ID为"+str(ID(app))+"的app注册路由")@app.route("/book/search/<q>/<page>")def search(q,page):    isbn_or_key = is_isbn_or_key(q)    if isbn_or_key == 'isbn':        result = YuShuBook.search_by_isbn(q)    else:        result = YuShuBook.search_by_key(q)    return Jsonify(result)
主文件
app = Flask(__name__)print("ID为"+str(ID(app))+"的app实例化")app.config.from_object("config")# 为了可以注册book.py中的路由from app.web import bookif __name__ == '__main__':    print("ID为" + str(ID(app)) + "的app启动")    app.run(deBUG=app.config['DEBUG'])
结果如下
ID为92323280的app实例化ID为107142192的app实例化ID为107142192的app注册路由ID为92323280的app启动

可以看到注册路由的app,和启动服务的app不是同一个app。并且最后启动的app是最先实例化的app,也就是红色主流程的app;而注册路由的app是后实例化的app,也就是由book导入fisher模块的蓝色流程的app

总结

以上是内存溢出为你收集整理的Flask-数据与路由全部内容,希望文章能够帮你解决Flask-数据与路由所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1215941.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存