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)
最後是刪除文章:這裏我就不寫了,我相信你可以自己做到。
說點額外話:
一個網站構成的,
- 用戶看到的界面(前端)
- 後端表單驗證+數據庫
前端從來不是問題,因爲畢竟你去百度可以搜索到各種各樣炫酷的模板。
後端,這是核心。數據的處理在這裏。