web應(yīng)用框架——Flask實(shí)踐項(xiàng)目(一)

一、創(chuàng)建新的項(xiàng)目

1.GitHub新建項(xiàng)目

  • 登陸GitHub





  • 我們在pycharm中打開這個項(xiàng)目



  • 打開GitHub Desktop看看是否更新


2.配置環(huán)境

3.創(chuàng)建文件

  • 新建一個manage.py文件
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'index'

if __name__ == '__main__':
    app.run()
  • 運(yùn)行一下程序


  • 提交一下git



二、項(xiàng)目編寫

1.代碼編寫

  • 新建數(shù)據(jù)庫


  • 安裝redis
pip install redis
  • 安裝flask_session
pip install flask_session
  • 打開manage.py文件寫入代碼:
from flask import Flask
import redis
from flask_wtf import CSRFProtect
from flask_sqlalchemy import SQLAlchemy
from flask_session import Session

app = Flask(__name__)

class Config(object):
    #工程信息配置
    DEBUG = True
    # 導(dǎo)入數(shù)據(jù)庫配置
    # 設(shè)置數(shù)據(jù)庫連接
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@127.0.0.1:3306/information'
    # 動態(tài)追蹤設(shè)置
    app.config['SQLALCHEMY_TRACK_MODUFICATIONS'] = True
    # 顯示原始sql
    app.config['SQLALCHEMY_ECHO'] = True

    RDIES_HOST = "127.0.0.1"
    RDIES_PORT = 6379


app.config.from_object(Config)
db = SQLAlchemy(app)
#初始化redis配置
redis.StrictRedis(host=Config.RDIES_HOST,port=Config.RDIES_PORT)
#開啟CSRF保護(hù),只用于服務(wù)器驗(yàn)證功能
CSRFProtect(app)
#設(shè)置session保存指定位置
Session(app)
app.route('/')
def index():
    return 'index'

if __name__ == '__main__':
    app.run()

2.下載redis數(shù)據(jù)庫

redis數(shù)據(jù)庫網(wǎng)盤鏈接:https://pan.baidu.com/s/12dN__yr1ow9AmlQ4UrVsHg
提取碼:72my

  • 安裝這個軟件



    就一直next就可以

http://www.itdecent.cn/p/9307d4c16791
這個鏈接里面講解的redis數(shù)據(jù)庫較為全面,可供參考

  • 安裝這個軟件



  • 檢測是否安裝

redis-cli

連接上了

keys *







3.鏈接數(shù)據(jù)庫

  • 打開manage.py文件
from flask import Flask, session
import redis
from flask_wtf import CSRFProtect
from flask_sqlalchemy import SQLAlchemy
from flask_session import Session

app = Flask(__name__)

class Config(object):
    #工程信息配置
    SECRET_KEY = "EjpNVSNQTyGi1VvWECj9TvC/+kq3oujee2kTfQUs8yCM6xX9Yjq52v54g+HVoknA"
    DEBUG = True
    # 導(dǎo)入數(shù)據(jù)庫配置
    # 設(shè)置數(shù)據(jù)庫連接
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@127.0.0.1:3306/information'
    # 動態(tài)追蹤設(shè)置
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    # 顯示原始sql
    app.config['SQLALCHEMY_ECHO'] = True

    REDIS_HOST = "127.0.0.1"
    REDIS_PORT = 6379
    #flask_session配置信息
    SESSION_TYPE = "redis" #指定session保存到redis中
    SESSION_USE_SIGNER = True #讓cookie中的sessionid 被加密處理
    #使用redis實(shí)例
    SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT)
    SESSION_PERMANENT = False
    PERMANENT_SESSION_LIFETIME = 86400 #session有效期/秒


app.config.from_object(Config)
# 初始化數(shù)據(jù)庫
db = SQLAlchemy(app)
# 初始化redis 對象
redis_store = redis.StrictRedis(host=Config.REDIS_HOST, port=Config.REDIS_PORT)
# 開啟csrf保護(hù),只做服務(wù)器驗(yàn)證功能,
CSRFProtect(app)
# 設(shè)置session保存指定位置
Session(app)

@app.route('/')
def index():
    session['name'] = 'lucy'
    return 'index'

if __name__ == '__main__':
    app.run()
  • 運(yùn)行程序


  • 刷新數(shù)據(jù)庫


  • 安裝 flask_migrate
pip install flask_migrate

4.設(shè)置運(yùn)行


5.整理代碼

  • 新創(chuàng)建一個config.py文件
import logging

import redis

class Config(object):
    #工程信息配置
    SECRET_KEY = "EjpNVSNQTyGi1VvWECj9TvC/+kq3oujee2kTfQUs8yCM6xX9Yjq52v54g+HVoknA"
    DEBUG = True
    # 導(dǎo)入數(shù)據(jù)庫配置
    # 設(shè)置數(shù)據(jù)庫連接
    SQLALCHEMY_DATABASE_URI = 'mysql://root:root@127.0.0.1:3306/information'
    # 動態(tài)追蹤設(shè)置
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    # 顯示原始sql
    SQLALCHEMY_ECHO = True

    REDIS_HOST = "127.0.0.1"
    REDIS_PORT = 6379
    #flask_session配置信息
    SESSION_TYPE = "redis" #指定session保存到redis中
    SESSION_USE_SIGNER = True #讓cookie中的sessionid 被加密處理
    #使用redis實(shí)例
    SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT)
    SESSION_PERMANENT = False
    PERMANENT_SESSION_LIFETIME = 86400 #session有效期/秒
    #日志級別
    LEVEL = logging.DEBUG
# 開發(fā)環(huán)境
class DevelopConfig(Config):
    pass
# 生產(chǎn)環(huán)境
class ProductConfig(Config):
    DEBUG = False
    LEVEL = logging.ERROR

# 測試環(huán)境
class TestingConfig(Config):
    TESTING = True
# 通過統(tǒng)一的字典進(jìn)行配置類的訪問
config_dict = {
    "develop":DevelopConfig,
    "product":ProductConfig,
    "testing":TestingConfig,
}
  • 設(shè)置manage.py代碼
from flask_session import sessions
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from info import create_app, db
from flask_session import Session
# flask_script
app = create_app('develop')
manager = Manager(app)
# 數(shù)據(jù)庫遷移
Migrate(app, db)
manager.add_command('db', MigrateCommand)


@app.route('/')
def index():
    #sessions['name'] = 'lucy'
    return "index"
if __name__ == '__main__':
    manager.run()
  • 新建一個info文件



import logging
from logging.handlers import RotatingFileHandler

from flask import Flask, session
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import CSRFProtect
from config import Config,config_dict

db = SQLAlchemy()


def create_app(config_name):
    # 通過不同的配置名,切換不同的環(huán)境
    config = config_dict.get(config_name)


    #設(shè)置日志級別
    log_file(config.LEVEL)
    #TODO
    app = Flask(__name__)
    app.config.from_object(Config)
    # 初始化redis配置

    # redis.StrictRedis(host=Config.RDIES_HOST, port=Config.RDIES_PORT)

    # 開啟csrf 保護(hù), 只用于服務(wù)器驗(yàn)證功能
    CSRFProtect(app)
    # 設(shè)置session保存指定位置
    Session(app)
    return app
#記錄日志
def log_file(level):
    # 設(shè)置日志的記錄等級,常見等級有: DEBUG<INFO<WARING<ERROR
    logging.basicConfig(level=level)  # 調(diào)試debug級
    # 創(chuàng)建日志記錄器,指明日志保存的路徑、每個日志文件的最大大小、保存的日志文件個數(shù)上限
    file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024 * 1024 * 100, backupCount=10)
    # 創(chuàng)建日志記錄的格式 日志等級 輸入日志信息的文件名 行數(shù) 日志信息
    formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')
    # 為剛創(chuàng)建的日志記錄器設(shè)置日志記錄格式
    file_log_handler.setFormatter(formatter)
    # 為全局的日志工具對象(flask app使用的)添加日志記錄器
    logging.getLogger().addHandler(file_log_handler)
  • 新建一個logs文件夾


  • 運(yùn)行程序


  • 查看剛剛的logs文件夾



    就生成了日志文件

  • 在.gitugnore文件內(nèi)寫下面代碼這樣日志文件不會被傳到git上


三、藍(lán)圖

我們打開之前練習(xí)的時候所用的工程文件來演示藍(lán)圖例子

  • 新建一個test.py文件
#藍(lán)圖
from flask import Flask
from user import users
from login import logins
from admin import admins
app = Flask(__name__)

app.register_blueprint(users)
app.register_blueprint(logins)
app.register_blueprint(admins,url_prefix='/admin')
@app.route('/')
def index():
    return 'index'
if __name__ == '__main__':
    app.run()
  • 新建一個user.py文件

from flask import Blueprint, render_template

#藍(lán)圖
#1.創(chuàng)建藍(lán)圖
users = Blueprint('user',__name__)
#2.注冊藍(lán)圖路由
@users.route('/users')
def user():
    return render_template('user.html')
#3.注冊藍(lán)圖到程序?qū)嵗?
  • 新建一個login.py文件

from flask import Blueprint, render_template

#藍(lán)圖
#1.創(chuàng)建藍(lán)圖
logins = Blueprint('login',__name__)
#2.注冊藍(lán)圖路由
@logins.route('/login')
def user():
    return render_template('login4.html')
#3.注冊藍(lán)圖到程序?qū)嵗?
  • 新建一個admin.py文件

from flask import Blueprint, render_template

#藍(lán)圖
#1.創(chuàng)建藍(lán)圖
admins = Blueprint('admin',__name__)
#2.注冊藍(lán)圖路由
@admins.route('/admin')
def user():
    return render_template('admin.html')
#3.注冊藍(lán)圖到程序?qū)嵗?
  • 新建一個user.html文件


  • 新建一個login4.html文件


  • 新建一個admin.html文件


  • 運(yùn)行程序


有關(guān)藍(lán)圖的更多詳解請看下面鏈接:

http://www.itdecent.cn/p/b4ec8383f120

四、將藍(lán)圖應(yīng)用到項(xiàng)目中

  • 我們在info建一個叫modules的python文件夾,在modules文件夾下創(chuàng)建一個叫index的python文件夾,在在index里面創(chuàng)建一個views.py文件


  • 我們將manage.py中部分的代碼刪除


  • 打開index/init.py文件

#創(chuàng)建藍(lán)圖
from flask import Blueprint
index_blu = Blueprint('index', __name__)
from  . import  views
  • 打開views.py文件
from . import index_blu
@index_blu.route('/')
def index():
    return "index"
  • 打開info/init.py文件
    #注冊藍(lán)圖時,導(dǎo)入和注冊寫在一起
    from info.modules.index import index_blu
    app.register_blueprint(index_blu)
  • 運(yùn)行程序


static文件夾壓縮包鏈接:https://pan.baidu.com/s/1Cd8ycGhvJZuQ_eW8887-ww
提取碼:vrgy

  • 在info文件夾下建立一個static文件夾





五、展示頁面

  • 在info文件夾下建立一個templates文件夾





  • 我們在templates文件夾下建立一個news文件夾用來放前臺界面,我們將index.html文件拖拽到news文件夾下



  • 打開views.py文件
from flask import render_template

from . import index_blu
@index_blu.route('/')
def index():
    #return "index"
    return render_template('news/index.html')
  • 運(yùn)行程序


以上項(xiàng)目可在我的GitHub上面查看:

https://github.com/zhaoXiY/flask_new_info

(此文章僅作為個人學(xué)習(xí)筆記使用,如有錯誤歡迎指正~)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容