Python 后端 学习笔记 ·

「Flask实战」鱼书项目实战一

flask-python

flask鱼书项目实战


项目结构

├── static  #静态资源
├── templates
├── fisher.py

首先先构建搜索关键字的视图函数

from flask import Flask

app = Flask(__name__)

@app.route('/book/search/<q>/<page>')
def search(q,page):
        """
        q:代表普通关键字 或 isbn
        isbn :
            isbn10:由10位数字组成,其中可能包含'-'
            isbn13:由13位数字组成
        key:
    """
    key_or_isbn = 'key'
    if len(q) == 13 and q.isdigit():
        key_or_isbn = 'isbn'
    short_q = q.replace('-', '')
    if len(q) == 10 and len(short_q) and short_q.isdigit():
        key_or_isbn = 'isbn'
    return key_or_isbn


@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()

项目结构

├── static  #静态资源
├── templates
├── fisher.py
├── helper.py

然后把判断逻辑抽取出来,放到一个新文件里。

#helper.py
def is_isbn_or_key(word):
    """
        q:代表普通关键字 或 isbn
        isbn :
            isbn10:由10位数字组成,其中可能包含'-'
            isbn13:由13位数字组成
        key:
    """
    key_or_isbn = 'key'
    if len(word) == 13 and word.isdigit():
        key_or_isbn = 'isbn'
    short_word = word.replace('-', '')
    if len(word) == 10 and len(short_word) and short_word.isdigit():
        key_or_isbn = 'isbn'
    return key_or_isbn

在主函数里导入hellper.py,调用方法返回判断结果

项目结构

├── static  #静态资源
├── templates
├── fisher.py
├── helper.py
├── HttpRequest.py

HTTP请求

创建一个HttpRequest.py

# HttpRequest.py
import requests

class HTTP:
    def get(self,url,return_json=True):
        req = requests.get(url)
        if return_json:
            return req.json()
        else:
            return req.text

这样显然不够健壮,应该加入判断,如果请求返回404的时候的处理方法

# HttpRequest.py
import requests

class HTTP:
    def get(self,url,return_json=True):
        req = requests.get(url)
        if req.status_code == 200:
            if return_json:
                return req.json()
            else:
                return req.text
        else :
            if return_json:
                    return {}
                else:
                    return ''

这样之后确实是逻辑上达到了要求,但是比较冗长,还可以简短一些,并且我们并没有用到self,所以可以使用@staticemthod装饰成静态方法

# HttpRequest.py
import requests

class HTTP:
    @staticmethod
    def get(url,return_json=True):
        req = requests.get(url)
        if req.status_code != 200:          
            return {} if return_json else ''
        return req.json() if return_json else req.text

从API中获取数据

├── static  #静态资源
├── templates
├── fisher.py
├── helper.py
├── HttpRequest.py
├── YuShu_Book.py
#YuShu_Book.py
from HttpRequest import HTTP

class YuShuBook:
    isbn_url = 'http://t.yushu.im/v2/book/isbn/{}'
    keyword_url = 'http://t.yushu.im/v2/book/search?q={}&start={}&count={}'

    @classmethod
    def search_by_isbn(cls,isbn):
        url = cls.isbn_url.format(isbn)
        result = HTTP.get(url)
        #接收一个json数据
        return result

    @classmethod
    def search_by_keyword(cls,keyword):
        url = cls.keyword_url.format(keyword,start=15,count=0)
        result = HTTP.get(url)
        return result

重构app.py

from flask import Flask,jsonify
from yushu_book import YuShuBook
from helper import is_isbn_or_key

app = Flask(__name__)

@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_keyword(q)
    return jsonify(result)  # 因为Respone只允许接收字符串,元组,Response对象,使用jsonify 可以把dict处理成flask.wrappers.Response,就可以成为相应体

@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()

将识图函数拆分到单独文件中

BulePrint将拆分的文件注册到app上,达到拆分的效果
重构了很多东西,所以把每个包里的东西都会列出来

├── app
│    ├── web
│    │    ├── __init_.py
│    │    └── book.py
│    └── __init__.py
├── static 
├── templates
├── fisher.py
├── helper.py
├── HttpRequest.py
├── YuShu_Book.py

首先把和书有关的视图函数抽出来,注册一个web蓝图到app

# web/book.py
from flask import jsonify
from flask import Blueprint

from helper import is_isbn_or_key
from yushu_book import YuShuBook

web = Blueprint('web',__name__)


@web.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_keyword(q)
    return jsonify(result)

然后,将app对象初始化重构,把实例化flask对象,放到__init__里,
然后将蓝本注册到app上,并且把实例化的app对象返回

# app/__init__.py
from flask import Flask

def create_app():
    app = Flask(__name__)
    register_blueprint(app)
    return app

def register_blueprint(app):
    from app.web.book import web
    app.register_blueprint(web)

主函数里调用运行app

#fisher.py
from app import create_app

app = create_app()

@app.route('/')
def hello_world():
    return 'Hello fisher!'

if __name__ == '__main__':
    app.run()

参与评论