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()
原文地址:https://www.cnblogs.com/yijue-lu/p/10965598.html