項目結構
~~~sh
├── static #靜態資源
├── templates
├── fisher.py
~~~
## 首先先構建搜索關鍵字的視圖函數
~~~python
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()
~~~
項目結構
~~~sh
├── static #靜態資源
├── templates
├── fisher.py
├── helper.py
~~~
然后把判斷邏輯抽取出來,放到一個新文件里。
~~~python
#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`,調用方法返回判斷結果
項目結構
~~~sh
├── static #靜態資源
├── templates
├── fisher.py
├── helper.py
├── HttpRequest.py
~~~
## HTTP請求
創建一個`HttpRequest.py`
~~~python
# 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`的時候的處理方法
~~~python
# 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`裝飾成靜態方法
~~~python
# 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中獲取數據
~~~sh
├── static #靜態資源
├── templates
├── fisher.py
├── helper.py
├── HttpRequest.py
├── YuShu_Book.py
~~~
~~~python
#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
~~~
## 重構fisher.py
~~~python
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`上,達到拆分的效果
重構了很多東西,所以把每個包里的東西都會列出來
~~~sh
├── app
│ ├── web
│ │ ├── __init_.py
│ │ └── book.py
│ └── __init__.py
├── static
├── templates
├── fisher.py
├── helper.py
├── HttpRequest.py
├── YuShu_Book.py
~~~
首先把和書有關的視圖函數抽出來,注冊一個`web`藍圖到`app`上
~~~python
# 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`對象返回
~~~python
# 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`
~~~python
#fisher.py
from app import create_app
app = create_app()
@app.route('/')
def hello_world():
return 'Hello fisher!'
if __name__ == '__main__':
app.run()
~~~