摘要:簡單回顧與使用大型組織結(jié)構(gòu)的區(qū)別,狗書中從第八章的實例后都采用了藍本的方式處理路由。故無法顯示表單或者文章列表。表示與收藏關(guān)系的關(guān)聯(lián)表,使用模型表示。最后放幾張總結(jié)的腦圖和自己基于狗書上的修改輕博客。地址狗書上總結(jié)的腦圖
簡單回顧hello.py與使用大型組織結(jié)構(gòu)的區(qū)別,狗書中從第八章的實例后都采用了藍本的方式處理路由。
import #導(dǎo)入 ---- {分別導(dǎo)入} basedir = os.path.abspath(os.path.dirname(__file__)) app = Flask(__name__) #初始化程序 app.config["SECRET_KEY"] = "hard to guess string" #配置 -----{config.py} migrate = Migrate(app, db) manager = Manager(app) #將app連接各個庫的初始化 -----{migrate和manager放在manage.py的啟動程序上} bootstrap = Bootstrap(app) #將app連接各個庫的初始化 ------{放在app/__init__.py初始化上} class NameForm(Form): #定義表單 ------{在app/main/forms.py} class Role(db.Model): class User(db.Model): #定義模型 -------{在app/models.py} def make_shell_context(): #集成Python shell -------{manage.py啟動程序上} def send_async_email(app, msg): def send_email(to, subject, template, **kwargs): #異步發(fā)送郵件 ------{app/email.py上} @app.errorhandler(404) @app.errorhandler(500) #處理返回錯誤模板 ------{app/main/errors.py} @app.route("/", methods=["GET", "POST"]) @app.route("/user/") #定義視圖函數(shù) ------{app/main/view.py}
書上的內(nèi)容跟著敲就好了,這里簡單分享看狗書過程踩的一些小坑和增加一個收藏功能的實現(xiàn)過程
遇到的一些坑:數(shù)據(jù)遷移db upgrade不起作用,更新現(xiàn)有數(shù)據(jù)庫表的粗暴方式是先刪除舊表再重新創(chuàng)建
>>> from manage import db db.drop_all() db.create_all() exit()
第八章代碼配置發(fā)送郵箱的代碼,原代碼里的谷歌郵箱已經(jīng)不能用了(授權(quán)碼有時會自動更新)
class Config: SECRET_KEY = os.environ.get("SECRET_KEY") or "hard to guess string" SQLALCHEMY_COMMIT_ON_TEARDOWN = True SQLALCHEMY_TRACK_MODIFICATIONS = False MAIL_SERVER = "smtp.qq.com" MAIL_PORT = 465 MAIL_USE_TLS = False MAIL_USE_SSL = True MAIL_USERNAME = "[email protected]" MAIL_PASSWORD = "自己郵箱的授權(quán)碼" FLASKY_MAIL_SUBJECT_PREFIX = "[Flasky]" FLASKY_MAIL_SENDER = "Admin <[email protected]>" FLASKY_ADMIN = "[email protected]"
flask web第11章節(jié)遇到博文表單不顯示出來
主要是因為在Role沒有建立起來的時候(此時在python manage.py shell中,執(zhí)行Role.query.all()應(yīng)該得到的是[]),你就先注冊了用戶,那么此時你的用戶角色肯定什么都不是。 故無法顯示表單或者文章列表。因此你需要:首先在python manage.py shell中執(zhí)行Role.insert_roles(), 查詢Role.query.all()之后確保得到的結(jié)果是[
from manage.py import db db.drop_all() db.create_all()
鏈接:https://www.zhihu.com/questio...
簡單實現(xiàn)一個收藏功能:希望在狗書的基礎(chǔ)上給每條博客增加一個收藏按鈕,然后在導(dǎo)航欄增加一行“我的收藏”來顯示用戶收藏的那些博客,下圖是我自己改的收藏頁面。
首先我們要在博客上增加一個收藏/取消收藏按鈕,如果未收藏則顯示“收藏”,已經(jīng)收藏了則顯示“未收藏”,改動放在需要被渲染的_post.html獨立頁面上
div class="post-content">{{ moment(post.timestamp).fromNow() }}...
判斷是否已經(jīng)收藏過的方法.is_saving(post)需要被寫進User模型里,所以我們要考慮一下如何更新Model部分。首先考慮到一個user可以收藏多個post,一個post也可以被不同的user收藏,所以這是一個多對多的關(guān)系。多對多關(guān)系可以使用定義一對多關(guān)系的 db.relationship() 方法進行定義,但是這樣定義得到的關(guān)聯(lián)表是一個簡單的表,不是模型,會被SQLAlchemy 自動接管。想要儲存一些額外的信息,例如user收藏post的時間。為了能處理這些額外的信息,我們必須提升關(guān)聯(lián)表的地位,使關(guān)聯(lián)表變成可訪問的模型。表示user與post收藏關(guān)系的關(guān)聯(lián)表,使用 Save 模型表示。
class Save(db.Model): __tablename__ = "saves" saver_id = db.Column(db.Integer, db.ForeignKey("users.id"), primary_key=True) saved_id = db.Column(db.Integer, db.ForeignKey("posts.id"), primary_key=True) timestamp = db.Column(db.DateTime, default=datetime.utcnow) class User(UserMixin, db.Model):#一個用戶可以收藏多篇博客 saveds表示被收藏的博客們 ... saveds = db.relationship("Save", backref=db.backref("saver", lazy="joined"), lazy="dynamic", cascade="all, delete-orphan") class Post(db.Model): #一篇博客可以被多個用戶收藏 savers表示收藏這條博客的用戶們 ... savers = db.relationship("Save", backref=db.backref("saved", lazy="joined"), lazy="dynamic", cascade="all, delete-orphan")
另外.is_saving(post)方法也需要寫進User模型里來進行判斷當前這個用戶是否已經(jīng)收藏過這篇博客
class User(UserMixin, db.Model): #self表示當前用戶在收藏過得博客們里找特定的post ... def is_saving(self, post): return self.saveds.filter_by( saved_id=post.id).first() is not None
根據(jù)html里面的內(nèi)容,如果已經(jīng)收藏過返回true則顯示“取消收藏”按鈕并返回main.unsave路由;反之則返回main.save路由。這兩個路由是來實現(xiàn)收藏博客/取消收藏博客這兩個功能并將數(shù)據(jù)寫進數(shù)據(jù)庫里,這樣我們下次才能從數(shù)據(jù)庫里查詢用戶是否收藏過此博客并給出相應(yīng)的反應(yīng)。
@main.route("/save/") @login_required def save(postid): post = Post.query.filter_by(id=postid).first() if post is None: flash("Invalid post.") return redirect(url_for(".index")) current_user.savepost(post) #用戶收藏post的方法 flash("You saved a message") return redirect(url_for(".post", id=postid)) @main.route("/unsave/ ") @login_required def unsave(postid): post = Post.query.filter_by(id=postid).first() if post is None: flash("Invalid post.") return redirect(url_for(".index")) current_user.unsavepost(post) #用戶取消收藏post的方法 flash("You unsaved a message") return redirect(url_for(".post", id=postid))
用戶收藏/取消收藏post的方法的需要寫進User模型里
class User(UserMixin, db.Model): ... def savepost(self, post): if not self.is_saving(post): f = Save(saver=self, saved=post) db.session.add(f) def unsavepost(self, post): f = self.saveds.filter_by(saved_id=post.id).first() if f: db.session.delete(f)
到這里,我們還需要在導(dǎo)航欄里設(shè)置一個Pocket導(dǎo)航元素來顯示所有被收藏的博客,并將內(nèi)容寫成分頁顯示出來
base.html加入導(dǎo)航元素Pocket,點擊后返回main.pocket路由
@main.route("/pocket", methods=["GET", "POST"]) def pocket(): page = request.args.get("page", 1, type=int) show_saved = True query = current_user.saved_posts #獲得所有收藏posts的方法 pagination = query.order_by(Post.timestamp.desc()).paginate( page, per_page=current_app.config["FLASKY_POCKETS_PER_PAGE"], error_out=False) posts = pagination.items return render_template("pocket.html", posts=posts, show_save=show_saved, pagination=pagination)
所以我們還需要在User再加一個.save_posts方法來獲取所有收藏的文章展示在pocket.html里
class User(UserMixin, db.Model): ... @property def saved_posts(self): #聯(lián)結(jié)查詢,Post為最后獲取內(nèi)容,從Save查詢用戶id的所有收藏記錄,最后聯(lián)結(jié)過濾 return db.session.query(Post).select_from(Save). filter_by(saver_id=self.id).join(Post)
最后只需要在pocket.html渲染就好了。
這段時間都在寫研究生要投的期刊論文,flask只是抽空自己學(xué)學(xué),以后會更新自己專業(yè)領(lǐng)域的多目標優(yōu)化內(nèi)容和智能算法,很多地方可能沒講清楚,但最要的是能讓自己更好的理解。最后放幾張總結(jié)的腦圖和自己基于狗書上的修改輕博客。主要是換了一些板式,增加圖片上傳,匿名評論和收藏功能。
github地址:https://github.com/kugua233/L...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41565.html
簡易的內(nèi)存監(jiān)控系統(tǒng) 本文需要有一定的python和前端基礎(chǔ),如果沒基礎(chǔ)的,請關(guān)注我后續(xù)的基礎(chǔ)教程系列博客 文章源地址,還可以看到具體的代碼,喜歡請加個星星 騰訊視頻鏈接 錄制中間網(wǎng)出問題了,重啟了一下,所以有兩部分 視頻1 視頻2 本文的目的在于,盡可能用簡單的代碼,讓大家了解內(nèi)存監(jiān)控的原理主題思路 獲取內(nèi)存信息 存儲信息 展現(xiàn) 后續(xù)擴展 加主機名,monitor部署在多臺機器,不直接插...
簡易的內(nèi)存監(jiān)控系統(tǒng) 本文需要有一定的python和前端基礎(chǔ),如果沒基礎(chǔ)的,請關(guān)注我后續(xù)的基礎(chǔ)教程系列博客 文章源地址,還可以看到具體的代碼,喜歡請加個星星 騰訊視頻鏈接 錄制中間網(wǎng)出問題了,重啟了一下,所以有兩部分 視頻1 視頻2 本文的目的在于,盡可能用簡單的代碼,讓大家了解內(nèi)存監(jiān)控的原理主題思路 獲取內(nèi)存信息 存儲信息 展現(xiàn) 后續(xù)擴展 加主機名,monitor部署在多臺機器,不直接插...
馬上就要開始啦這次共組織15個組隊學(xué)習(xí) 涵蓋了AI領(lǐng)域從理論知識到動手實踐的內(nèi)容 按照下面給出的最完備學(xué)習(xí)路線分類 難度系數(shù)分為低、中、高三檔 可以按照需要參加 - 學(xué)習(xí)路線 - showImg(https://segmentfault.com/img/remote/1460000019082128); showImg(https://segmentfault.com/img/remote/...
摘要:將指定的數(shù)字索引值轉(zhuǎn)換成字符串索引值變成,然后將其作為屬性名來用。返回一個由刪除元素組成的數(shù)組。該方法返回的數(shù)組元素是調(diào)用的數(shù)組的一個子集。使用的函數(shù)有四個參數(shù)初始值積累值數(shù)組元素元素索引數(shù)組本身。 前言 很多人在學(xué)習(xí)原生JS的過程中會遇到一些疑惑,比如在學(xué)習(xí)array時,就很容易搞不清哪些方法會改變原來數(shù)組,哪些方法不會改變原來數(shù)組?再比如很多人會使用new Date()獲取時間,卻...
摘要:我們通常稱之為狀態(tài)管理模式,用于解決組件間通信的以及多組件共享狀態(tài)等問題。創(chuàng)建指定命名空間的輔助函數(shù),總結(jié)的功能首先分為兩大類自己的實例使用為組件中使用便利而提供的輔助函數(shù)自己內(nèi)部對數(shù)據(jù)狀態(tài)有兩種功能修改數(shù)據(jù)狀態(tài)異步同步。 what is Vuex ? 這句話我想每個搜索過Vuex官網(wǎng)文檔的人都看到過, 在學(xué)習(xí)源碼前,當然要有一些前提條件了。 了解Vuex的作用,以及他的使用場景。 ...
閱讀 2091·2021-11-23 10:13
閱讀 2799·2021-11-09 09:47
閱讀 2743·2021-09-22 15:08
閱讀 3323·2021-09-03 10:46
閱讀 2239·2019-08-30 15:54
閱讀 921·2019-08-28 18:09
閱讀 2433·2019-08-26 18:26
閱讀 2346·2019-08-26 13:48