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

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

查看所有标签

猜你喜欢:

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

豆瓣,流行的秘密

豆瓣,流行的秘密

黄修源 / 机械工业出版社 / 2009-9 / 29.00

380万人为何会齐聚豆瓣? HIN1和SARS是如何传播扩散开的? 贾君鹏何以快速窜红网络? 通过创新扩散的理论的分析和说明,给出了所有这些问题的答案! 这本书从豆瓣的流行现象说开来,应用了创新扩散等传播学道理来解释了豆瓣如何流行起来,同时作者还同时用创新扩散的理论解释了为何会出现世界变平的现象,长尾理论,SARS病毒的高速传播等。 作者以前任豆瓣设计师的身份以自己亲......一起来看看 《豆瓣,流行的秘密》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具