這是《Flask Web開發(fā)實(shí)戰(zhàn):入門、進(jìn)階與原理解析》這本書中的一個(gè)小項(xiàng)目,我在學(xué)習(xí)后根據(jù)書中的教程實(shí)現(xiàn)了留言板的功能,并結(jié)合我的思路將代碼做了一些調(diào)整。
下面這是實(shí)現(xiàn)后的展示圖片
設(shè)計(jì)思路
留言板得有一個(gè)表單提供昵稱以及留言的輸入功能,在數(shù)據(jù)庫保存的數(shù)據(jù)應(yīng)該包括(留言ID,昵稱,留言內(nèi)容,留言時(shí)間),然后還需要有一個(gè)搜索留言內(nèi)容的功能。后端使用python flask,前端使用html+css+js和bootstrap,數(shù)據(jù)庫使用mysql。
項(xiàng)目結(jié)構(gòu)如下
項(xiàng)目代碼
exts.py
引入了flask_sqlalchemy,flask_moment,flask_bootstrap這三個(gè)庫,具體的作用及使用可以參考pypi網(wǎng)站。
from flask_sqlalchemy import SQLAlchemy
from flask_moment import Moment
from flask_bootstrap import Bootstrap5
db = SQLAlchemy()
moment = Moment()
bootstrap = Bootstrap5()
models.py
設(shè)計(jì)數(shù)據(jù)庫中數(shù)據(jù)表(可以有多個(gè)),數(shù)據(jù)表名message,四個(gè)字段
(id:留言id,整型,主鍵,自增;
name:昵稱,字符型,長(zhǎng)度20,非空;
body:留言內(nèi)容,字符型,長(zhǎng)度200,非空;
timestamp:留言創(chuàng)建的時(shí)間,日期類型,默認(rèn)值提交留言的時(shí)間,索引)
from datetime import datetime
from exts import db
class Message(db.Model):
__tablename__ = 'message'#指定表名
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20), nullable=False)
body = db.Column(db.String(200), nullable=False)
timestamp = db.Column(db.DateTime, default=datetime.now, index=True)
forms.py
提交留言的表單,name:昵稱輸入框,非空,長(zhǎng)度1-20;body:留言輸入框,非空,長(zhǎng)度1-200;submit:提交按鈕,顯示值為提交留言。
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, TextAreaField
from wtforms.validators import DataRequired, Length
class HelloForm(FlaskForm):
name = StringField('昵稱', validators=[DataRequired(), Length(1, 20)])
body = TextAreaField('留言', validators=[DataRequired(), Length(1, 200)])
submit = SubmitField('提交留言')
errors.py
設(shè)計(jì)訪問錯(cuò)誤時(shí)顯示的頁面,如訪問不存在的url等等。
from flask import render_template
def page_not_found(e):
return render_template('errors/404.html'), 404
def internal_server_error(e):
return render_template('errors/500.html'), 500
如下圖所示
commands.py
在這個(gè)代碼里,設(shè)置了一個(gè)生成虛擬留言數(shù)據(jù)的功能,主要用于在開發(fā)項(xiàng)目時(shí)測(cè)試留言板功能是否正常,如留言搜索功能,分頁功能,留言時(shí)間顯示功能等等(手動(dòng)添加測(cè)試數(shù)據(jù)很麻煩,一兩條還好說,一兩千條手動(dòng)添加耗時(shí)且枯燥。)
使用方法,在命令行(windows cmd,或者linux 打開終端,pycharm下方的終端…等等)進(jìn)入到項(xiàng)目app.py所在的目錄,運(yùn)行命令flask forge
生成default條虛擬數(shù)據(jù)(代碼中default我設(shè)置為了20);flask forge --count xxx
生成xxx條虛擬數(shù)據(jù)。這個(gè)項(xiàng)目大概幾百幾千條測(cè)試數(shù)據(jù)就足夠了。
import click
from exts import db
@click.command()
@click.option('--count', default=20, help='Quantity of messages, default is 20.')
def forge(count):
"""Generate fake messages."""
from faker import Faker
from models import Message
db.drop_all()
db.create_all()
fake = Faker()
click.echo('Working...')
for i in range(count):
message = Message(
name=fake.name(),
body=fake.sentence(),
timestamp=fake.date_time_this_year()
)
db.session.add(message)
db.session.commit()
click.echo('Created %d fake messages.' % count)
config.py
SECRET_KEY
:用于保護(hù) Flask 應(yīng)用程序的安全。它是一個(gè)用于加密和解密數(shù)據(jù)的隨機(jī)字符串。
作用:
- 保護(hù)表單數(shù)據(jù)免受跨站點(diǎn)請(qǐng)求偽造 (CSRF) 攻擊。
- 對(duì)用戶會(huì)話數(shù)據(jù)進(jìn)行加密和解密,以保護(hù)用戶數(shù)據(jù)的安全性。
在 Flask 應(yīng)用程序中,SECRET_KEY
的值應(yīng)該是隨機(jī)生成的,足夠長(zhǎng),復(fù)雜度高,不易被猜測(cè)到。注意在正式開發(fā)中不要暴露像SECRET_KEY
這種配置的值,不要把真實(shí)的值提交到github或者放在博客中等等。切記!
下面我給一個(gè)SECRET_KEY值的生成代碼,你們可以參考使用:
# import secrets
# # 生成一個(gè)16字節(jié)長(zhǎng)的隨機(jī)字符串作為 SECRET_KEY
# secret_key = secrets.token_hex(16)
# print(secret_key)
config.py
文件里設(shè)置SECRET_KEY以及數(shù)據(jù)庫的配置信息
SECRET_KEY = "xxx"#自定義
# 數(shù)據(jù)庫配置信息
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'messageboard' #數(shù)據(jù)庫名稱
USERNAME = 'xxxx'
PASSWORD = 'xxxx'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
app.py
在flask應(yīng)用文件里將flask應(yīng)用程序和使用的擴(kuò)展相結(jié)合。flask_migrate
是一個(gè)Flask擴(kuò)展,它提供了一個(gè)簡(jiǎn)單的命令行接口來管理應(yīng)用程序的數(shù)據(jù)庫遷移。前面寫過,models.py
文件是數(shù)據(jù)表的定義文件,里面定義了數(shù)據(jù)表的表名,字段名等等。
如果你編寫了models.py
文件要在數(shù)據(jù)庫中生成數(shù)據(jù)表,在終端命令行里依次運(yùn)行flask db init;flask db migrate;flask db upgrade。這時(shí)數(shù)據(jù)庫中就會(huì)出現(xiàn)數(shù)據(jù)表。
如果你已經(jīng)運(yùn)行了flask db init;后面如果你修改了models.py
文件,只需要運(yùn)行flask db migrate;flask db upgrade即可。
from flask import Flask, redirect, url_for
from exts import db, moment, bootstrap
import config
from blueprints.messages import messages as messages_bp
from flask_migrate import Migrate
from commands import forge
from errors import page_not_found, internal_server_error
app = Flask(__name__)
app.config.from_object(config)
migrate = Migrate(app, db)
'''
遷移三部曲flask db init(初始執(zhí)行一次即可);flask db migrate;flask db upgrade;
'''
db.init_app(app)
moment.init_app(app)
bootstrap.init_app(app)
app.register_blueprint(messages_bp)
app.cli.add_command(forge)
app.errorhandler(404)(page_not_found)
app.errorhandler(500)(internal_server_error)
@app.route('/')
def index(page=None):
return redirect(url_for('messages.index'))
if __name__ == '__main__':
app.run()
其中下面這兩段代碼是導(dǎo)入并注冊(cè)藍(lán)圖,藍(lán)圖下面再解釋。
from blueprints.messages import messages as messages_bp
app.register_blueprint(messages_bp)
Blueprint 藍(lán)圖
Flask Blueprints是一種組織Flask應(yīng)用程序的方法,它將應(yīng)用程序分解為可重用的模塊。Blueprints可以包含路由、模板、靜態(tài)文件和其他與應(yīng)用程序相關(guān)的代碼。Blueprints使得在Flask應(yīng)用程序中添加和刪除功能更加容易,同時(shí)也使得應(yīng)用程序更加模塊化和可維護(hù)。Blueprints還可以用于將應(yīng)用程序分解為多個(gè)子應(yīng)用程序,以便更好地管理和擴(kuò)展應(yīng)用程序。
在我這個(gè)項(xiàng)目中,使用pycharm的話是新建名為blueprints的python軟件包。新建目錄的話也可以,你得手動(dòng)新建__init__.py
文件。messages.py
文件表示留言子應(yīng)用程序,如果以后添加用戶注冊(cè)登錄的功能,那么就新建一個(gè)auth.py
用戶子應(yīng)用程序。messages.py
部分內(nèi)容
static和templates文件
文章來源:http://www.zghlxwxcb.cn/news/detail-428416.html
完整代碼
我不確定有沒有人對(duì)我寫的這篇文章感興趣,如果需要我寫的更完整一些,麻煩點(diǎn)贊評(píng)論哦~我看情況再更新。你們的支持就是我創(chuàng)作的動(dòng)力?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-428416.html
到了這里,關(guān)于基于Flask的留言板的設(shè)計(jì)與實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!