flask 新闻资讯项目一:
环境搭建:
1. github/ 码云上 创建仓库?
2. 下载文件包并打开 项目?
3. git 包配置:
.gitignore: 忽略文件
.idea/
.py[cod]
logs/log*
.gitkeep:
logs/ 文件包下忽略log文件上传
4,数据库配置
* 目的:
为了在项目中用来存储新闻数据以及用户数据的
5,redis配置
* 目的:
缓存访问频率高的内容, 存储session信息,图片验证码,短信验证码
6,session配置
* 目的: 将来用来保存用户的登陆信息
7,CSRFProtect配置
* 目的: 保护app,防止csrf攻击
* 校验的请求方式:'POST', 'PUT', 'PATCH', 'DELETE'
8. 日志信息:
- 目的
1. 记录用户的行为
2. 记录分析软件的问题
3. 便于给产品经理提供设计依据
- 操作流程:
1. 定义好log_file方法,拷贝日志记录方法进来
2. 在create_app方法中调用即可
-优化
* 目的:
为了便于去管理,不同环境下的日志级别
* 操作流程
1. 在config配置文件中,给DevelopConfig,ProductConfig设置不同的级别
2. 在调用create_app方法的时候,传递对应环境的key值
3. 取出对应的环境下的日志级别,将日志级别传递到log_file方法中
manager.py:
from datetime import timedelta
from flask import Flask,session
from flask_sqlalchemy import SQLAlchemy
from redis import StrictRedis
from flask_session import Session
from flask_wtf.csrf import CSRFProtect
app = Flask(__name__)
#设置配置信息
class Config(object):
#调试信息
DEBUG = True
SECRET_KEY = "fdfdjfkdjfkdf"
#数据库配置信息
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@localhost:3306/info36"
SQLALCHEMY_TRACK_MODIFICATIONS = False
#redis配置信息
REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
#session配置信息
SESSION_TYPE = "redis" #设置session存储类型
SESSION_REDIS = StrictRedis(host=REDIS_HOST,port=REDIS_PORT) #指定session存储的redis服务器
SESSION_USE_SIGNER = True #设置签名存储
PERMANENT_SESSION_LIFETIME = timedelta(days=2) #设置session有效期,两天时间
app.config.from_object(Config)
#创建SQLAlchemy对象,关联app
db = SQLAlchemy(app)
#创建redis对象
redis_store = StrictRedis(host=Config.REDIS_HOST,port=Config.REDIS_PORT,decode_responses=True)
#创建Session对象,读取APP中session配置信息
Session(app)
#使用CSRFProtect保护app
CSRFProtect(app)
#测试 :
@app.route('/',methods=["GET","POST"])
def hello_world():
#测试redis存取数据
redis_store.set("name","laowang")
print(redis_store.get("name"))
#测试session存取
session["name"] = "zhangsan"
print(session.get("name"))
return "helloworld"
if __name__ == '__main__':
app.run()
优化:
启动文件(manager.py):
from info import create_app
#调用方法,获取app
app = create_app("product")
if __name__ == '__main__':
app.run()
初始化信息整合:
1.创建info 项目包:
info/__init__: 初始化各模块
import logging
from logging.handlers import RotatingFileHandler
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from redis import StrictRedis
from flask_session import Session
from flask_wtf.csrf import CSRFProtect
from config import config_dict
#定义redis_store变量
redis_store = None
#定义工厂方法
def create_app(config_name):
app = Flask(__name__)
#根据传入的配置类名称,取出对应的配置类
config = config_dict.get(config_name)
#调用日志方法,记录程序运行信息
log_file(config.LEVEL_NAME)
#加载配置类
app.config.from_object(config)
#创建SQLAlchemy对象,关联app
db = SQLAlchemy(app)
#创建redis对象
global redis_store #global将局部变量声明为一个全局的
redis_store = StrictRedis(host=config.REDIS_HOST,port=config.REDIS_PORT,decode_responses=True)
#创建Session对象,读取APP中session配置信息
Session(app)
#使用CSRFProtect保护app
CSRFProtect(app)
#将首页蓝图index_blue,注册到app中
from info.modules.index import index_blue
app.register_blueprint(index_blue)
return app
配置文件整合:
config.py :
工厂模式: 根据不同的调试参数,进入不同的运行环境
import logging
from datetime import timedelta
from redis import StrictRedis
#设置配置信息(基类配置信息)
class Config(object):
#调试信息
DEBUG = True
SECRET_KEY = "fdfdjfkdjfkdf"
#数据库配置信息
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@localhost:3306/info36"
SQLALCHEMY_TRACK_MODIFICATIONS = False
#redis配置信息
REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
#session配置信息
SESSION_TYPE = "redis" #设置session存储类型
SESSION_REDIS = StrictRedis(host=REDIS_HOST,port=REDIS_PORT) #指定session存储的redis服务器
SESSION_USE_SIGNER = True #设置签名存储
PERMANENT_SESSION_LIFETIME = timedelta(days=2) #设置session有效期,两天时间
#默认日志级别
LEVEL_NAME = logging.DEBUG
#开发环境配置信息
class DevelopConfig(Config):
pass
#生产(线上)环境配置信息
class ProductConfig(Config):
DEBUG = False
LEVEL_NAME = logging.ERROR
#测试环境配置信息
class TestConfig(Config):
pass
#提供一个统一的访问入口
config_dict = {
"develop":DevelopConfig,
"product":ProductConfig,
"test":TestConfig
}
视图函数整合:
蓝图的使用:
info/modules/index/__init__:
from flask import Blueprint
#1.创建蓝图对象
index_blue = Blueprint("index",__name__)
#2.导入views文件装饰视图函数
# from info.modules.index import views
from . import views
info/modules/index/views:
from info import redis_store
from . import index_blue
import logging
from flask import current_app
@index_blue.route('/',methods=["GET","POST"])
def hello_world():
#使用日志记录方法loggin进行输出可控
logging.debug("输入调试信息")
#也可以使用current_app来输出日志信息,输出的时候有分割线,写在文件中完全一样
# current_app.logger.debug("输入调试信息2")
return ""
info/__init__:
#将首页蓝图index_blue,注册到app中
from info.modules.index import index_blue
app.register_blueprint(index_blue)
日志文件整合:
info/__init__:
def log_file(LEVEL_NAME):
# 设置日志的记录等级,常见的有四种,大小关系如下: DEBUG < INFO < WARNING < ERROR
logging.basicConfig(level=LEVEL_NAME) # 调试debug级,一旦设置级别那么大于等于该级别的信息全部都会输出
# 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024 * 1024 * 100, backupCount=10)
# 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息
formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')
# 为刚创建的日志记录器设置日志记录格式
file_log_handler.setFormatter(formatter)
# 为全局的日志工具对象(flask app使用的)添加日志记录器
logging.getLogger().addHandler(file_log_handler)
测试:
@index_blue.route('/',methods=["GET","POST"])
def hello_world():
#测试redis存取数据
# redis_store.set("name","laowang")
# print(redis_store.get("name"))
#测试session存取
# session["name"] = "zhangsan"
# print(session.get("name"))
return ""
问题:
1. 日志地使用 ?
先创建logs 文件包 (创建.gitkeep : 忽略log 文件上传)
2. redis 对象的创建在create_app方法内部,外界不能导入使用 ?
--》 在create_app方法外部创建一个空的redis_store使用global 装饰方法内部的redis_store即可
#定义redis_store变量
redis_store = None
#创建redis对象
global redis_store #global将局部变量声明为一个全局的
redis_store = StrictRedis(host=config.REDIS_HOST,port=config.REDIS_PORT,decode_responses=True)
3. 循环导包 ?
-> 导入包时,在各文件内混乱;
思路:
在控制台中,查看到底是哪些文件之间产生了循环导包,依次点开所有的文件,只需要想办法断掉其中一环即可
导包可在方法内部调用