返回顶部
扩大
缩小
大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。遥想公瑾当年,小乔初嫁了,雄姿英发。羽扇纶巾,谈笑间,樯橹灰飞烟灭。故国神游,多情应笑我,早生华发。人生如梦,一尊还酹江月。

flask 新闻资讯项目一

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. 循环导包 ?
	-> 导入包时,在各文件内混乱;
    
 思路:
    在控制台中,查看到底是哪些文件之间产生了循环导包,依次点开所有的文件,只需要想办法断掉其中一环即可
    导包可在方法内部调用

posted on 2020-08-28 23:39  晨星_star  阅读(263)  评论(0编辑  收藏  举报

导航