六、Flask_數據庫+session存儲+藍圖


 

 

1 數據庫相關

 

orm

ORM 全拼Object-Relation Mapping,中文意為 對象-關系映射。主要實現模型對象到關系數據庫數據的映射

優點 :

  • 只需要面向對象編程, 不需要面向數據庫編寫代碼

    • 對數據庫的操作都轉化成對類屬性和方法的操作

    • 不用編寫各種數據庫的sql語句

  • 實現了數據模型與數據庫的解耦, 屏蔽了不同數據庫操作上的差異

    • 不再需要關注當前項目使用的是哪種數據庫

    • 通過簡單的配置就可以輕松更換數據庫, 而不需要修改代碼

缺點 :

  • 相比較直接使用SQL語句操作數據庫,有性能損失

  • 根據對象的操作轉換成SQL語句,根據查詢的結果轉化成對象, 在映射過程中有性能損失

 

1.1 Flask-SQLAlchemy

flask默認提供模型操作,但是並沒有提供ORM,所以一般開發的時候我們會采用flask-SQLAlchemy模塊來實現ORM操作。

SQLAlchemy是一個關系型數據庫框架,它提供了高層的 ORM 和底層的原生數據庫的操作。flask-sqlalchemy 是一個簡化了 SQLAlchemy 操作的flask擴展。

SQLAlchemy: https://www.sqlalchemy.org/

 

安裝 flask-sqlalchemy

pip install flask-sqlalchemy

 

如果連接的是mysql數據庫,需要安裝mysqldb驅動

pip install flask-mysqldb

 

安裝flask-mysqldb時,注意

安裝 flask-mysqldb的時候,python底層依賴於一個底層的模塊 mysql-client模塊
如果沒有這個模塊,則會報錯如下:

Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-21hysnd4/mysqlclient/

 

解決方案:

apt-get install libmysqlclient-dev python3-dev

運行上面的安裝命令如果報錯:
   dpkg 被中斷,您必須手工運行 ‘sudo dpkg --configure -a’ 解決此問題。
則根據提示執行命令以下命令,再次安裝mysqlclient
    sudo dpkg --configure -a
    apt-get install libmysqlclient-dev python3-dev

解決了mysqlclient問題以后,重新安裝 flask-mysqldb即可。
pip install flask-mysqldb

 

1.2 數據庫連接設置

在 Flask-SQLAlchemy 中,數據庫使用URL指定,而且程序使用的數據庫必須保存到Flask配置對象的 SQLALCHEMY_DATABASE_URI鍵中

config.py,配置文件代碼:

class Config(object):
    DEBUG = True
    # 設置密鑰,可以通過 base64.b64encode(os.urandom(48)) 來生成一個指定長度的隨機字符串
    SECRET_KEY = "T1vEjTCjkGon5vU8C6Xq3ujNSQgHQje"
    # 數據庫鏈接配置: #數據類型://登錄賬號:登錄密碼@數據庫主機IP:數據庫訪問端口/數據庫名稱
    SQLALCHEMY_DATABASE_URI = "mysql://root:123@127.0.0.1:3306/flask_students"

 

其他設置:

# 動態追蹤修改設置,如未設置只會提示警告
SQLALCHEMY_TRACK_MODIFICATIONS = True
#查詢時會顯示原始SQL語句
SQLALCHEMY_ECHO = True

 

配置完成需要去 MySQL 中創建項目所使用的數據庫

$ mysql -uroot -p123
mysql > create database flask_students charset=utf8mb4;

 

常用的SQLAlchemy字段類型

類型名 python中類型 說明
Integer int 普通整數,一般是32位
SmallInteger int 取值范圍小的整數,一般是16位
BigInteger int或long 不限制精度的整數
Float float 浮點數
Numeric decimal.Decimal 普通數值,一般是32位
String str 變長字符串
Text str 變長字符串,對較長或不限長度的字符串做了優化
Unicode unicode 變長Unicode字符串
UnicodeText unicode 變長Unicode字符串,對較長或不限長度的字符串做了優化
Boolean bool 布爾值
Date datetime.date 日期
Time datetime.datetime 日期和時間
LargeBinary str 二進制文件

 

常用的SQLAlchemy列選項

選項名 說明
primary_key 如果為True,代表表的主鍵
unique 如果為True,代表這列不允許出現重復的值
index 如果為True,為這列創建索引,提高查詢效率
nullable 如果為True,允許有空值,如果為False,不允許有空值
default 為這列定義默認值

 

常用的SQLAlchemy關系選項

backref 在關系的另一模型中添加反向引用,用於設置外鍵名稱,在1查多的
primary join 明確指定兩個模型之間使用的連表條件
uselist 如果為False,不使用列表,而使用標量值
order_by 指定關系中記錄的排序方式
secondary 指定多對多關系中關系表的名字
secondary join 在SQLAlchemy中無法自行決定時,指定多對多關系中的二級連表條件

 

 

1.3 數據庫基本操作

 

在Flask-SQLAlchemy中,插入、修改、刪除操作,均由數據庫會話管理

 

 

  • 會話用 db.session 表示。在准備把數據寫入數據庫前,要先將數據添加到會話中然后調用 commit() 方法提交會話

 

 

在 Flask-SQLAlchemy 中,查詢操作是通過 query 對象操作數據

 

 

  • 最基本的查詢是返回表中所有數據,可以通過過濾器進行更精確的數據庫查詢

 

 

定義模型類

測試先把模型類寫在main.py文件中,一般會把模型創建到單獨的文件中

from flask import Flask
from config import Config

app = Flask(__name__,template_folder='templates')
app.config.from_object(Config)


"""模型的創建"""
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

class Course(db.Model):
    # 定義表名
    __tablename__ = 'tb_course'
    # 定義字段對象
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    price = db.Column(db.Numeric(6,2))
    # repr()方法類似於django的__str__,用於打印模型對象時顯示的字符串信息
    def __repr__(self):
        return 'Course:%s'% self.name

class Student(db.Model):
    __tablename__ = 'tb_student'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    email = db.Column(db.String(64),unique=True)
    age = db.Column(db.SmallInteger)
    sex = db.Column(db.Boolean,default=1)

    def __repr__(self):
        return 'Student:%s' % self.name

class Teacher(db.Model):
    __tablename__ = 'tb_teacher'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)

    def __repr__(self):
        return 'Teacher:%s' % self.name

@app.route("/")
def index():
    return "ok"

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

 

 

模型之間的關聯

一對多

class Course(db.Model):
    ...
    teacher_id = db.Column(db.Integer, db.ForeignKey('tb_teacher.id'))

class Teacher(db.Model):
  __tablename__ = 'tb_teacher' ...
# 課程與老師之間的關聯 courses = db.relationship('Course', backref='teacher', lazy='subquery') ...
  • 其中realtionship描述了Course和Teacher的關系。第一個參數為對應參照的類"Course"

  • 第二個參數backref為類Teacher申明新屬性的方法

  • 第三個參數lazy決定了什么時候SQLALchemy從數據庫中加載數據

    • 如果設置為子查詢方式(subquery),則會在加載完Teacher對象后,就立即加載與其關聯的對象,這樣會讓總查詢數量減少,但如果返回的條目數量很多,就會比較慢

      • 設置為 subquery 的話,teacher.courses 返回所有當前老師關聯的課程列表

    • 另外,也可以設置為動態方式(dynamic),這樣關聯對象會在被使用的時候再進行加載,並且在返回前進行過濾,如果返回的對象數很多,或者未來會變得很多,那最好采用這種方式

      • 設置為 dynamic 的話,Teacher.courses返回查詢對象,並沒有做真正的查詢,可以利用查詢對象做其他邏輯,比如:先排序再返回結果

 

多對多

achievement = db.Table('tb_achievement',  
    db.Column('student_id', db.Integer, db.ForeignKey('tb_student.id')),  
    db.Column('course_id', db.Integer, db.ForeignKey('tb_course.id'))  
)

class Course(db.Model):
    ...
    students = db.relationship('Student',secondary=achievement,  
                                    backref='courses',  
                                    lazy='dynamic')
class Student(db.Model):
    ...

 

常用的SQLAlchemy查詢過濾器

過濾器 說明
filter() 把過濾器添加到原查詢上,返回一個新查詢
filter_by() 把等值過濾器添加到原查詢上,返回一個新查詢
limit() 使用指定的值限定原查詢返回的結果
offset() 偏移原查詢返回的結果,返回一個新查詢
order_by() 根據指定條件對原查詢結果進行排序,返回一個新查詢
group_by() 根據指定條件對原查詢結果進行分組,返回一個新查詢

 

常用的SQLAlchemy查詢結果的方法

all() 以列表形式返回查詢的所有結果
first() 返回查詢的第一個結果,如果未查到,返回None
first_or_404() 返回查詢的第一個結果,如果未查到,返回404
get() 返回指定主鍵對應的行,如不存在,返回None
get_or_404() 返回指定主鍵對應的行,如不存在,返回404
count() 返回查詢結果的數量
paginate() 返回一個Paginate對象,它包含指定范圍內的結果

 

創建和刪除表

創建表

db.create_all()  # 注意,create_all()方法執行的時候,需要放在模型的后面
# 上面這段語句,后面我們需要轉移代碼到flask-script的自定義命令中。
# 執行了一次以后,需要注釋掉。

刪除表

db.drop_all()

 

添加數據

插入一條數據

student1 = Student(name='xiaoming')
db.session.add(student1)
db.session.commit()
#再次插入一條數據
student2 = Role(name='xiaohong')
db.session.add(student2)
db.session.commit()

 

一次插入多條數據

st1 = Student(name='wang',email='wang@163.com',age=22)
st2 = Student(name='zhang',email='zhang@189.com',age=22)
st3 = Student(name='chen',email='chen@126.com',age=22)
st4 = Student(name='zhou',email='zhou@163.com',age=22)
st5 = Student(name='tang',email='tang@163.com',age=22)
st6 = Student(name='wu',email='wu@gmail.com',age=22)
st7 = Student(name='qian',email='qian@gmail.com',age=22)
st8 = Student(name='liu',email='liu@163.com',age=22)
st9 = Student(name='li',email='li@163.com',age=22)
st10 = Student(name='sun',email='sun@163.com',age=22)
db.session.add_all([st1,st2,st3,st4,st5,st6,st7,st8,st9,st10])
db.session.commit()

 

查詢所有學生數據

查詢有多少個學生

查詢第1個學生

查詢id為4的學生[3種方式]

查詢名字結尾字符為g的所有學生數據[開始/包含]

查詢名字不等於wang的所有學生數據[2種方式]

查詢名字和郵箱都以 li 開頭的所有數據[2種方式]

查詢age是 18 或者 `email` 以 `163.com` 結尾的所有學生

查詢id為 [1, 3, 5, 7, 9] 的用戶列表

查詢name為liu的學生數據

查詢所有學生數據,並以年齡排序

分頁查詢,每頁3個,查詢第2頁的數據
View Code

 

 

查詢

 

filter_by精確查詢

例如:返回名字等於wang的所有人

Student.query.filter_by(name='xiaoming').all()

 

first()返回查詢到的第一個對象【first獲取一條數據,all獲取多條數據】

Student.query.first()

 

all()返回查詢到的所有對象

Student.query.all()

 

filter模糊查詢,返回名字結尾字符為g的所有數據

Student.query.filter(Student.name.endswith('g')).all()

 

get():參數為主鍵,如果主鍵不存在沒有返回內容

Student.query.get()

 

邏輯非,返回名字不等於wang的所有數據

Student.query.filter(Student.name!='wang').all()

 

邏輯與,需要導入and,返回and()條件滿足的所有數據

from sqlalchemy import and_
Student.query.filter(and_(Student.name!='wang',Student.email.endswith('163.com'))).all()

 

邏輯或,需要導入or_

from sqlalchemy import or_
Student.query.filter(or_(Student.name!='wang',Student.email.endswith('163.com'))).all()

 

查詢數據后刪除

student = Student.query.first()
db.session.delete(student)
db.session.commit()

 

更新數據

student = Student.query.first()
student.name = 'dong'
db.session.commit()

 

 

關聯查詢

假設:老師和課程的關系是一對多的關系,一個老師可以授課多個課程,一個課程只由一個老師授課。

 

  • 查詢老師授課的所有課程
#查詢講師表id為1的老師
teacher = Teacher.query.get(1)
#查詢當前老師的所有課程, 根據模型中關聯關系來查詢數據
print(teacher.courses)
  • 查詢課程所屬講師
course = Course.query.get(2)

print(course)

# 根據外鍵只能查詢到ID數值, SQLAlchemy不會幫我們把ID轉換成模型
print( course.teacher_id )

# 要獲取外鍵對應的模型數據,需要找到主鍵模型里面的  db.relationship 里面的 backref
print( course.teacher.name )

 

1.4 數據庫遷移

  • 在開發過程中,需要修改數據庫模型,而且還要在修改之后更新數據庫。最直接的方式就是刪除舊表,但這樣會丟失數據。

  • 更好的解決辦法是使用數據庫遷移框架,它可以追蹤數據庫模式的變化,然后把變動應用到數據庫中。

  • 在Flask中可以使用Flask-Migrate擴展,來實現數據遷移。並且集成到Flask-Script中,所有操作通過命令就能完成。

  • 為了導出數據庫遷移命令,Flask-Migrate提供了一個MigrateCommand類,可以附加到flask-script的manager對象上。

 

首先要在虛擬環境中安裝Flask-Migrate

pip install flask-migrate

配置

manage = Manager(app)

"""模型的創建"""
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)



#第一個參數是Flask的實例,第二個參數是Sqlalchemy數據庫實例
migrate = Migrate(app,db)

#manager是Flask-Script的實例,這條語句在flask-Script中添加一個db命令
manage.add_command('db',MigrateCommand)

 

創建遷移版本倉庫

#這個命令會創建migrations文件夾,所有遷移文件都放在里面。
python main.py db init

 

創建遷移版本

  • 自動創建遷移版本有兩個函數

    • upgrade():函數把遷移中的改動應用到數據庫中。

    • downgrade():函數則將改動刪除。

  • 自動創建的遷移腳本會根據模型定義和數據庫當前狀態的差異,生成upgrade()和downgrade()函數的內容。

  • 對比不一定完全正確,有可能會遺漏一些細節,需要進行檢查

python main.py db migrate -m 'initial migration'

# 這里等同於django里面的 makemigrations,生成遷移版本文件

 

升級版本庫的版本

python main.py db upgrade 

 

降級版本庫的版本

python main.py db downgrade

 

版本庫的歷史管理

可以根據history命令找到版本號,然后傳給downgrade命令:

  python manage.py db history輸出格式:<base> ->  版本號 (head), initial migration

 

回滾到指定版本

python manage.py db downgrade # 默認返回上一個版本
python manage.py db downgrade 版本號   # 返回到指定版本號對應的版本

 

數據遷移的步驟:

1. 初始化數據遷移的目錄
python manage.py db init

2. 數據庫的數據遷移版本初始化
python manage.py db migrate -m 'initial migration'

3. 升級版本[創建表/創建字段/修改字段]
python manage.py db upgrade 

4. 降級版本[刪除表/刪除字段/恢復字段]
python manage.py db downgrade

 

模塊推薦

文檔: https://faker.readthedocs.io/en/master/locales/zh_CN.html

github: https://github.com/joke2k/faker

 

flask-session

允許設置session到指定存儲的空間中, 文檔:

安裝命令: https://pythonhosted.org/Flask-Session/

pip install flask-Session

 

使用session之前,必須配置一下配置項

# 設置密鑰,可以通過 base64.b64encode(os.urandom(48)) 來生成一個指定長度的隨機字符串
SECRET_KEY = "T1vEjTCjkGon5vU8C6Xq3ujNSQgHQje"

 

2.1 redis保存session的基本配置

配置文件信息:

import redis
class Config(object):
    DEBUG = True
    SECRET_KEY = "*(%#4sxcz(^(#$#8423"
    # 數據庫鏈接配置:
    #數據類型://登錄賬號:登錄密碼@數據庫主機IP:數據庫訪問端口/數據庫名稱
    SQLALCHEMY_DATABASE_URI = "mysql://root:123@127.0.0.1:3306/flask_students"
    # 設置mysql的錯誤跟蹤信息顯示
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    # 打印每次模型操作對應的SQL語句
    SQLALCHEMY_ECHO = True
    # 把session保存到redis中
    # session存儲方式為redis
    SESSION_TYPE="redis"
    # 如果設置session的生命周期是否是會話期, 為True,則關閉瀏覽器session就失效
    SESSION_PERMANENT = False
    # 是否對發送到瀏覽器上session的cookie值進行加密
    SESSION_USE_SIGNER = False
    # 保存到redis的session數的名稱前綴
    SESSION_KEY_PREFIX = "session:"
    # session保存數據到redis時啟用的鏈接對象
    SESSION_REDIS = redis.Redis(host='127.0.0.1', port='6379')  # 用於連接redis的配置

 

主文件信息main.py,代碼

from flask import Flask
from config import Config
from flask_session import Session
from flask import session
app = Flask(__name__,template_folder='templates')
app.config.from_object(Config)

Session(app)

@app.route("/")
def index():
    return "ok"

@app.route("/set_session")
def set_session():
    """設置session"""
    session["username"] = "小明"
    return "ok"

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

 

2.2 SQLAlchemy存儲session的基本配置

需要手動創建session表,在項目第一次啟動的時候,使用db.create_all()來完成創建

db = SQLAlchemy(app)

app.config['SESSION_TYPE'] = 'sqlalchemy'  # session類型為sqlalchemy
app.config['SESSION_SQLALCHEMY'] = db # SQLAlchemy對象
app.config['SESSION_SQLALCHEMY_TABLE'] = 'session' # session要保存的表名稱
app.config['SESSION_PERMANENT'] = True  # 如果設置為True,則關閉瀏覽器session就失效。
app.config['SESSION_USE_SIGNER'] = False  # 是否對發送到瀏覽器上session的cookie值進行加密
app.config['SESSION_KEY_PREFIX'] = 'session:'  # 保存到session中的值的前綴

Session(app)

 

 

3 藍圖

3.1 模塊化

隨着flask程序越來越復雜,我們需要對程序進行模塊化的處理,之前學習過python的模塊化管理,於是針對一個簡單的flask程序進行模塊化處理

簡單來說,Blueprint 是一個存儲視圖方法的容器,這些操作在這個Blueprint 被注冊到一個應用之后就可以被調用,Flask 可以通過Blueprint來組織URL以及處理請求。

  • 一個項目可以具有多個Blueprint

  • 可以將一個Blueprint注冊到任何一個未使用的URL下比如 “/”、“/sample”或者子域名

  • 在一個應用中,一個模塊可以注冊多次

  • Blueprint可以單獨具有自己的模板、靜態文件或者其它的通用操作方法,它並不是必須要實現應用的視圖和函數的

  • 在一個應用初始化時,就應該要注冊需要使用的Blueprint

但是一個Blueprint並不是一個完整的應用,它不能獨立於應用運行,而必須要注冊到某一個應用中。

Blueprint對象用起來和一個應用/Flask對象差不多,最大的區別在於一個 藍圖對象沒有辦法獨立運行,必須將它注冊到一個應用對象上才能生效

 

使用藍圖可以分為四個步驟

1. 創建一個藍圖的包,例如users,並在__init__.py文件中創建藍圖對象

users=Blueprint('users',__name__)

 

2. 在這個藍圖目錄下, 創建views.py文件,保存當前藍圖使用的視圖函數

@admin.route('/')
def home():
    return 'user.home'

 

3. users/init.py中引入views.py中所有的視圖函數

from flask import Blueprint
# 等同於原來在 manage.py里面的 app = Flask()
users=Blueprint('users',__name__)

from .views import *

 

3.2 運行機制

  • 藍圖是保存了一組將來可以在應用對象上執行的操作,注冊路由就是一種操作

  • 當在app對象上調用 route 裝飾器注冊路由時,這個操作將修改對象的url_map路由表

  • 然而,藍圖對象根本沒有路由表,當我們在藍圖對象上調用route裝飾器注冊路由時,它只是在內部的一個延遲操作記錄列表defered_functions中添加了一個項

  • 當執行app對象的 register_blueprint() 方法時,應用對象將從藍圖對象的 defered_functions 列表中取出每一項,並以自身作為參數執行該匿名函數,即調用應用對象的 add_url_rule() 方法,這將真正的修改應用對象的usr_map路由表

 

3.3 藍圖的url前綴

當我們在應用對象上注冊一個藍圖時,可以指定一個url_prefix關鍵字參數(這個參數默認是/)

 

 

3.4 注冊藍圖中的靜態文件的相關路由

 

和應用對象不同,藍圖對象創建時不會默認注冊靜態目錄的路由。需要我們在 創建時指定 static_folder 參數。

下面的示例將藍圖所在目錄下的static_users目錄設置為靜態目錄

 

# users/__init__.py,代碼:
user_blu = Blueprint("users",__name__,static_folder='static_users')

# 啟動文件 main.py,代碼:
from users import user_blu
app.register_blueprint(user_blu,url_prefix='/users')

 

 現在就可以使用/admin/static_admin/ 訪問static_admin目錄下的靜態文件了

 

定制靜態目錄URL規則 :可以在創建藍圖對象時使用 static_url_path 來改變靜態目錄的路由

 

 下面的示例將為 static_admin 文件夾的路由設置為 /lib

admin = Blueprint("admin",__name__,static_folder='static_admin',static_url_path='/lib')
app.register_blueprint(admin,url_prefix='/admin')

 

 

 

3.5 設置藍圖中模版的目錄

 

藍圖對象默認的模板目錄為系統的模版目錄,可以在創建藍圖對象時使用 template_folder 關鍵字參數設置模板目錄

admin = Blueprint('admin',__name__,template_folder='templates_users')

 

創建藍圖中的模板目錄template_users :

 

 

 

 注:如果在 templates 中存在和 templates_users 有同名模板文件時, 則系統會優先使用 templates 中的文件

 

 

4 擴展

調整session配置

分析SQLAlachemy的構造方式可以發現,初始化並非一定要傳遞app應用對象到內部,事實上它提供了init_app方法給我們后續調用。而 init_app 方法是flask框架要求任何的第三方組件都要實現這個方法。

init_app方法內部就是要第三方組件開發者編寫一些使用當前組建的默認配置項以及把當前組件設置成一個對象,加載到app對象內部extensions字典才能讓開發者在flask框架內部配置和使用當前組件。

我們可以利用這種組件開發機制,那么把配置代碼抽離出去。

配置文件中:

import redis
from flask_sqlalchemy import SQLAlchemy
# 創建db對象
db = SQLAlchemy()
class Config(object):
    DEBUG = True
    SECRET_KEY = "*(%#4sxcz(^(#$#8423"
    # 數據庫鏈接配置:
    #數據類型://登錄賬號:登錄密碼@數據庫主機IP:數據庫訪問端口/數據庫名稱
    SQLALCHEMY_DATABASE_URI = "mysql://root:123@127.0.0.1:3306/flask_students"
    # 設置mysql的錯誤跟蹤信息顯示
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    # 打印每次模型操作對應的SQL語句
    SQLALCHEMY_ECHO = True

    """把session保存到redis中"""
    # session存儲方式為redis
    # SESSION_TYPE="redis"
    # # 如果設置session的生命周期是否是會話期, 為True,則關閉瀏覽器session就失效
    # SESSION_PERMANENT = False
    # # 是否對發送到瀏覽器上session的cookie值進行加密
    # SESSION_USE_SIGNER = False
    # # 保存到redis的session數的名稱前綴
    # SESSION_KEY_PREFIX = "session:"
    # # session保存數據到redis時啟用的鏈接對象
    # SESSION_REDIS = redis.Redis(host='127.0.0.1', port='6379')  # 用於連接redis的配置

    SESSION_TYPE= 'sqlalchemy'  # session的存儲方式為sqlalchemy
    SESSION_SQLALCHEMY= db  # SQLAlchemy對象
    SESSION_SQLALCHEMY_TABLE= 'sessions'  # session要保存的表名稱
    SESSION_PERMANENT= True  # 如果設置為True,則關閉瀏覽器session就失效。
    SESSION_USE_SIGNER= False  # 是否對發送到瀏覽器上session的cookie值進行加密
    SESSION_KEY_PREFIX= 'session:'  # 保存到session中的值的前綴

 

啟動文件main.py,代碼:

 

from flask import Flask
from config import Config,db
from flask_session import Session

from flask import session

app = Flask(__name__,template_folder='templates')
app.config.from_object(Config)

# 把app加載到db對象中
db.init_app(app)

Session(app)

@app.route("/")
def index():
    return "ok"

@app.route("/set_session")
def set_session():
    """設置session"""
    session["username"] = "小明"
    return "ok"

if __name__ == '__main__':
    # db.create_all()
    print( app.url_map )
    app.run()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM