zoukankan      html  css  js  c++  java
  • Flask_案例

    1. 准备工作

    新建项目目录stud, 并创建虚拟环境

    mkvirtualenv stud -p python3

    安装开发中使用的依赖模块

    pip install flask==0.12.4
    pip install redis==3.2.1
    pip install flask-session==0.3.1
    pip install flask-script==2.0.6
    pip install flask-mysqldb==0.2.0
    pip install flask-sqlalchemy==1.3.4
    pip install flask-migrate==2.5.2
    pip install flask_wtf==0.14.2

    在pycharm中打开项目目录,设置虚拟环境以后,编写manage.py启动项目的文件

    注意:安装flask-mysqldb时python底层依赖于一个底层的mysql-client模块,若安装报这个错就先安装

    pip install mysql-client

    上面的安装命令也出现错误则执行

    # 此处在ubuntu下,centos下apt-get换为yum
    apt-get install libmysqlclient-dev python3-dev 

    2. 创建manage.py文件

    新建manage.py,内容:

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/index')
    def index():
        return 'index'
    
    if __name__ == '__main__':
        app.run()

    mange.py终不能存放大量的开发代码, 在开发中应该体现的是一种分工精神,所以我们可以把flask中各种功能代码进行分类分文件存储.

    创建项目目录结构:

    项目根目录/
    ├── application/            # 项目主要逻辑代码保存目录
    |   ├── settings/           # 项目配置存储目录
    │   │   ├ dev.py            # 开发阶段的配置文件
    │   │   ├ prop.py           # 生产阶段的配置文件
    │       ├ __init__.py       # 项目初始化文件
    ├── manage.py               # 项目的终端管理脚本文件

    3. 配置文件

    settings/__init__.py代码:

    from redis import StrictRedis
    
    class Config(object):
        """项目配置核心类"""
        # 调试模式
        DEBUG = True
    
        # todo 配置日志
        pass
    
        # mysql数据库的配置信息
        SQLALCHEMY_DATABASE_URI = ""
        # 动态追踪修改设置,如未设置只会提示警告
        SQLALCHEMY_TRACK_MODIFICATIONS = False
        # 查询时会显示原始SQL语句
        SQLALCHEMY_ECHO= False
    
        # 配置redis
        REDIS_HOST = '127.0.0.1'  # 项目上线以后,这个地址就会被替换成真实IP地址,mysql也是
        REDIS_PORT = 6379
    
        # 设置密钥,可以通过 base64.b64encode(os.urandom(48)) 来生成一个指定长度的随机字符串
        SECRET_KEY = "ghhBljAa0uzw2afLqJOXrukORE4BlkTY/1vaMuDh6opQ3uwGYtsDUyxcH62Aw3ju"
    
        # flask_session的配置信息
        SESSION_TYPE = "redis" # 指定 session 保存到 redis 中
        SESSION_USE_SIGNER = True # 让 cookie 中的 session_id 被加密签名处理
        SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_PORT,db=1) # 使用 redis 的实例
        PERMANENT_SESSION_LIFETIME = 24 * 60 * 60 # session_id的有效期,单位是秒

    settings/dev.py代码:

    from . import Config
    class DevelopementConfig(Config):
        """开发模式下的配置"""
        # 查询时会显示原始SQL语句
        SQLALCHEMY_ECHO= True
        SQLALCHEMY_DATABASE_URI = "mysql://root:123@127.0.0.1:3306/stud?charset=utf8"

    settings/prop.py代码:

    from . import Config
    class ProductionConfig(Config):
        """生产模式下的配置"""
        DEBUG = False
        REDIS_HOST = '127.0.0.1'

    4. 项目应用中初始化项目

    在application/__init__.py文件中,文件中,创建flask应用并加载配置

    from flask import Flask
    from application.settings.dev import DevelopementConfig
    from application.settings.prop import ProductionConfig
    
    config = {
        "dev": DevelopementConfig,
        "prop": ProductionConfig,
    }
    
    def init_app(config_name):
        """项目的初始化函数"""
        app = Flask(__name__)
    
        # 设置配置类
        Config = config.get(config_name)
    
        # 加载配置
        app.config.from_object(Config)
    
        return app

    在manage.py 中调用 init_app 函数,启动项目

    from application import init_app
    
    app = init_app("dev")
    
    @app.route("/")
    def index():
        return "index"
    
    if __name__ == '__main__':
        app.run()

    在application/__init__.py项目初始化文件中加载redis或者mysql的初始化代码

    from flask import Flask
    from redis import StrictRedis
    from flask_wtf.csrf import CSRFProtect
    from flask_session import Session
    
    from application.settings.dev import DevelopementConfig
    from application.settings.prop import ProductionConfig
    
    config = {
        "dev": DevelopementConfig,
        "prop": ProductionConfig,
    }
    
    # 为了方便redis的连接对象在函数外部可以使用,预先设置一个全局变量,接下来在函数中用于保存redis的连接
    redis_store = None
    
    def init_app(config_name):
        """项目的初始化功能"""

    app = Flask(__name__) # 设置配置类 Config = config[config_name] # 加载配置 app.config.from_object(Config) # redis的链接初始化 global redis_store redis_store = StrictRedis(host=Config.REDIS_HOST, port=Config.REDIS_PORT,db=0) # 开启CSRF防范功能 CSRFProtect(app) # 开启session功能 Session(app) # TODO 注册蓝图对象到app应用中 return app

    调整了redis的加载,把redis的配置信息和初始化代码进行分离

    新建文件application/utils/flask_redis,代码:

    from redis import StrictRedis
    def get_redis_connection(option):
        return StrictRedis(host=option['HOST'], port=option['PORT'], db=option['DB'])

    application/settings/__init__.py,代码:

    from redis import StrictRedis
    from application.utils.flask_redis import get_redis_connection
    class Config(object):
        """项目的公共配置核心类"""
        # 调试模式
        DEBUG = True
    
        # todo 配置日志
        pass
    
        # mysql数据库的配置信息
        SQLALCHEMY_DATABASE_URI = ""
        # 动态追踪修改设置,如未设置只会提示警告
        SQLALCHEMY_TRACK_MODIFICATIONS = False
        # 查询时会显示原始SQL语句
        SQLALCHEMY_ECHO= False
    
        # 配置redis
        REDIS = {
            'default':{
                'HOST':'127.0.0.1',  # 项目上线以后,这个地址就会被替换成真实IP地址,mysql也是
                'PORT':6379,
                'DB': 0
            },
            'session':{
                'HOST': '127.0.0.1',  # 项目上线以后,这个地址就会被替换成真实IP地址,mysql也是
                'PORT': 6379,
                'DB': 1
            }
        }
    
        # 设置密钥,可以通过 base64.b64encode(os.urandom(48)) 来生成一个指定长度的随机字符串
        SECRET_KEY = "ghhBljAa0uzw2afLqJOXrukORE4BlkTY/1vaMuDh6opQ3uwGYtsDUyxcH62Aw3ju"
    
        # flask_session的配置信息
        SESSION_TYPE = "redis" # 指定 session 保存到 redis 中
        SESSION_USE_SIGNER = True # 让 cookie 中的 session_id 被加密签名处理
        SESSION_REDIS = get_redis_connection(REDIS['session']) # 使用 redis 的实例
        PERMANENT_SESSION_LIFETIME = 24 * 60 * 60 # session_id的有效期,单位是秒

    application/__init__.py

    from flask import Flask
    from .settings.dev import DevelopementConfig
    from .settings.prop import ProductionConfig
    from flask_wtf import CSRFProtect
    from flask_session import Session
    
    config = {
        "dev": DevelopementConfig,
        "prop": ProductionConfig,
    }
    
    """APP的初始化函数"""
    def init_app(config_name):
    
        app = Flask(__name__)
    
        # 设置配置类
        global Config
        Config = config.get(config_name)
    
        # 加载配置
        app.config.from_object(Config)
    
        # 开启CSRF防范功能
        CSRFProtect(app)
    
        # 开启session功能
        Session(app)
    
        # TODO 注册蓝图对象到app应用中
    
        return app

    settings/dev.py配置文件,代码:

    from . import Config
    class DevelopementConfig(Config):
        """开发模式下的配置"""
        # 查询时会显示原始SQL语句
        SQLALCHEMY_ECHO= True
        SQLALCHEMY_DATABASE_URI = "mysql://root:123@127.0.0.1:3306/stud?charset=utf8"
    
        # redis的相关配置写在公共配置中

    以后希望在视图中使用redis可以如下使用:

    mange.py代码:

    from application import init_app
    app = init_app('dev')
    @app.route("/")
    def index():
    
        from application.utils.flask_redis import get_redis_connection
        redis = get_redis_connection( app.config.get('REDIS').get("session") )
        print(redis)
    
        return "hello"
    
    if __name__ == '__main__':
        app.run()

    5. 加数据库配置

    application/__init__.py

    from flask import Flask
    from .settings.dev import DevelopementConfig
    from .settings.prop import ProductionConfig
    from flask_wtf import CSRFProtect
    from flask_session import Session
    from flask_sqlalchemy import SQLAlchemy
    
    config = {
        "dev": DevelopementConfig,
        "prop": ProductionConfig,
    }
    
    db = SQLAlchemy()
    
    """APP的初始化函数"""
    def init_app(config_name):
    
        app = Flask(__name__)
    
        # 设置配置类
        global Config
        Config = config.get(config_name)
    
        # 加载配置
        app.config.from_object(Config)
    
        # 开启CSRF防范功能
        CSRFProtect(app)
    
        # 开启session功能
        Session(app)
    
        # 数据库初始化
        db.init_app(app)
    
        # TODO 注册蓝图对象到app应用中
    
        return app

    因为前面已经在settings中设置了数据库的配置信息,所以接下来,创建对应的数据库

    create database stud charset=utf8mb4;

    在manage启动文件中新增关于启动过程中的相关功能

     在项目根目录下`manage.py中设置项目启动程序并调用__init__.py的app

    from application import init_app,db
    from flask_script import Manager
    from flask_migrate import Migrate, MigrateCommand
    
    app = init_app("dev")
    
    # 使用终端脚本工具启动和管理flask
    manager = Manager(app)
    
    # 启用数据迁移工具
    Migrate(app, db)
    # 添加数据迁移的命令到终端脚本工具中
    manager.add_command('db', MigrateCommand)
    
    
    @app.route("/")
    def index():
        return "index"
    
    if __name__ == '__main__':
        manager.run()
  • 相关阅读:
    [CSP-S模拟测试]:集合合并(记忆化搜索)
    [CSP-S模拟测试]:小L的数(数位DP+模拟)
    [CSP-S模拟测试]:小Y的图(最小生成树+LCA)
    [CSP-S模拟测试]:小W的魔术(数学 or 找规律)
    [CSP-S模拟测试]:最大值(数学+线段树)
    [CSP-S模拟测试]:最小值(DP+乱搞)
    [CSP-S模拟测试]:中间值(二分)
    [CSP-S模拟测试]:Cover(单调栈++单调队列+DP)
    [JZO6401]:Time(贪心+树状数组)
    BZOJ3193 [JLOI2013]地形生成 【dp】
  • 原文地址:https://www.cnblogs.com/yijue-lu/p/10965598.html
Copyright © 2011-2022 走看看