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

栏目: Python · 发布时间: 5年前

内容简介:项目结构

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

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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Impractical Python Projects

Impractical Python Projects

Lee Vaughan / No Starch Press / 2018-11 / USD 29.95

Impractical Python Projects picks up where the complete beginner books leave off, expanding on existing concepts and introducing new tools that you’ll use every day. And to keep things interesting, ea......一起来看看 《Impractical Python Projects》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具