「Flask實戰」flask魚書項目實戰二

「Flask實戰」flask魚書項目實戰二

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

flask-python

flask魚書項目實戰


單藍圖多模塊拆分視圖函式

上一篇後成功將藍圖註冊到app上,但是有一個問題是要實現的是單藍圖多模塊拆分視圖函式,這樣肯定是不行的,所以我們將藍圖註冊到web下的init.py下,然後將之前的book導入,這樣以後有新的模塊,只需要在init下導入就可以註冊到web這個藍圖下了

from flask import Blueprint

web = Blueprint('web', __name__)

from app.web import book

修改book.py內容

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請求傳參

├── 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.pysecure.py
setting用於存放一般的配置,如後面用到的PRE_PAGE
secure用於存放機密配置,如數據庫信息等
forms文件夾用於存放所有表單驗證模塊
secure.py,setting.py註冊到app

#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參數驗證

#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模塊中,並且講拼接到路徑中的pageq都改成get請求方式

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

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

「Flask實戰」flask魚書項目實戰二

keyword:http://127.0.0.1:5000/book/search?q=郭敬明

「Flask實戰」flask魚書項目實戰二

模塊分類

app文件夾下創建三個新的文件夾spider,modelslibs
將對應的模塊放入相應的文件夾下,新目錄結構如下

├── 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下創建數據庫模型

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下添加數據庫連接配置

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@localhost:3306/fisher'
SQLALCHEMY_TRACK_MODIFICATIONS = True

然後將 db註冊到app

#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

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

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