百变星君---项目初始化搭建

一:项目初始化:

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:测试:
在这里插入图片描述

六:再次登录断开连接

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奈何碎银没有几两

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值