工厂函数
工厂函数就是重新封装了一个create_app函数,然后将一个配置文件传给创建的app实例。 这个配置文件决定了你是什么环境。传参类似于传入什么环境的配置。如果是具有多套环境,工厂函数相对来说就比较有用,如果个人只有一套环境,工厂函数可有可无
pymysql.install_as_MySQLdb()
db = SQLAlchemy()
def create_app(test_config=None):
# create and configure the app
## instance_relative_config设置为True则代表开启从文件加载配置,默认为False
app = Flask(__name__, instance_relative_config=True)
cx = app.app_context()
cx.push()
a = current_app
# app=Flask(__name__)
# 这里做了判断是否运行时传入了测试配置
if test_config is None:
# 如果没有传入,则从py文件加载配置,silent=True代表文件,文件加载成功则返回True
CONFIG_PATH = BASE_PATH / 'RealProject/setting.py'
app.config.from_pyfile(CONFIG_PATH, silent=True)
else:
# 和最开始的配置意思一致
app.config.from_mapping(test_config)
# for item in app.config:
# print(str(item)+':'+str(app.config[item]))
db.init_app(app)
migrate.init_app(app, db)
from app.employee import views
app.register_blueprint(views.bp)
from app.employee import models
return app
if __name__ == '__main__':
app=create_app()
app.run(debug=True)
连接多个不同类型数据库
如果一个项目需要连接mysql以及其他类型数据库,可以通过工厂函数或者直接app.py设置数据库。这里使用mongodb和redis。
工厂函数形式
from flask import Flask, current_app
from flask_sqlalchemy import SQLAlchemy #连接mysql的相关包
from flask_migrate import Migrate
from .setting import BASE_PATH
import pymysql
import datetime
from flask_mongoengine import MongoEngine #连接rmongodb的相关包
from loguru import logger
from flask_redis import FlaskRedis #连接redis的相关包
from flask_caching import Cache #连接redis的相关包,这里由于存入redis有问题,暂不使用
pymysql.install_as_MySQLdb()
db = SQLAlchemy()
mongo = MongoEngine()
migrate = Migrate()
cache = Cache()
fds = FlaskRedis()
def create_app(test_config=None):
# create and configure the app
## instance_relative_config设置为True则代表开启从文件加载配置,默认为False
app = Flask(__name__, instance_relative_config=True)
cx = app.app_context()
cx.push()
a = current_app
app.secret_key = str(datetime.datetime.now())
# app=Flask(__name__)
# 这里做了判断是否运行时传入了测试配置
if test_config is None:
# 如果没有传入,则从默认配置文件传入配置
CONFIG_PATH = BASE_PATH / 'RealProject/setting.py'
app.config.from_pyfile(CONFIG_PATH, silent=True)
else:
# 如果有传入,使用新的配置
app.config.from_mapping(test_config)
# for item in app.config:
# print(str(item)+':'+str(app.config[item]))
logger.add("./logs/mongo_link.log")
mongo.init_app(app)
db.init_app(app) #mysql初始化连接配置
cache.init_app(app) #redis初始化连接配置,可以使用
fds.init_app(app) #redis初始化连接配置
#migrate.init_app(app, db)
from app.employee import views
app.register_blueprint(views.bp)
from app.employee import models
return app
直接使用
from flask import Flask, current_app
from flask_sqlalchemy import SQLAlchemy
from flask_mongoengine import MongoEngine
from urllib.parse import quote
from flask_cache import Cache
from flask_redis import FlaskRedis
app = Flask(__name__)
cx = app.app_context()
cx.push()
a = current_app
app.config.from_object(Config)
app.config.from_mapping(
#mongo所需配置
MONGODB_SETTINGS={
'db': 'flask',
'host': '192.168.xxx.xxx',
'port': 27017,
'connect': True,
'username': 'root',
'password': '123456',
'authentication_source': 'admin'
})
#flask_cache需要的配置,可不使用flask_cache
#CACHE_TYPE = 'RedisCache'
#CACHE_REDIS_HOST = '192.168.xxx.xxx'
#CACHE_REDIS_PORT: 6379
#CACHE_REDIS_DB: ''
#CACHE_REDIS_PASSWORD = ''
REDIS_URL = 'redis://:@192.168.xxx.xxx:6379/0' #flask_redis所需配置
app.config["MONGO_URI"] = "mongodb://192.168.xxx.xxx:27017/flask"
mysql = SQLAlchemy(app)
mongo = MongoEngine()
mongo.init_app(app)
fds = FlaskRedis(app)
mongo模型创建<redis是缓存数据,没有模型可创建>
class User(mongo.Document):
name = mongo.StringField()
password = mongo.StringField()
class Employee(mongo.Document):
name = mongo.StringField()
mongo和redis相关接口创建
@bp.route('/mongoAdd', methods=['POST'])
def add_emp():
data = request.get_json()
input_keys = []
for keys in request.get_json().keys():
input_keys.append(keys)
if input_keys != ['name']:
return jsonify(JsonResponse.error(msg="请校验body体中的输入键"))
employees = Employee.objects().all()
print(len(employees))
emp = Employee(name=data['name'])
emp.save()
return jsonify(JsonResponse.success(msg="mongo添加员工成功"))
@bp.route('/redisSet', methods=['GET', 'POST'])
def redis_set():
name = 'mink'
fds.set(name, 'mike')
# rds.set(name,'mike'.encode())
# print('mike'.encode())
redis_data = rds.get('mink')
print(redis_data)
return jsonify(JsonResponse.success(data=redis_data.decode(),msg='添加并且查询redis成功'))
使用postman为redis和mongodb添加数据
mongo:
redis: