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

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

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

flask魚書項目實戰


jinja2範本

有關jinja2範本的詳細可以看我以前的文章
所有靜態文件在文末分享,只需要按照文件名替換即可(鏈接掉了聯繫我)
替換範本文件後還是不能直接用return render_template('search_result.html', books=books)去直接回顯頁面的,因為頁面上一些業務邏輯還沒有實現,所以還需要修改一下代碼

修改方案

首先把文件包下原始文件下的statictemplates下的文件替換,然後獎web文件下除了book外五個文件複製到自己目錄下的web文件夾下。並且在web目錄下的__init__.py把導入的五個藍圖註冊上去,然後在web/book.py下添加一個視圖函式

@web.route('/book/<isbn>/detail')
def book_detail(isbn):
    pass

最後,在範本文件中找到base.html將71行到79行注釋掉,即這一段注釋掉

        {% if not current_user.is_authenticated %}
            <div style="float:right">
                <a href="{{ url_for('web.login') }}">登錄</a>
                <a style="margin-left: 40px;" href="{{ url_for('web.register') }}">註冊</a>
            </div>
        {% else %}
            <a href="{{ url_for('web.personal_center') }}">{{ current_user.nickname }}的魚書</a>
            <a style="margin-left: 40px;" href="{{ url_for('web.logout') }}">註銷</a>
        {% endif %}

這樣修改完成後即可去訪問看到效果

消息閃現、SecretyKey與變數作用域

官方文檔

Flask 提供了一個非常簡單的方法來使用閃現系統向使用者反饋信息。閃現系統使得在一個請求結束的時候記錄一個信息,然後在且僅僅在下一個請求中訪問這個數據。

1.在視圖函式中配置閃現消息

flash("hello,wenfeng", category="success")
flash("hello,jiagndan", category="warning")

2.在html中使用閃現消息

{% set message = get_flashed_messages() %}
{{ message }}

使用set創建變數,這時的變數作用於在整個block

{% with message = get_flashed_messages() %}
{{ message }}
{% endwith %}

使用with關鍵字,可以隨意控制作用域

viewmodel意義的體現filter的應用

在搜尋書籍頁面里,需要將作者信息,出版社,價格展示在一行,以 / 分割,因為這些信息有可能為空,所以需要對傳入的數據進行處理,在html範本里處理不太方便。我們選擇將這些數據處理的工作放在viewmodel中,很容易想到if-else但是python提供了更優雅的處理方法filter

# @property註解可以讓我們把一個方法當做一個屬性來使用
@property
#利用三元表達式 + filter 可以很優雅的進行數據的篩選。
intros = filter(lambda x: True if x else False,[self.author[0], self.publisher[0], self.price[0]])
return ' / '.join(intros)

實現書籍詳情頁

看到yushu_book.py這裡傳出去的數據都是一個列表的形式,所以我們可以在接收的時候使用yushu_book[0]這種形式,顯然不夠好,使用者並不知道內部的結構,所以我們應該編寫一個對使用者體驗更良好的接口來返回列表中的第一條數據。

#spider/yushu_book.py

class BookViewModle:
    def __init__(self,book):
        self.title = book['title']
        self.publisher= book['publisher']
        self.pages= book['pages']
        self.price = book['price']
        self.author = '、'.join(book['author'])
        self.summary = book['summary']
        self.isbn = book['isbn']
        self.image= book['image']

    @property
    def intro(self):
        intros = filter(lambda x: True if x else False,[self.author,self.publisher,self.price])

        return ' / '.join(intros)

這樣就可以使用yushu.book.first來得到列表中的第一條數據

然後在詳情頁面調用來得到數據

#web/book.py

@web.route('/book/<isbn>/detail')
def book_detail(isbn):
    yushu_book = YuShuBook()
    #因為isbn編號是唯一的所以通過isbn來確定書籍
    yushu_book.search_by_isbn(isbn)
    book = BookViewModle(yushu_book.first)

    #這裡的wishes喝gifts先傳入空列表讓他正常回顯,後面在進行賦值
    return render_template('book_detail.html',book = book,wishes = [],gifts = [])

贈送書籍

models新建三個py文件base.py,gift.py,user.py
base.py用來存放模型中公共的數據,user.py用來存放user模型
gitf.py用來創建user和book的對應關係

#base.py

db = SQLAlchemy()

把實例化抽取,別忘了在sql_book.py中導入

#user.py
from sqlalchemy import Column, Integer, Float, String, Boolean

from app.models.base import db


class User(db.Model):
    id = Column(Integer, primary_key=True)
    nickname = Column(String(24), nullable=False)
    phone_number = Column(String(18), unique=True)
    email = Column(String(50), unique=True, nullable=False)
    confirmed = Column(Boolean, default=False)
    beans = Column(Float, default=0)
    send_counter = Column(Integer, default=0)
    receive_counter = Column(Integer, default=0)
    wx_open_id = Column(String(50))
    wx_name = Column(String(32))
#gitf.py
from app.models.base import db
from sqlalchemy import Column, String, Integer, ForeignKey, Boolean
from sqlalchemy.orm import relationships


class Gift(db.Model):
    id = Column(Integer, primary_key=True, autoincrement=True)
    # relationships表示管理關係
    user = relationships('User')
    # ForeignKey定義外鍵約束
    uid = Column(Integer, ForeignKey('user.id'))
    # 書籍我們記錄isbn編號,因為書籍信息是從網路獲取的
    isbn = Column(String(15), nullable=True)
    # 是否已經贈送出去
    launched = Column(Boolean, default=False)

gift.py添加軟刪除

class Gift(db.Model):
    id = Column(Integer, primary_key=True, autoincrement=True)
    user = relationships('User')
    uid = Column(Integer, ForeignKey('user.id'))
    isbn = Column(String(15), nullable=True)
    launched = Column(Boolean, default=False
    #添加一條軟刪除,如果為0則表示被刪除
    status = Column(SmallInteger, default=1)

軟刪除應該在所有數據表中都存在,所以應該把他放在base.py中,讓其他表都繼承它。

自訂基類模型

像標誌位這樣的參數,每個表裡都有同樣的屬性,我們應該建立一個基類,來存儲這些共有屬性

#models/base.py

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column,Integer, SmallInteger

db = SQLAlchemy()


class Base(db.Model):
    create_time = Column('create_time',Integer)
    status = Column(SmallInteger, default=1)

然後修改sql_user.py,sql_book.py,sql_gift.py將它們的繼承db.Modle改為繼承base就可以完成繼承了。

文件包

鏈接:https://pan.baidu.com/s/18d_vYQlvqi0zJuOtQaMv7Q
提取碼:f5zp
複製這段內容後打開百度網盤手機App,操作更方便哦

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

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