## 單藍圖多模塊拆分視圖函數
上一篇后成功將藍圖注冊到`app`上,但是有一個問題是要實現的是單藍圖多模塊拆分視圖函數,這樣肯定是不行的,所以我們將藍圖注冊到`web`下的`__init__.py`下,然后將之前的`book`導入,這樣以后有新的模塊,只需要在`__init__`下導入就可以注冊到`web`這個藍圖下了
~~~python
from flask import Blueprint
web = Blueprint('web', __name__)
from app.web import book
~~~
修改`book.py`內容
~~~python
from flask import jsonify
from . import web
from helper import is_isbn_or_key
from yushu_book import YuShuBook
@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)
~~~
## 將q和page作為get請求傳參
~~~sh
├── app
│ ├──forms
│ │ └── BookForm.py
│ ├── web
│ │ ├── __init_.py
│ │ ├── book.py
│ │ ├── setting.py
│ │ └── secure.py
│ └── __init__.py
├── static
├── templates
├── fisher.py
├── helper.py
├── HttpRequest.py
├── YuShu_Book.py
~~~
首先我們新建兩個配置文件`setting.py`和`secure.py`。
`setting`用于存放一般的配置,如后面用到的`PRE_PAGE`
`secure`用于存放機密配置,如數據庫信息等
`forms`文件夾用于存放所有表單驗證模塊
將`secure.py`,`setting.py`注冊到`app`上
~~~python
#app/__init__.py
from flask import Flask
from app.models.sql_book import db
def create_app():
app = Flask(__name__)
app.config.from_object('app.secure')
app.config.from_object('app.setting')
register_blueprint(app)
return app
def register_blueprint(app):
from app.web import web
app.register_blueprint(web)
~~~
form get參數驗證
~~~python
#BookForm.py
from wtforms import Form,StringField,IntegerField
from wtforms.validators import Length, NumberRange,DataRequired
class SearchForm(Form):
q = StringField(validators=[Length(min=1,max=30),DataRequired()])
#DataRequired()方法要求用戶必須輸入,且不能為空格
page = IntegerField(validators=[NumberRange(min=1,max=99)],default=1)
#設置了page的默認值,如果不穿page參數,則取1
~~~
將驗證模塊導入`book`模塊中,并且講拼接到路徑中的`page`和`q`都改成`get`請求方式
~~~python
from flask import jsonify,request
from . import web
from app.forms.BookForm import SearchForm
from helper import is_isbn_or_key
from yushu_book import YuShuBook
@web.route('/book/search')
def search():
form = SearchForm(request.args)
if form.validate(): #使用驗證其驗證
q = form.q.data.strip()
page = form.page.data
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,page) #這里添加了page參數
print(q)
return jsonify(result)
else: #flask種每個條件下必須有返回否則會報錯
return jsonify({'msg':'參數校驗失敗'})
~~~
重構`yushu_book.py`
~~~python
from HttpRequest import HTTP
from flask import current_app
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)
return result
@classmethod
def search_by_keyword(cls,keyword,page=1):
url = cls.keyword_url.format(keyword,cls.get_start_page(page),current_app.config['PRE_PAGE'])
result = HTTP.get(url)
return result
@staticmethod
def get_start_page(page):
return (page-1) * current_app.config['PRE_PAGE'] #從第0頁開始
~~~
到此就可以完成基本的`isbn`請求獲取數據和`關鍵字`請求獲取參數
## 測試
`isbn:http://127.0.0.1:5000/book/search?q=9787501524044`
[](https://oss.miaoroom.com/wp-content/uploads/2019/02/ys_book_isbn.png)
`keyword:http://127.0.0.1:5000/book/search?q=郭敬明`
[](https://oss.miaoroom.com/wp-content/uploads/2019/02/ys_book_keyword.png)
## 模塊分類
在`app`文件夾下創建三個新的文件夾`spider`,`models`和`libs`
將對應的模塊放入相應的文件夾下,新目錄結構如下
~~~sh
├── app
│ ├──forms
│ │ └── BookForm.py
│ ├── web
│ │ ├── __init_.py
│ │ ├── book.py
│ │ ├── setting.py
│ │ └── secure.py
│ ├──libs
│ │ ├── helper.py
│ │ └── HttpRequest.py
│ ├──spider
│ │ └── yushu_book.py
│ ├──models
│ │ └── sql_book.py
│ └── __init__.py
├── static
├── templates
├── fisher.py
~~~
## 數據庫操作
在`sql_book.py`下創建數據庫模型
~~~python
from sqlalchemy import Column,Integer,String
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Book(db.Model):
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(50),nullable=False)
author = Column(String(30),default='未名')
binding = Column(String(20))
publisher = Column(String(50))
price = Column(String(20))
pages = Column(Integer)
pubdate = Column(String(20))
isbn = Column(String(15),nullable=False,unique=True)
summary = Column(String(1000))
image = Column(String(50))
~~~
在`secure.py`下添加數據庫連接配置
~~~python
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@localhost:3306/fisher'
SQLALCHEMY_TRACK_MODIFICATIONS = True
~~~
然后將 `db`注冊到`app`中
~~~python
#app/__init__.py
from flask import Flask
from app.models.sql_book import db
def create_app():
app = Flask(__name__)
app.config.from_object('app.secure')
app.config.from_object('app.setting')
register_blueprint(app)
db.init_app(app)
db.create_all(app=app)
return app
def register_blueprint(app):
from app.web import web
app.register_blueprint(web)
~~~
執行`app`后就可以在`fisher`中看到`book`表