摘要:簡單回顧與使用大型組織結構的區別,狗書中從第八章的實例后都采用了藍本的方式處理路由。故無法顯示表單或者文章列表。表示與收藏關系的關聯表,使用模型表示。最后放幾張總結的腦圖和自己基于狗書上的修改輕博客。地址狗書上總結的腦圖
簡單回顧hello.py與使用大型組織結構的區別,狗書中從第八章的實例后都采用了藍本的方式處理路由。
import #導入 ---- {分別導入} 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): #異步發送郵件 ------{app/email.py上} @app.errorhandler(404) @app.errorhandler(500) #處理返回錯誤模板 ------{app/main/errors.py} @app.route("/", methods=["GET", "POST"]) @app.route("/user/") #定義視圖函數 ------{app/main/view.py}
書上的內容跟著敲就好了,這里簡單分享看狗書過程踩的一些小坑和增加一個收藏功能的實現過程
遇到的一些坑:數據遷移db upgrade不起作用,更新現有數據庫表的粗暴方式是先刪除舊表再重新創建
>>> from manage import db db.drop_all() db.create_all() exit()
第八章代碼配置發送郵箱的代碼,原代碼里的谷歌郵箱已經不能用了(授權碼有時會自動更新)
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 = "123456789@qq.com" MAIL_PASSWORD = "自己郵箱的授權碼" FLASKY_MAIL_SUBJECT_PREFIX = "[Flasky]" FLASKY_MAIL_SENDER = "Admin <123456789@qq.com>" FLASKY_ADMIN = "123456789@qq.com"
flask web第11章節遇到博文表單不顯示出來
主要是因為在Role沒有建立起來的時候(此時在python manage.py shell中,執行Role.query.all()應該得到的是[]),你就先注冊了用戶,那么此時你的用戶角色肯定什么都不是。 故無法顯示表單或者文章列表。因此你需要:首先在python manage.py shell中執行Role.insert_roles(), 查詢Role.query.all()之后確保得到的結果是[
from manage.py import db db.drop_all() db.create_all()
鏈接:https://www.zhihu.com/questio...
簡單實現一個收藏功能:希望在狗書的基礎上給每條博客增加一個收藏按鈕,然后在導航欄增加一行“我的收藏”來顯示用戶收藏的那些博客,下圖是我自己改的收藏頁面。
首先我們要在博客上增加一個收藏/取消收藏按鈕,如果未收藏則顯示“收藏”,已經收藏了則顯示“未收藏”,改動放在需要被渲染的_post.html獨立頁面上
div class="post-content">{{ moment(post.timestamp).fromNow() }}...
判斷是否已經收藏過的方法.is_saving(post)需要被寫進User模型里,所以我們要考慮一下如何更新Model部分。首先考慮到一個user可以收藏多個post,一個post也可以被不同的user收藏,所以這是一個多對多的關系。多對多關系可以使用定義一對多關系的 db.relationship() 方法進行定義,但是這樣定義得到的關聯表是一個簡單的表,不是模型,會被SQLAlchemy 自動接管。想要儲存一些額外的信息,例如user收藏post的時間。為了能處理這些額外的信息,我們必須提升關聯表的地位,使關聯表變成可訪問的模型。表示user與post收藏關系的關聯表,使用 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模型里來進行判斷當前這個用戶是否已經收藏過這篇博客
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
根據html里面的內容,如果已經收藏過返回true則顯示“取消收藏”按鈕并返回main.unsave路由;反之則返回main.save路由。這兩個路由是來實現收藏博客/取消收藏博客這兩個功能并將數據寫進數據庫里,這樣我們下次才能從數據庫里查詢用戶是否收藏過此博客并給出相應的反應。
@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)
到這里,我們還需要在導航欄里設置一個Pocket導航元素來顯示所有被收藏的博客,并將內容寫成分頁顯示出來
base.html加入導航元素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): #聯結查詢,Post為最后獲取內容,從Save查詢用戶id的所有收藏記錄,最后聯結過濾 return db.session.query(Post).select_from(Save). filter_by(saver_id=self.id).join(Post)
最后只需要在pocket.html渲染就好了。
這段時間都在寫研究生要投的期刊論文,flask只是抽空自己學學,以后會更新自己專業領域的多目標優化內容和智能算法,很多地方可能沒講清楚,但最要的是能讓自己更好的理解。最后放幾張總結的腦圖和自己基于狗書上的修改輕博客。主要是換了一些板式,增加圖片上傳,匿名評論和收藏功能。
github地址:https://github.com/kugua233/L...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41565.html
簡易的內存監控系統 本文需要有一定的python和前端基礎,如果沒基礎的,請關注我后續的基礎教程系列博客 文章源地址,還可以看到具體的代碼,喜歡請加個星星 騰訊視頻鏈接 錄制中間網出問題了,重啟了一下,所以有兩部分 視頻1 視頻2 本文的目的在于,盡可能用簡單的代碼,讓大家了解內存監控的原理主題思路 獲取內存信息 存儲信息 展現 后續擴展 加主機名,monitor部署在多臺機器,不直接插...
簡易的內存監控系統 本文需要有一定的python和前端基礎,如果沒基礎的,請關注我后續的基礎教程系列博客 文章源地址,還可以看到具體的代碼,喜歡請加個星星 騰訊視頻鏈接 錄制中間網出問題了,重啟了一下,所以有兩部分 視頻1 視頻2 本文的目的在于,盡可能用簡單的代碼,讓大家了解內存監控的原理主題思路 獲取內存信息 存儲信息 展現 后續擴展 加主機名,monitor部署在多臺機器,不直接插...
馬上就要開始啦這次共組織15個組隊學習 涵蓋了AI領域從理論知識到動手實踐的內容 按照下面給出的最完備學習路線分類 難度系數分為低、中、高三檔 可以按照需要參加 - 學習路線 - showImg(https://segmentfault.com/img/remote/1460000019082128); showImg(https://segmentfault.com/img/remote/...
摘要:將指定的數字索引值轉換成字符串索引值變成,然后將其作為屬性名來用。返回一個由刪除元素組成的數組。該方法返回的數組元素是調用的數組的一個子集。使用的函數有四個參數初始值積累值數組元素元素索引數組本身。 前言 很多人在學習原生JS的過程中會遇到一些疑惑,比如在學習array時,就很容易搞不清哪些方法會改變原來數組,哪些方法不會改變原來數組?再比如很多人會使用new Date()獲取時間,卻...
摘要:我們通常稱之為狀態管理模式,用于解決組件間通信的以及多組件共享狀態等問題。創建指定命名空間的輔助函數,總結的功能首先分為兩大類自己的實例使用為組件中使用便利而提供的輔助函數自己內部對數據狀態有兩種功能修改數據狀態異步同步。 what is Vuex ? 這句話我想每個搜索過Vuex官網文檔的人都看到過, 在學習源碼前,當然要有一些前提條件了。 了解Vuex的作用,以及他的使用場景。 ...
閱讀 2078·2021-11-23 10:13
閱讀 2788·2021-11-09 09:47
閱讀 2737·2021-09-22 15:08
閱讀 3312·2021-09-03 10:46
閱讀 2230·2019-08-30 15:54
閱讀 909·2019-08-28 18:09
閱讀 2429·2019-08-26 18:26
閱讀 2341·2019-08-26 13:48