Flask Web DEvelopment翻譯12

第十三章 用戶評論

允許用戶互動交流時社交博客平臺成功的關(guān)鍵。在本章中常遂,我們將學(xué)習(xí)如何實現(xiàn)用戶評論功能纳令。這一技術(shù)可以直接應(yīng)用到大型的社交程序當(dāng)中。

準(zhǔn)備評論數(shù)據(jù)庫

評論和普通博客文章沒有什么不同,同樣有內(nèi)容平绩,作者和時間戳圈匆,在這個部分中都是使用了Markdown語法寫的。圖13-1展示了數(shù)據(jù)庫中comments表和其他表的關(guān)系:

Paste_Image.png

評論是針對特定的博客文章的捏雌,所以在posts表中需要定義一個一對多關(guān)系跃赚。我們將使用這個關(guān)系來獲取指定文章的所有相關(guān)評論列表。
comment表和users表組成了一對多的關(guān)系性湿。通過這一關(guān)系我們可以獲取某一用戶的所有評論纬傲,統(tǒng)計他寫了多少評論,等一些信息都可以展示在用戶屬性頁面上肤频。Comment模型的定義如下(13-1)所示:

Example 13-1. app/models.py: Comment model
class Comment(db.Model):
    __tablename__ = 'comments'
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.Text)
    body_html = db.Column(db.Text)
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    disabled = db.Column(db.Boolean)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    post_id = db.Column(db.Integer, db.ForeignKey('posts.id'))
    @staticmethod
    def on_changed_body(target, value, oldvalue, initiator):
        allowed_tags = ['a', 'abbr', 'acronym', 'b', 'code', 'em', 'i','strong']
        target.body_html = bleach.linkify(bleach.clean(markdown(value, output_format='html'),
        tags=allowed_tags, strip=True))
    db.event.listen(Comment.body, 'set', Comment.on_changed_body)

comment模型的屬性跟post模型基本一樣叹括,但添加了一個disabled字段,通過設(shè)置它的boolean值宵荒,版主可以禁止或屏蔽攻擊性和不合適的言論汁雷。就像對博客文章的處理那樣,評論也定義了一個事件觸發(fā)器报咳,當(dāng)body字段變更時摔竿,就會自動把markdown文本轉(zhuǎn)換成HTML。這一流程跟我們在第十一章中對博客文章的處理一樣少孝,但由于評論的內(nèi)容通常較短,markdown轉(zhuǎn)換過程中允許的html標(biāo)記更少熬苍,段落標(biāo)記被移除了稍走,只留下了字符格式化標(biāo)記。
  為了完成數(shù)據(jù)庫更改柴底,User和Post模型也都需要和comments表建立一對多關(guān)系婿脸,如例子13-2所示:

Example 13-2. app/models/user.py: One-to-many relationships from users and posts to comments
class User(db.Model):
    # ...
    comments = db.relationship('Comment', backref='author', lazy='dynamic')
class Post(db.Model):
    # ...
    comments = db.relationship('Comment', backref='post', lazy='dynamic')

提交并顯示Comment

在本程序中,我們在第十一章中通過添加永久鏈接柄驻,在單獨頁面中顯示了博客文章評論狐树,評論也在這一頁面顯示。同時鸿脓,這頁上也包含了一個表單用來提交評論抑钟。例子13-3顯示了用來輸入評論的web表單——只包含一個簡單的文本域和一個提交按鈕。

Example 13-3. app/main/forms.py: Comment input form
class CommentForm(Form):
    body = StringField('', validators=[Required()])
    submit = SubmitField('Submit')

例子13-4展示了更新后的路由設(shè)置野哭,通過/post/<int:id>支持評論

Example 13-4. app/main/views.py: Blog post comments support
@main.route('/post/<int:id>', methods=['GET', 'POST'])
def post(id):
    post = Post.query.get_or_404(id)
    form = CommentForm()
    if form.validate_on_submit():
        comment = Comment(body=form.body.data,post=post,

author=current_user._get_current_object())
db.session.add(comment)
flash('Your comment has been published.')
return redirect(url_for('.post', id=post.id, page=-1))
page = request.args.get('page', 1, type=int)
if page == -1:
page = (post.comments.count() - 1) /
current_app.config['FLASKY_COMMENTS_PER_PAGE'] + 1
pagination = post.comments.order_by(Comment.timestamp.asc()).paginate(
page, per_page=current_app.config['FLASKY_COMMENTS_PER_PAGE'],
error_out=False)
comments = pagination.items
return render_template('post.html', posts=[post], form=form,
comments=comments, pagination=pagination)
該視圖函數(shù)實例化評論表單并將其發(fā)送到post.html模板進(jìn)行顯示在塔。當(dāng)提交表單時,加入一個新評論的邏輯流程類似于對博客文章的處理拨黔。如同在Post例子中那樣蛔溃,評論的author不能直接設(shè)置成current_user,因為這個變量是一個上下文代理對象。表達(dá)式current_user._get_current_object()返回的是實際的User對象贺待。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徽曲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子麸塞,更是在濱河造成了極大的恐慌秃臣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喘垂,死亡現(xiàn)場離奇詭異甜刻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)正勒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門得院,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人章贞,你說我怎么就攤上這事祥绞。” “怎么了鸭限?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵蜕径,是天一觀的道長。 經(jīng)常有香客問我败京,道長兜喻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任赡麦,我火速辦了婚禮朴皆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泛粹。我一直安慰自己遂铡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布晶姊。 她就那樣靜靜地躺著扒接,像睡著了一般。 火紅的嫁衣襯著肌膚如雪们衙。 梳的紋絲不亂的頭發(fā)上钾怔,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音砍艾,去河邊找鬼蒂教。 笑死,一個胖子當(dāng)著我的面吹牛脆荷,可吹牛的內(nèi)容都是我干的凝垛。 我是一名探鬼主播懊悯,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梦皮!你這毒婦竟也來了炭分?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剑肯,失蹤者是張志新(化名)和其女友劉穎捧毛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體让网,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡呀忧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了溃睹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片而账。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖因篇,靈堂內(nèi)的尸體忽然破棺而出泞辐,到底是詐尸還是另有隱情,我是刑警寧澤竞滓,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布咐吼,位于F島的核電站,受9級特大地震影響商佑,放射性物質(zhì)發(fā)生泄漏锯茄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一茶没、第九天 我趴在偏房一處隱蔽的房頂上張望撇吞。 院中可真熱鬧,春花似錦礁叔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讥蔽,卻和暖如春涣易,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冶伞。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工新症, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人响禽。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓徒爹,卻偏偏與公主長得像荚醒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子隆嗅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容