新闻项目——立项准备——框架搭建
第一步:立项
新建一个flask项目,并命名为news_it03(名字随便取就行),并指定一下配置。(下面是建立后的结果)
第二步:配置文件的加载
class Config(object): """配置文件的加载""" # 开启调试模式 DEBUG = True app.config.from_object(Config
第三步:MySQL的集成
1.代码的相关配置
from flask_sqlalchemy import SQLAlchemy class Config(object): # 配置MySQL数据库连接信息,真实开发中要使用MySQL数据库的真实ip地址 SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@127.0.0.1:3306/news_data' # 动态追踪修改设置,如未设置只会提示警告 SQLALCHEMY_TRACK_MODIFICATIONS = False # 创建连接到MySQL数据库的对象 db = SQLAlchemy(app)
2.在MySQL数据库中创建相关数据库
create database news_data charset=utf8;
第四步:redis集成
1.代码的相关配置
from redis import StrictRedis class Config(object): # 配置Redis数据库:因为redis模块不是flask的拓展,所以就不会自动从config中读取相关信息,只能自己读取。 REDIS_HOST = "127.0.0.1" REDIS_PORT = 6379 # 创建连接到Redis数据库的对象 redis_store = StrictRedis(host=Config.REDIS_HOST, port=Config.REDIS_PORT)
2.测试redis是否连接成功
@app.route('/') def index(): # 测试Redis连接是否成功 redis_store.set("name", "tangqiang") return 'Hello World!'
下面表示连接成功:
第五步:开启CSRF保护
当我们使用flask拓展的WTF表单时,默认开启了CSRF表单,而我们只需要在传入前台页面的时候进行简单设置就可以完成CSRF的保护。而在真实的开发中,前端一般不需要我们去写,所以,我们需要自己来完成CSRF保护。
from flask_wtf.csrf import CSRFProtect # 开启CSRF保护:因为项目中的表单不再使用FlaskForm来实现,所以不会自动地开启CSRF保护,需要我们自己开启 CSRFProtect(app)
第六步:session配置
在之前讲cookie和session的时候,我们说过隐私信息一般都会利用session保存到服务器当中。
而这里,我们要进行配置的是Session,和我们之前的session又有些不同。为了便于理解,我们先来回顾一下之前session的使用。
from flask impo Flask,session
@app.route('/')
def index()
# 测试session
session["age"] = 20
return 'Hello World!'
运行之后会发现报错,因为我们并没有设置secret_key密钥。
密钥设置:
.... class Config(object): """配置文件的加载""" # 项目密钥:CSRF/session,还有一些其他的签名算法会用 SECRET_KEY = "dfjklajdfldsjaflasdjf" ....
配置完成之后,会发现,session已经写入到了cookie中。
可以看到,虽然我们的session经过加密,但是session相关内容还是放到了客户端的cookie中,也就是说存在着不安全的情况,那么最好的方式,还是将这部分内容放到服务器当中进行存储。所以,我们要设置相关内容,让session相关内容存放到服务器当中,而这个就是Session帮助我们完成的内容。Session是flask_session的拓展,所以要使用它需要导入相关的库。
from flask_session import Session .... # 指定session存储在后端的位置 Session(app)
这里我们没有指定存放在哪,就去源代码里看看
这就是我们要找的东西
说明:
SESSION_REDIS:用来指定session数据存储在后端的位置
SESSION_KEY_PREFIX:用来指定存储在redis时,它的前缀是什么。如下面源码所示,默认是"session:"开头。这个一般来说是不需要修改的。
SESSION_USE_SIGNER:是否使用签名,这个签名就是我们之前设置的SECRET_KEY。签名是为了数据的安全,当然是要进行使用的。
SESSION_PERMANENT:字面上的意思是设置session的永久有效,默认为True,但也只表示这个session数据可以存储一段时间。那怎么证明呢?我们CTRL+鼠标左键点击下图位置:
中间那个Flask
来到代码里面,我们会发现session的存活周期为31天
这31天的存活周期对我们来说太长了,我们要给它改改
复制代码 class Config(object): """配置文件的加载""" .... # 指定session使用什么来存储 SESSION_TYPE = "redis" # 这里仅仅是告诉我们要使用redis来进行存储,但是还远远不够,我们需要将redis数据库的对象交给它进行进一步设置 # 指定session数据存储在后端的位置 SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_PORT) # 是否使用设置的SECRET_KEY签名 SESSION_USE_SIGNER = True # 设置过期时间,要求SESSION_PERMANENT等于True, 而默认的是session有效时间是31天 PERMANENT_SESSION_LIFETIME = 60*60*24 # 设置一天的有效期
完成之后就可以测试一下,测试之前要注意:
- 第一:删除之前测试时保存在浏览器的cookie
- 第二:将redis中的相关数据清空
先看密钥:
没问题之后,看redis中的相关内容:
最后的看上去像是一推乱码,但其实是下面的内容:
第七步:Flask-Script与数据库迁移扩展
from flask_script import Manager from flask_migrate import Migrate, MigrateCommand ... # 创建脚本管理器对象 manager = Manager(app) # 让迁移和app和数据库建立关系 Migrate(app, db) # 将数据库迁移的脚本添加到manager manager.add_command('mysql', MigrateCommand) ... if __name__ == '__main__': manager.run()