Day08 難說再見

Day08 難說再見

源代碼: https://github.com/LToddy/blog

技術交流羣:630398887(歡迎一起吹牛)

寫在前面的話:
如果要運行這次的代碼,請先:

$ python3 manage.py shell
>>> from manage.py import *
>>> db.drop_all()
>>> db.create_all()
>>> exit()

因爲我已經註冊了用戶了。

到目前爲止,blog還是有很多問題的:

  • 數據庫建模方面,沒有使用外鍵,也就是說沒有一對多或者多對一的關係。也就是說,對於目前的blog,如果你註冊了多個用戶,那麼這些用戶對於所有文章是共用的。而不是各自用戶有各自的文章 —— 如何解決,當然你也可以使用外鍵來鏈接兩個表實現,或者我們就只允許一個用戶(管理員)的存在,私人使用。

  • 我們的後臺功能太欠缺。目前只有一個發佈功能,其實還需要:

    • 文章的修改
    • 文章的刪除
  • 我們沒有設置文章的類型,所以目前無法給文章分類,其實也很好解決,在app/models.py的文章模型中加入一個type字段就好。

第一個問題,簡單的解決方法:在config.py中加一個全局變量(bool類型),初始值爲False,表示目前沒有用戶註冊,當第一個用戶註冊之後,這個變量設爲True,表示已經有一個用戶註冊了,那麼就可以不再讓第二個用戶註冊了。

config.py

import os

basedir = os.path.abspath(os.path.dirname(__file__))

is_exist_admin = False


class Config:
    SECRET_KEY = 'a string'
    # 數據庫配置
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    @staticmethod
    def init_app(app):
        pass

多了這個: is_exist_admin = False

from config import is_exist_admin

@admin.route('/register', methods=['GET', 'POST'])
def register():
    global is_exist_admin
    form = RegistrationForm()
    if form.validate_on_submit() and not is_exist_admin:
        try:
            user = User(username=form.username.data, password=form.password.data)
            db.session.add(user)
            is_exist_admin = True
            flash('註冊成功')
            return redirect(url_for('admin.login'))
        except:
            flash('帳號已存在')
            return redirect(url_for('admin.register'))
    else:
        flash('管理員已存在')
    return render_template('admin/register.html', form=form)

第二個問題:

先解決添加文章的修改功能,我們可不可以這樣子,把發佈文章和更新文章視作同一種操作。
我們將發佈和更新文章這兩個功能合二爲一,怎麼說呢。當你去發佈文章的時候,根據標題去查詢數據庫有沒有這篇文章,如果沒有這篇文章,那麼就在數據庫中添加這個信息,如果有這篇文章,那麼就去更改數據庫這條信息的內容。

app/admin/views

@admin.route('/', methods=['GET', 'POST'])
def index():
    form = PostForm()
    if not current_user.is_authenticated:
        return redirect(url_for('admin.login'))
    if form.validate_on_submit():
        article = Article(title=form.title.data, content=form.content.data)
        if Article.query.filter_by(title=form.title.data).first() is None:  # 文章不存在
            db.session.add(article)
            flash('發佈成功')
        else:  # 文章已存在
            article = Article.query.filter_by(title=form.title.data).first()
            article.content = form.content.data
            db.session.add(article)
            # db.session.commit()
            flash('文章更新成功')
        form.title.data = ''
        form.content.data = ''
    return render_template('admin/index.html', form=form)

最後是刪除文章:這裏我就不寫了,我相信你可以自己做到。

說點額外話:

一個網站構成的,
- 用戶看到的界面(前端)
- 後端表單驗證+數據庫

前端從來不是問題,因爲畢竟你去百度可以搜索到各種各樣炫酷的模板。
後端,這是核心。數據的處理在這裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章