項目結構
├── 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()