创建项目

- 创建git忽略文件, 并生成项目的本地仓库
 - 项目中创建四个包app、 mp、 mis、 common, 分别对应三个web应用: 前台程序、媒体端程序、后台程序, 以及各web应用需要使用的公共内容

定义工厂函数
- 在 app包中创建 settings包, 用于存放项目配置, 并在 settings包中创建 config文件并设置默认配置
class DefaultConfig:
"""默认配置"""
pass
config_dict = {
'dev': DefaultConfig
}
- 在 common包中创建 utils包, 并在 utils包中创建 constants文件, 用于存放所有常量
- 在 constants文件中 定义常量记录隐私配置使用的环境变量名
EXTRA_ENV_COINFIG = 'ENV_CONFIG'
- 在 app包的初始化文件中完成以下两步
定义工厂函数 添加 common路径
from flask import Flask
from os.path import *
import sys
BASE_DIR = dirname(dirname(abspath(__file__)))
sys.path.insert(0, BASE_DIR + '/common')
from app.settings.config import config_dict
from utils.constants import EXTRA_ENV_COINFIG
def create_flask_app(type):
"""创建flask应用"""
app = Flask(__name__)
config_class = config_dict[type]
app.config.from_object(config_class)
app.config.from_envvar(EXTRA_ENV_COINFIG, silent=True)
return app
def create_app(type):
"""创建应用 和 组件初始化"""
app = create_flask_app(type)
return app
项目运行
在 app包中创建 main文件, 在其中完成以下两步
- 通过工厂函数创建flask应用对象
- 定义根路由, 用于获取项目定义的所有路由
from app import create_app
from flask import jsonify
app = create_app('dev')
@app.route('/')
def route_map():
"""定义根路由: 获取所有路由规则"""
return jsonify({rule.endpoint: rule.rule for rule in app.url_map.iter_rules()})
- 右键运行 main文件, 生成程序默认配置
- 修改程序配置, 设置环境变量、解释器参数
 - 修改程序默认配置生成的项目目录, 默认为主文件的上一级
 - 运行程序, 测试根路由

配置数据库
设置相关配置 在 config文件中设置 MYSQL 和 REDIS 的相关配置
class DefaultConfig:
"""默认配置"""
SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@192.168.105.140:3306/hm_topnews'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = False
REDIS_HOST = '192.168.105.140'
REDIS_PORT = 6381
...
通过 pycharm数据库管理工具/ssh工具 在centos虚拟机中创建相应的mysql数据库

SQLAlchemy组件初始化 在 app包的初始化文件中:
- 创建SQLAlchemy组件对象
- 定义函数register_extensions 对 SQLAlchemy 进行组件初始化
...
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def register_extensions(app):
"""组件初始化"""
from app import db
db.init_app(app)
...
def create_app(type):
"""创建应用 和 组件初始化"""
app = create_flask_app(type)
register_extensions(app)
return app
Redis组件初始化
- redis操作使用第三方包redis-py, 安装 pip install redis==2.10
- 在 app包的初始化文件中
创建Redis操作对象 在函数register_extensions 中对Redis进行组件初始化
...
from redis import StrictRedis
...
redis_client = None
def register_extensions(app):
"""组件初始化"""
...
global redis_client
redis_client = StrictRedis(host=app.config['REDIS_HOST'], port=app.config['REDIS_PORT'], decode_responses=True)
 
配置模块化
创建功能包
- 在 app包中创建 resources包, 用于包含各功能模块的视图
- 在 resources包中创建 article 和 user包, 分别用于存放 文章模块 和 用户模块的视图文件

定义视图函数
- 在 user包中创建 passport文件, 用于存放用户认证相关的视图函数
- 定义 SMSCodeResource类视图, 实现 get视图函数 用于测试
from flask_restful import Resource
class SMSCodeResource(Resource):
"""获取短信验证码"""
def get(self):
return {'foo': 'get'}
3. 蓝图初始化 在 user包的初始化文件中进行蓝图的初始化处理
from flask import Blueprint
from flask_restful import Api
from .passport import SMSCodeResource
user_bp = Blueprint('user', __name__)
user_api = Api(user_bp)
user_api.add_resource(SMSCodeResource, '/sms/codes')
4. 注册蓝图 在 app包的初始化文件中定义函数register_bp注册蓝图
def register_bp(app:Flask):
"""注册蓝图"""
from app.resources.user import user_bp
app.register_blueprint(user_bp)
def create_app(type):
"""创建应用 和 组件初始化"""
...
register_bp(app)
return app
5. 设置JSON转换函数
- 在 common/utils包中导入物料文件 output.py, 其中定义了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 'message' not in data:
data = {
'message': 'OK',
'data': data
}
settings = current_app.config.get('RESTFUL_JSON', {})
if current_app.debug:
settings.setdefault('indent', 4)
settings.setdefault('sort_keys', not PY3)
dumped = dumps(data, **settings) + "\n"
resp = make_response(dumped, code)
resp.headers.extend(headers or {})
return resp
- 在 user包的初始化文件中, 使用组件对象设置json转换函数
...
from utils.output import output_json
user_api.representation('application/json')(output_json)
user_api.add_resource(SMSCodeResource, '/sms/codes')
|