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

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

查看所有标签

猜你喜欢:

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

微机原理与接口技术

微机原理与接口技术

李文英、李勤、刘星、宋蕴新 / 清华大学出版社 / 2001-9 / 26.00元

《高等院校计算机应用技术规划教材•应用型教材系列•微机原理与接口技术》是“高职高专计算机系列教材”之一。全书包括微机原理、汇编语言、接口技术三部分内容。微机原理部分讲述了80x86的内部结构及工作原理、半导体存储器及其系统、微型机总线结构等。汇编语言部分讲述了指令系统、编程技巧。接口技术部分讲述了中断系统、中断控制器、并行接口、串行接口、DMA控制器、定时器,以及A/D、D/A转换器等常用芯片的硬......一起来看看 《微机原理与接口技术》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

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

HEX CMYK 互转工具