「Flask實戰」魚書項目實戰一

「Flask實戰」魚書項目實戰一

資源介紹參數
資源類別: Python
如遇問題: 聯繫客服/留言反饋
釋放雙眼,帶上耳機,聽聽看~!

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 ''

這樣之後確實是邏輯上達到了要求,但是比較冗長,還可以簡短一些,並且我們並沒有用到code>self,所以可以使用@staticemthod</code裝飾成靜態方法

# 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()
聲明:本文為原創作品,版權歸作者所有。未經許可,不得轉載或用於任何商業用途。如若本站內容侵犯了原著者的合法權益,可聯繫我們進行處理。

給TA打賞
共{{data.count}}人
人已打賞
0 條回復 A文章作者 M管理員
    暫無討論,說說你的看法吧