一:项目初始化:
1:在app/settings/config.py
中编写配置信息:
# 配置父类
class BaseConfig(object):
SECRET_KEY = "python"
# 开发模式配置信息
class DevelopmentConfig(BaseConfig):
DEBUG = True
# 生产模式配置信息
class ProductionConfig(BaseConfig):
DEBUG = False
# 测试模式配置信息
class TestingConfig(BaseConfig):
TESTING = True
# 给别的模块提供调用的接口
config_dict = {
"dev", DevelopmentConfig,
"pro", ProductionConfig,
"test", TestingConfig
}
2:在初始化文件中创建app的工厂方法
app/settings/__init__.py
from flask import Flask
from app.settings.config import config_dict
from common.utils.contants import EXTRA_ENV_CONFIG
import os, sys
"""
项目初始化文件
# 1:定义工厂函数
# 2:将common路径添加到python的搜索路径中。
"""
# 项目的根路径TopNews
BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, BASE_PATH + '/common')
def _create_flask_app(config_name):
"""
内部调用创建app对象的工厂方法
:param config_name: 配置名
:return: app对象
"""
# 1:创建app对象
app = Flask(__name__)
# 2:读取配置类中的配置信息
config_class = config_dict[config_name]
app.config.from_object(config_class)
# 3:读取环境变量中的配置信息
app.config.from_envvar(EXTRA_ENV_CONFIG, silent=True)
return app
3:在common/utils/contants.py
中填写全局变量信息:
# 隐私配置的环境变量
EXTRA_ENV_CONFIG = 'ENV_CONFIG'
4:在app/settings/__init__.py
文件中创建一个外部可以调用的工厂方法:
# 提供一个给外界调用的创建app的方法
def create_app(config_name):
"""
外部调用工厂方法创建app对象
:param config_name:
:return:
"""
# 1:创建app对象
app = _create_flask_app(config_name)
# 2: TODO: 注册拓展主键
# 3:TODO:注册蓝图组件
return app
5:在app/main.py
中创建app对象和路由:
from app import create_app
from flask import jsonify
# 1: 通过工厂方法创建app
app = create_app('dev')
# 2:定义视图函数绑定路由信息
@app.route('/')
def index():
rule_dict = {rule.rule: rule.endpoint for rule in app.url_map.iter_rules()}
return jsonify(rule_dict)
6:进行测试:
二:配置MYSQL数据库:
1:更新配置类,增加mysql数据库的配置信息:
app/settings/config.py
class BaseConfig(object):
# 加密密钥
SECRET_KEY = "python"
# mysql数据库的配置信息 + 解决内部报错
SQLALCHEMY_DATABASE_URI = "root+mysql://python:chuanzhi@192.168.44.128:3306/hm_topnews"
# 开启底层输出sql语句
SQLALCHEMY_ECHO = True
# 关闭数据库修改跟踪
SQLALCHEMY_TRACK_MODIFICATIONS = False
# redis数据库的配置信息
REDIS_HOST = "192.168.44.128"
REDIS_PORT = 6381
2:创建数据库对象,并进行延后关联。
app/settings/__init__.py
# 创建数据库对象,定义成全局变量,方便别的模块调用。
db = SQLAlchemy()
# 提供一个给外界调用的创建app的方法
def create_app(config_name):
"""
外部调用工厂方法创建app对象
:param config_name:
:return:
"""
# 1:创建app对象
app = _create_flask_app(config_name)
# 2: TODO: 注册拓展主键
# 创建数据库对象
register_extendions(app)
# 3:TODO:注册蓝图组件
return app
def register_extendions(app:Flask):
# 1: 数据库对象关联app,延后关联
db.init_app(app)
三:配置Redis数据库:
1:增加redis数据库的配置信息:
app/settings/config.py
# 配置父类
class BaseConfig(object):
....
# redis数据库的配置信息
REDIS_HOST = "192.168.44.128"
REDIS_PORT = 6379
2:创建redis数据对象,并且工厂方法进行实例化:
app/settings/__init__.py
# 创建redis数据库对象,延后加载。
redis_cli = None # type: StrictRedis
def register_extendions(app:Flask):
# 1: 数据库对象关联app,延后关联
db.init_app(app)
global redis_cli
# 2: redis数据库都西昂,延后关联,响应解码
redis_cli = StrictRedis(host=app.config['REDIS_HOST'],
port=app.config["REDIS_PORT"],
decode_responses=True)
四:配置模块化:
1:创建发送验证码的类视图:
app/resources/user/passport
from flask_restful import Resource
class SMSCodeResource(Resource):
"""
发送短信验证码的视图
"""
def get(self, mobile):
return "get message"
2:创建用户模块的蓝图:
app/resources/user/__init__
from flask import Blueprint
from flask_restful import Api
from utils.contants import USER_URL_PREFIX
# 1:创建蓝图对象
user_bp = Blueprint("suer", __name__, url_prefix=USER_URL_PREFIX)
# 2:将蓝图对象包装成具备restful风格的组件对象
user_api = Api(user_bp)
# 3:给类视图增加信息
from app.resources.user.passport import SMSCodeResource
user_api.add_resource(SMSCodeResource)
3:在全局环境变量中增加用户模块的路由前缀:
common/utils/constants
# 隐私配置的环境变量
EXTRA_ENV_CONFIG = 'ENV_CONFIG'
# user蓝图的路由前缀
USER_URL_PREFIX = "/app"
4:注册蓝图,生成注册过蓝图的app对象。
app/settings/__init__.py
def register_Blueprint(app:Flask):
# 1:注册用户模块的蓝图
# 注意避免循环导包
from app.resources.user import user_bp
# /app/sms/codes/18511112222
user_api.add_resource(SMSCodeResource, '/sms/codes/<mobile>')
# 提供一个给外界调用的创建app的方法
def create_app(config_name):
...
# 3:TODO:注册蓝图组件
register_Blueprint(app)
return app
5:测试:
五:自定义JSON的返回格式:
1:重写flask_restful自定义的json返回。
common/utils/output_json
from flask import make_response, current_app, request
from flask_restful.utils import PY3
from json import dumps
def output_json(data, code, headers=None):
"""Makes a Flask response with a JSON encoded body"""
if str(code) == '400':
current_app.logger.warn(request.headers)
current_app.logger.warn(request.data)
current_app.logger.warn(str(data))
if 'message' not in data:
data = {
'message': 'OK',
'data': data
}
settings = current_app.config.get('RESTFUL_JSON', {})
# If we're in debug mode, and the indent is not set, we set it to a
# reasonable value here. Note that this won't override any existing value
# that was set. We also set the "sort_keys" value.
if current_app.debug:
settings.setdefault('indent', 4)
settings.setdefault('sort_keys', not PY3)
# always end the json dumps with a new line
# see https://github.com/mitsuhiko/flask/pull/1262
dumped = dumps(data, **settings) + "\n"
resp = make_response(dumped, code)
resp.headers.extend(headers or {})
return resp
2:让output_json主动装饰:
app/resources/user/__init__.py
# 5: 装饰自定义返回json格式的函数output_json
# 通俗来讲,就是将自定义的output_json变成装饰器,能够装饰蓝图对象下的视图
user_api.representation(mediatype="application/json")(output_json())
3:修改视图返回字典:
class SMSCodeResource(Resource):
"""
发送短信验证码的视图
"""
def get(self, mobile):
return {"get": "foo"}
4:测试:
六:再次登录断开连接