zoukankan      html  css  js  c++  java
  • 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. 循环导包 ?
    	-> 导入包时,在各文件内混乱;
        
     思路:
        在控制台中,查看到底是哪些文件之间产生了循环导包,依次点开所有的文件,只需要想办法断掉其中一环即可
        导包可在方法内部调用
    
    
  • 相关阅读:
    联想 Vibe Shot(Z90-3) 免recovery 获取ROOT权限 救砖 VIBEUI V3.1_1625
    联想 Z5S(L78071)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.370
    联想 Z5(L78011) 免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.254
    联想 S5 Pro(L78041)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 5.0.123
    第二阶段 冲刺八
    第二阶段 冲刺七
    第二阶段 冲刺六
    第二阶段 冲刺五
    代码大全阅读笔记03
    学习进度十二
  • 原文地址:https://www.cnblogs.com/star-py-blog/p/13580340.html
Copyright © 2011-2022 走看看