jinja2範本
有關jinja2範本的詳細可以看我以前的文章
所有靜態文件在文末分享,只需要按照文件名替換即可(鏈接掉了聯繫我)
替換範本文件後還是不能直接用return render_template('search_result.html', books=books)
去直接回顯頁面的,因為頁面上一些業務邏輯還沒有實現,所以還需要修改一下代碼
修改方案
首先把文件包下原始文件下的static
喝templates
下的文件替換,然後獎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,操作更方便哦