Flask - 改寫自己的部落格
準備檔案以及資料夾
準備的資料夾如下:
\- |--- main.py |--- settings.py |--- ext.py |--- requirments.txt |--- app |--- models.py |--- views.py |--- static |--- css |--- js |--- images |--- etc... |--- templates |--- layouts |--- base.html
說明檔案內容
- main.py - 主要使用 Flask 以及相關的引入settings.py - 存放 DB 連綫的資訊ext.py - 存放 SQLAlchemy,直接產生 db 的實例化app 底下的 models.py - 專門存放與實際的 DataBase 相符合的資訊
- views.py - 使用 Blueprint 來作為分散 route 的方法
python 安裝的套件
從這個檔案下手 requirments.txt
flask[async] Flask-SQLAlchemy SQLAlchemy gunicorn colorama MarkupSafe greenlet Jinja2 Werkzeug pymysql blueprint unicorn
main.py
主要使用 Blueprint,將重要的 route 都放在 app 底下
這裏會動到部分是:
from app.views import view app.register_blueprint(view)
看你要設定叫什麽,我是習慣用 views
這是完整 main.py 的內容
import os import settings import unicorn from flask import Flask, session # from flask_script import Manager from ext import db from datetime import timedelta # 這裏會用到 Blueprint from app.views import view app = Flask(__name__) # 將系統配置項 Config 類載入到 app app.config.from_object(settings.Config) # 使用 session 必要的配置 app.config['SECRET_KEY'] = "隨機產生一個數值" # 這裏讓 session 存放 31 天,這就看你的專案的時間來制定 app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=31) # 通過db物件將app初始化 db.init_app(app) # 將藍圖view註冊進app app.register_blueprint(view) # manager = Manager(app) if __name__ == "__main__": app.run()
ext.py
這個只有放入 SQLAlchemy,並且將 db 給實例化
from flask_sqlalchemy import SQLAlchemy # 實例化 db 物件 db = SQLAlchemy()
settings.py
這裏是 settings,主要是 main.py 裏面有一段 code
app.config.from_object(settings.Config)
讓 app 的 config 可以整個都載入,包含 db 的連綫資訊等等
class Config: # 設定mysql pymysql的連線 SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root@localhost/blog' # 關閉資料追蹤 SQLALCHEMY_TRACK_MODIFICATIONS = False # 開啟提交 SQLALCHEMY_COMMIT_ON_TEARDOWN = True
app 底下的 models.py
這是資料庫的形成 models,先把 db 引入,在將 datetime 也引入就可以了
from ext import db from datetime import date, datetime
以下是範例 Post
class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer, primary_key=True) category_id = db.Column(db.Integer) title = db.Column(db.String(255)) content = db.Column(db.String) slug = db.Column(db.String(255)) published = db.Column(db.Integer) views = db.Column(db.Integer) image = db.Column(db.String(255)) created_at = db.Column(db.DateTime, default=datetime.now) updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
app 底下的 views.py
這個存放着樣板渲染產生網站的結果
from flask import Blueprint, request, jsonify, render_template, redirect, url_for, session from app.models import Post, Category from ext import db from sqlalchemy import desc # 建立 Blueprint view view = Blueprint('view', __name__) @view.route('/', methods=['GET']) async def index(): posts = Post.query.order_by(desc(Post.created_at)).all() return render_template('home/index.html', posts=posts)
然後 python main.py 就可以在 http://localhost:5000/ 看到結果了
python main.py
或者改用 gunicorn 跑也可以
# 預設 port 是 8000 # --reload 所有的 py 都會讓他重新執行 # --daemon 讓背景執行 gunicorn main:app --reload 或者 --daemon # 如果你的 port 不同,參考一下配置 gunicorn main:app -b 127.0.0.1:6000 --reload 或者 --daemon # 就會以 127.0.0.1:6000 去跑起來
這些都是 python 網頁的相關設置,Have a fun & coding