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. 循环导包 ?
    	-> 导入包时,在各文件内混乱;
        
     思路:
        在控制台中,查看到底是哪些文件之间产生了循环导包,依次点开所有的文件,只需要想办法断掉其中一环即可
        导包可在方法内部调用
    
    
  • 相关阅读:
    Android获取Java类名/文件名/方法名/行号
    Service的onStartCommand方法的返回值和参数详解
    Centos7 k8s Replication副本控制器
    Centos7 k8s 基础单元pod
    Linux问题故障定位
    Linux 搭建YUM仓库源详解
    Centos7 k8s安装部署
    Centos7 KVM热迁移
    Centos7 KVM热添加网卡、内存、CPU
    Centos7 KVM虚拟机硬盘热添加和扩容
  • 原文地址:https://www.cnblogs.com/star-py-blog/p/13580340.html
Copyright © 2011-2022 走看看