zoukankan      html  css  js  c++  java
  • 7. admin后台站点配置

    flask-Admin构建和配置后台运营站点

    Flask-Admin

    文档:https://flask-admin.readthedocs.io/en/latest/

    安装

    pip install flask-admin 
    
    模块初始化
    1. 项目主文件: application/__init__.py,代码:
    import os
    
    from flask import Flask
    from flask_script import Manager
    from flask_sqlalchemy import SQLAlchemy
    from flask_redis import FlaskRedis
    from flask_session import Session
    from flask_jsonrpc import JSONRPC
    from faker import Faker
    from celery import Celery
    from flask_jwt_extended import JWTManager
    from flask_admin import Admin
    
    from application.utils.config import init_config
    from application.utils.logger import Log
    from application.utils.commands import load_commands
    from application.utils.bluerprint import register_blueprint, path, include, api_rpc
    from application.utils import message, code
    from application.utils.unittest import BasicTestCase
    from application.utils.OssStore import OssStore
    
    # 终端脚本工具初始化
    manager = Manager()
    
    # SQLAlchemy初始化
    db = SQLAlchemy()
    
    # redis数据库初始化
    # - 1.默认缓存数据库对象,配置前缀为REDIS
    redis_cache = FlaskRedis(config_prefix='REDIS')
    # - 2.验证相关数据库对象,配置前缀为CHECK
    redis_check = FlaskRedis(config_prefix='CHECK')
    # - 3.验证相关数据库对象,配置前缀为SESSION
    redis_session = FlaskRedis(config_prefix='SESSION')
    
    # session储存配置初始化
    session_store = Session()
    
    # 自定义日志初始化
    logger = Log()
    
    # 初始化jsonrpc模块
    jsonrpc = JSONRPC()
    
    # 初始化随机生成数据模块faker
    faker = Faker(locale='zh-CN') # 指定中文
    
    # 初始化异步celery
    celery = Celery()
    
    # jwt认证模块初始化
    jwt = JWTManager()
    
    # 阿里云对象存储oss初始化
    oss = OssStore()
    
    # admin后台站点初始化
    admin = Admin()
    
    # 全局初始化
    def init_app(config_path):
        """全局初始化 - 需要传入加载开发或生产环境配置路径"""
        # 创建app应用对象
        app = Flask(__name__)
    
        # 当前项目根目录
        app.BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
        # 开发或生产环境加载配置
        init_config(app, config_path)
    
        # SQLAlchemy加载配置
        db.init_app(app)
    
        # redis加载配置
        redis_cache.init_app(app)
        redis_check.init_app(app)
        redis_session.init_app(app)
    
        """一定先加载默认配置,再传入APP加载session对象"""
        # session保存数据到redis时启用的链接对象
        app.config["SESSION_REDIS"] = redis_session
        # session存储对象加载配置
        session_store.init_app(app)
    
        # 为日志对象加载配置
        log = logger.init_app(app)
        app.log = log
    
        # json-rpc加载配置
        jsonrpc.init_app(app)
        # rpc访问路径入口(只有唯一一个访问路径入口),默认/api
        jsonrpc.service_url = app.config.get('JSON_SERVER_URL', '/api')
        jsonrpc.enable_web_browsable_api = app.config.get("ENABLE_WEB_BROWSABLE_API",False)
        app.jsonrpc = jsonrpc
    
        # 自动注册蓝图
        register_blueprint(app)
    
        # 加载celery配置
        celery.main = app.name
        celery.app = app
        # 更新配置
        celery.conf.update(app.config)
        # 自动注册任务
        celery.autodiscover_tasks(app.config.get('INSTALL_BLUEPRINT'))
    
        # jwt认证加载配置
        jwt.init_app(app)
    
        # faker作为app成员属性
        app.faker = faker
    
        # 注册模型,创建表
        with app.app_context():
            db.create_all()
    
        # 阿里云存储对象加载配置
        oss.init_app(app)
    
        # admin后台站点加载配置
        admin.name = app.config.get('FLASK_ADMIN_NAME') # 站点名称
        admin.template_mode = app.config.get('FLASK_TEMPLATE_MODE') # 使用的模板
        admin.init_app(app)
    
        # 终端脚本工具加载配置
        manager.app = app
    
        # 自动注册自定义命令
        load_commands(manager)
    
        return manager
    
    1. 项目开发配置文件settings/dev.py,代码:
    """admin后台站点配置"""
    FLASK_ADMIN_NAME = '魔方APP' # 后台站点名称
    FLASK_TEMPLATE_MODE = 'bootstrap4' # 模板(2,3,4
    
    1. 测试代码,

    我们可以在users的任意一个文件中,编写一段官方提供的基于模型生成后台视图功能的代码,这里我们先写在users/urls.py里面。

    from application import path, api_rpc
    # 引入当前蓝图应用视图 , 引入rpc视图
    from . import views, api
    
    # 蓝图路径与函数映射列表
    urlpatterns = []
    
    # rpc方法与函数映射列表[rpc接口列表]
    apipatterns = [
        api_rpc('check_mobile', api.check_mobile),
        api_rpc('register', api.register),
        api_rpc('login', api.login),
        api_rpc('access', api.access_token),
        api_rpc('refresh', api.refresh_token), # 刷新access_token值
        api_rpc('update_avatar', api.update_avatar), # 更新头像
        api_rpc('update_nickname', api.update_nickname), # 更新昵称
        api_rpc('update_mobile', api.update_mobile), # 更新手机号
    ]
    
    
    from application import admin, db
    from flask_admin.contrib.sqla import ModelView
    from .models import User    # 后台站点模型类
    admin.add_view(ModelView(User, db.session, name='用户')) # 把模型类添加到后台站点
    

    运行项目, 访问后台站点 ; http://0.0.0.0:5000/admin/

    模块配置

    因为后台站点的相关代码肯定很多,页面也多,所以我们把每一个蓝图下关于admin站点相关配置的代码编写在每一个蓝图下的admin.py 中,并且在蓝图初始化中进行自动加载.

    1. 蓝图初始化自动加载admin站点配置 application/utils/blueprint.py,代码:
    from flask import Blueprint
    # 引入导包函数
    from importlib import import_module
    
    # 自动注册蓝图
    def register_blueprint(app):
        # 从配置文件中读取总路由路径信息
        app_urls_path = app.config.get('URL_PATH')
        # 导包,导入总路由模块
        app_urls_module = import_module(app_urls_path)
        # 获取总路由列表
        app_urlpatterns = app_urls_module.urlpatterns
    
        # 从配置文件中读取需要注册到项目中的蓝图路径信息
        blueprint_path_list = app.config.get('INSTALL_BLUEPRINT')
        # 遍历蓝图路径列表,对每一个蓝图进行初始化
        for blueprint_path in blueprint_path_list:
            # 获取蓝图路径中最后一段的包名作为蓝图的名称
            blueprint_name = blueprint_path.split('.')[-1]
            # 创建蓝图对象
            blueprint = Blueprint(blueprint_name, blueprint_path)
    
            # 蓝图路由的前缀
            url_prefix = ""
            # 蓝图下的子路由列表
            urlpatterns = []
    
            # 获取蓝图的父级目录, 即application/apps
            blueprint_father_path =  ".".join( blueprint_path.split(".")[:-1] )
            # 循环总路由列表
            for item in app_urlpatterns:
                # 判断当前蓝图是否在总路由列表中
                if blueprint_name in item["blueprint_url_subfix"]:
                    # 导入蓝图下的子路由模块
                    urls_module = import_module(blueprint_father_path + "." + item["blueprint_url_subfix"])
                    # 获取urls模块下蓝图路由列表urlpatterns
                    urlpatterns = [] # 防止下边调用循环报错
                    try:
                        urlpatterns = urls_module.urlpatterns
                    except Exception:
                        pass
                    # 提取蓝图路由的前缀
                    url_prefix = item["url_prefix"]
                    # 获取urls模块下rpc接口列表apipatterns
                    apipatterns = [] # 防止下边调用循环报错
                    try:
                        apipatterns = urls_module.apipatterns
                    except Exception:
                        pass
                    # 从总路由中查到当前蓝图对象的前缀就不要继续往下遍历了
                    break
    
            # 注册蓝图路由
            for url in urlpatterns:
                blueprint.add_url_rule(**url)
    
            # 注册rpc接口
            api_prefix_name = ''
            # 判断是否开启补充api前缀
            if app.config.get('JSON_PREFIX_NAME', False) == True:
                api_prefix_name = blueprint_name.title() + '.'
            # 循环rpc接口列表,进行注册
            for api in apipatterns:
                app.jsonrpc.site.register(api_prefix_name + api['name'], api['method'])
    
            # 导入蓝图模型
            import_module(blueprint_path + '.models')
    
            try:
                # 导入蓝图下的admin站点配置
                import_module(blueprint_path + '.admin')
            except ModuleNotFoundError:
                pass
    
            # 把蓝图对象注册到app实例对象,并添加路由前缀
            app.register_blueprint(blueprint, url_prefix=url_prefix)
    
    # 把url地址和视图方法映射关系处理成字典
    def path(rule, view_func, **kwargs):
        """绑定url地址和视图的映射关系"""
        data = {
            'rule':rule,
            'view_func':view_func,
            **kwargs
        }
        return data
    
    # 把rpc方法名和视图的映射关系处理成字典
    def api_rpc(name, method, **kwargs):
        """
        :param name: rpc方法名
        :param method: 视图名称
        :param kwargs: 其他参数。。
        :return:
        """
        data = {
            'name':name,
            'method':method,
            **kwargs
        }
        return data
    
    
    # 路由前缀和蓝图进行绑定映射
    def include(url_prefix, blueprint_url_subfix):
        """
    
        :param url_prefix: 路由前缀
        :param blueprint_url_subfix: 蓝图路由,
                格式:蓝图包名.路由模块名
                例如:蓝图目录是home, 路由模块名是urls,则参数:home.urls
        :return:
        """
        data = {
            "url_prefix": url_prefix,
            "blueprint_url_subfix": blueprint_url_subfix
        }
        return data
    
    
    1. 把上面编写在users.urls中的admin站点配置代码,转义到users/admin.py中,并重新启动项目。
    from application import admin, db
    from flask_admin.contrib.sqla import ModelView
    from .models import User    # 后台站点模型类
    
    admin.add_view(ModelView(User, db.session, name='用户')) # 把模型类添加到后台站点
    

    快速使用

    修改和配置admin站点的默认首页
    1. 在蓝图初始化设置默认首页主体模板.application/utils/blueprint.py,代码:
    from flask import Blueprint
    # 引入导包函数
    from importlib import import_module
    
    
    # 自动注册蓝图
    def register_blueprint(app):
        """
        自动注册蓝图
        :param app: 当前flask的app实例对象
        :return:
        """
        
        # 从配置文件中读取总路由路径信息
        app_urls_path = app.config.get('URL_PATH')
        # 导包,导入总路由模块
        app_urls_module = import_module(app_urls_path)
        # 获取总路由列表
        app_urlpatterns = app_urls_module.urlpatterns
    
        # 从配置文件中读取需要注册到项目中的蓝图路径信息
        blueprint_path_list = app.config.get('INSTALL_BLUEPRINT')
        # 遍历蓝图路径列表,对每一个蓝图进行初始化
        for blueprint_path in blueprint_path_list:
            # 获取蓝图路径中最后一段的包名作为蓝图的名称
            blueprint_name = blueprint_path.split('.')[-1]
            # 创建蓝图对象
            blueprint = Blueprint(blueprint_name, blueprint_path)
    
            # 蓝图路由的前缀
            url_prefix = ""
            # 蓝图下的子路由列表
            urlpatterns = []
    
            # 获取蓝图的父级目录, 即application/apps
            blueprint_father_path =  ".".join( blueprint_path.split(".")[:-1] )
            # 循环总路由列表
            for item in app_urlpatterns:
                # 判断当前蓝图是否在总路由列表中
                if blueprint_name in item["blueprint_url_subfix"]:
                    # 导入蓝图下的子路由模块
                    urls_module = import_module(blueprint_father_path + "." + item["blueprint_url_subfix"])
                    # 获取urls模块下蓝图路由列表urlpatterns
                    urlpatterns = [] # 防止下边调用循环报错
                    try:
                        urlpatterns = urls_module.urlpatterns
                    except Exception:
                        pass
                    # 提取蓝图路由的前缀
                    url_prefix = item["url_prefix"]
                    # 获取urls模块下rpc接口列表apipatterns
                    apipatterns = [] # 防止下边调用循环报错
                    try:
                        apipatterns = urls_module.apipatterns
                    except Exception:
                        pass
                    # 从总路由中查到当前蓝图对象的前缀就不要继续往下遍历了
                    break
    
            # 注册蓝图路由
            for url in urlpatterns:
                blueprint.add_url_rule(**url)
    
            # 注册rpc接口
            api_prefix_name = ''
            # 判断是否开启补充api前缀
            if app.config.get('JSON_PREFIX_NAME', False) == True:
                api_prefix_name = blueprint_name.title() + '.'
            # 循环rpc接口列表,进行注册
            for api in apipatterns:
                app.jsonrpc.site.register(api_prefix_name + api['name'], api['method'])
    
            # 导入蓝图模型
            import_module(blueprint_path + '.models')
    
            try:
                # 导入蓝图下的admin站点配置
                import_module(blueprint_path + '.admin')
            except ModuleNotFoundError:
                pass
    
            # 把蓝图对象注册到app实例对象,并添加路由前缀
            app.register_blueprint(blueprint, url_prefix=url_prefix)
    
        # 后台站点首页相关初始化[这段代码在循环蓝图完成以后,在循环体之外]
        from flask_admin import AdminIndexView  # admin主视图
        from application import admin
        admin._set_admin_index_view(index_view=AdminIndexView(
            name = app.config.get('ADMIN_HOME_NAME'), # 默认首页名称
            template= app.config.get('ADMIN_HOME_TEMPLATE') # 默认首页模板路径
        ))
    
    # 把url地址和视图方法映射关系处理成字典
    def path(rule, view_func, **kwargs):
        """绑定url地址和视图的映射关系"""
        data = {
            'rule':rule,
            'view_func':view_func,
            **kwargs
        }
        return data
    
    # 把rpc方法名和视图的映射关系处理成字典
    def api_rpc(name, method, **kwargs):
        """
        :param name: rpc方法名
        :param method: 视图名称
        :param kwargs: 其他参数。。
        :return:
        """
        data = {
            'name':name,
            'method':method,
            **kwargs
        }
        return data
    
    
    # 路由前缀和蓝图进行绑定映射
    def include(url_prefix, blueprint_url_subfix):
        """
    
        :param url_prefix: 路由前缀
        :param blueprint_url_subfix: 蓝图路由,
                格式:蓝图包名.路由模块名
                例如:蓝图目录是home, 路由模块名是urls,则参数:home.urls
        :return:
        """
        data = {
            "url_prefix": url_prefix,
            "blueprint_url_subfix": blueprint_url_subfix
        }
        return data
    
    
    1. 在开发配置文件中 settings/dev.py,配置admin站点的默认首页的导航名称和模板文件,代码:
    """admin后台站点配置"""
    FLASK_ADMIN_NAME = '魔方APP' # 后台站点名称
    FLASK_TEMPLATE_MODE = 'bootstrap4' # 模板(2,3,4)
    ADMIN_HOME_NAME = 'Welcome' # 默认首页名称
    ADMIN_HOME_TEMPLATE = "admin/index.html" # 默认首页模板
    
    1. 在aplication下新增模板目录及文件 application/templates/admin/index.html
    {% extends 'admin/master.html' %}
    {% block body %}
        <h1>admin站点默认首页</h1>
    {% endblock %}
    
    

    运行项目, 直接访问admin站点后台查看效果。

    新增自定义导航页面
    1. 用户导航模板 application/templates/users/index.html, 代码:
    {% extends 'admin/master.html' %}
    {% block body %}
        <h1>自定义导航页面</h1>
        <h1>{{title}}</h1>
        <table border="1" align="center">
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>年龄</th>
            </tr>
            {% for user in user_list %}
            <tr>
                <td>{{ user.id }}</td>
                <td>{{ user.name }}</td>
                <td>{{ user.age }}</td>
            </tr>
            {% endfor %}
        </table>
    
    {% endblock %}
    
    
    
    1. 自定义导航页面 application/apps/users/admin.py,代码:
    # from application import admin, db
    # from flask_admin.contrib.sqla import ModelView
    # from .models import User    # 后台站点模型类
    # admin.add_view(ModelView(User, db.session, name='用户')) # 把模型类添加到后台站点
    
    
    # 自定义导航页面
    from flask_admin import BaseView, expose
    
    from application import admin
    from .models import User
    
    # 用户模型视图类
    class UserAdmin(BaseView):
        '''用户模型视图类'''
        @expose('/')
        def index(self, *args, **kwargs):
            data = {}
            data['title'] = 'admin站点用户相关的内容'
            data['user_list'] = User.query.filter(User.is_deleted == False).all()
            return self.render(template='users/index.html', **data)
    # 注册导航页面到Admin
    admin.add_view(UserAdmin(name='用户', url='users'))
    
    
    基于模型自动生成导航页面

    application/apps/users/admin.py,代码:

    # # 自定义导航页面
    # from flask_admin import BaseView, expose
    #
    # from application import admin
    # from .models import User
    #
    # # 用户模型视图类
    # class UserAdmin(BaseView):
    #     '''用户模型视图类'''
    #     @expose('/')
    #     def index(self, *args, **kwargs):
    #         data = {}
    #         data['title'] = 'admin站点用户相关的内容'
    #         data['user_list'] = User.query.filter(User.is_deleted == False).all()
    #         return self.render(template='users/index.html', **data)
    # # 注册导航页面到Admin
    # admin.add_view(UserAdmin(name='用户', url='users'))
    
    
    """基于模型生成导航页面"""
    
    # # 方式一: 直接通过ModelView来注册User模型到Admin站点中,自动生成增删查改功能
    # from application import admin, db
    # from flask_admin.contrib.sqla import ModelView
    # from .models import User    # 后台站点模型类
    # admin.add_view(ModelView(User, db.session, name='用户')) # 把模型类添加到后台站点
    
    
    # 方式二: 灵活配置站点需要的信息,
    from application import admin, db
    from flask_admin.contrib.sqla import ModelView
    from .models import User    # 后台站点模型类
    
    # 自定义用户站点类(基于父类ModelView)自动生成增删查改功能
    class UserAdminModel(ModelView):
        # 显示字段列表
        column_list = ['id', 'name', 'nickname', 'age', 'sex']
    
        # # 显示排除字段列表,与column_list互斥,只能有一个
        # column_exclude_list = ['is_deleted']
    
        # 字段的文字描述
        column_labels = dict(name='账号', nickname='昵称', age='年龄', sex='性别')
    
        # 列表页可以直接编辑的字段列表
        column_editable_list = ['name', 'age', 'sex']
    
        # 默认排序字段
        column_default_sort = 'id'
    
        # 列表页允许点击排序的字段列表
        column_sortable_list = ['id', 'age']
    
        # 是否允许查看详情
        can_view_details = True
    
        # 显示直接可以搜索字段数据的列表
        column_searchable_list = ['id', 'name', 'age']
    
        # 可以进行滤器的字段列表
        column_filters = ['sex', 'age']
    
        # 单页显示数量
        page_size = 3
    
        # # 简单版本分页器[上一页< ,下一页>]
        # simple_list_pager = True
    
        # 高级版本的分页器(比上面简单的好用)
        list_pager = True
    
        # 字段值转换
        column_choices = {
            'sex':[
                (0, '女'),
                (1, '男'),
            ],
            'is_deleted':[
                (0, '未删除'),
                (0, '已删除'),
            ]
        }
    
        # # 列表页模板,默认值:'admin/model/list.html'
        # list_template = 'admin/model/custom_list.html'
    
        # 修改模型钩子[添加/更新]
        def on_model_change(self,form, model, is_created):
            print(form)   # 客户端提交的表单数据
            print(model)  # 本次操作的数据数据
            print(self.model)  # 本次操作的数据数据
            print(is_created)  # 本次操作是否属于添加操作,False表示修改
    
            # 金钱不能是负数
            if model.money < 0:
                model.money = abs( model.money )
    
            # 积分不能是负数
            if model.credit < 0:
                model.credit = abs( model.credit )
    
            return super().on_model_change(form, model, is_created)
    
        # 删除模型钩子
        def on_model_delete(self, model):
            # 删除日志的记录
            # 其他数据表是否存在外在关联
            return super().on_model_delete(model)
    
        def delete_model(self,model):
            if model.info:
                # # 1.物理删除,慎用
                # db.session.delete(model)
                # db.session.delete(model.info)
                # db.session.commit()
    
                # 2.逻辑删除[修改is_deleted为True即可]
                model.is_deleted = True
                model.info.is_deleted = True
                db.session.commit()
            return True
    
    # 把自定义模型类添加到后台站点
    admin.add_view(UserAdminModel(User, db.session, name='用户'))
    
    
    
    
    使用外部链接作为导航页

    application/apps/users/admin.py

    """使用外链作为导航页"""
    from flask_admin.menu import MenuLink
    admin.add_link(MenuLink(name='老男孩', url='http://www.oldboyedu.com', category='用户管理')) # 把超链接作为子导航加载到顶级导航中
    
    

    国际化与本地化

    flask-babelex是Flask 的翻译扩展工具,在项目安装配置,可以实现中文显示。方便我们管理admin后台站点。

    安装模块

    pip install flask-babelex -i https://pypi.douban.com/simple
    
    
    1. 模块初始化application/__init__.py,代码:
    import os
    
    from flask import Flask
    from flask_script import Manager
    from flask_sqlalchemy import SQLAlchemy
    from flask_redis import FlaskRedis
    from flask_session import Session
    from flask_jsonrpc import JSONRPC
    from faker import Faker
    from celery import Celery
    from flask_jwt_extended import JWTManager
    from flask_admin import Admin
    from flask_babelex import Babel
    
    from application.utils.config import init_config
    from application.utils.logger import Log
    from application.utils.commands import load_commands
    from application.utils.bluerprint import register_blueprint, path, include, api_rpc
    from application.utils import message, code
    from application.utils.unittest import BasicTestCase
    from application.utils.OssStore import OssStore
    
    # 终端脚本工具初始化
    manager = Manager()
    
    # SQLAlchemy初始化
    db = SQLAlchemy()
    
    # redis数据库初始化
    # - 1.默认缓存数据库对象,配置前缀为REDIS
    redis_cache = FlaskRedis(config_prefix='REDIS')
    # - 2.验证相关数据库对象,配置前缀为CHECK
    redis_check = FlaskRedis(config_prefix='CHECK')
    # - 3.验证相关数据库对象,配置前缀为SESSION
    redis_session = FlaskRedis(config_prefix='SESSION')
    
    # session储存配置初始化
    session_store = Session()
    
    # 自定义日志初始化
    logger = Log()
    
    # 初始化jsonrpc模块
    jsonrpc = JSONRPC()
    
    # 初始化随机生成数据模块faker
    faker = Faker(locale='zh-CN') # 指定中文
    
    # 初始化异步celery
    celery = Celery()
    
    # jwt认证模块初始化
    jwt = JWTManager()
    
    # 阿里云对象存储oss初始化
    oss = OssStore()
    
    # admin后台站点初始化
    admin = Admin()
    
    # 国际化和本地化的初始化
    babel = Babel()
    
    # 全局初始化
    def init_app(config_path):
        """全局初始化 - 需要传入加载开发或生产环境配置路径"""
        # 创建app应用对象
        app = Flask(__name__)
    
        # 当前项目根目录
        app.BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
        # 开发或生产环境加载配置
        init_config(app, config_path)
    
        # SQLAlchemy加载配置
        db.init_app(app)
    
        # redis加载配置
        redis_cache.init_app(app)
        redis_check.init_app(app)
        redis_session.init_app(app)
    
        """一定先加载默认配置,再传入APP加载session对象"""
        # session保存数据到redis时启用的链接对象
        app.config["SESSION_REDIS"] = redis_session
        # session存储对象加载配置
        session_store.init_app(app)
    
        # 为日志对象加载配置
        log = logger.init_app(app)
        app.log = log
    
        # json-rpc加载配置
        jsonrpc.init_app(app)
        # rpc访问路径入口(只有唯一一个访问路径入口),默认/api
        jsonrpc.service_url = app.config.get('JSON_SERVER_URL', '/api')
        jsonrpc.enable_web_browsable_api = app.config.get("ENABLE_WEB_BROWSABLE_API",False)
        app.jsonrpc = jsonrpc
    
        # 自动注册蓝图
        register_blueprint(app)
    
        # 加载celery配置
        celery.main = app.name
        celery.app = app
        # 更新配置
        celery.conf.update(app.config)
        # 自动注册任务
        celery.autodiscover_tasks(app.config.get('INSTALL_BLUEPRINT'))
    
        # jwt认证加载配置
        jwt.init_app(app)
    
        # faker作为app成员属性
        app.faker = faker
    
        # 注册模型,创建表
        with app.app_context():
            db.create_all()
    
        # 阿里云存储对象加载配置
        oss.init_app(app)
    
        # admin后台站点加载配置
        admin.name = app.config.get('FLASK_ADMIN_NAME') # 站点名称
        admin.template_mode = app.config.get('FLASK_TEMPLATE_MODE') # 使用的模板
        admin.init_app(app)
    
        # 国际化和本地化加载配置
        babel.init_app(app)
    
        # 终端脚本工具加载配置
        manager.app = app
    
        # 自动注册自定义命令
        load_commands(manager)
    
        return manager
    
    
    1. 公共配置设置语言与时区,application/settings/__init__.py,代码:
    """公共配置"""
    
    """调试模式"""
    DEBUG = True
    
    """设置加密秘钥"""
    # 设置密钥,可以通过 base64.b64encode(os.urandom(48)) 来生成一个指定长度的随机字符串
    SECRET_KEY = "RvDsY4u6GRJm4srpe2NUbpxS3R8+5yZRNTcYkx7NtzHpumOK4Wq/+f+qplfxgGld"
    
    """SQLAlchem数据库配置"""
    # 数据库链接
    SQLALCHEMY_DATABASE_URI = ''
    # 动态追踪修改设置
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    # 查询时会显示原始SQL语句
    SQLALCHEMY_ECHO = False
    
    """redis数据库配置"""
    # 默认缓存数据库 - 0号库
    REDIS_URL = 'redis://:@127.0.0.1:6379/0'
    
    """总路由"""
    URL_PATH = "application.urls"
    
    """静态文件目录存储路径"""
    STATIC_DIR = 'application/static'
    
    """国际化和本地化"""
    LANGUAGE = "zh_CN"
    TIMEZONE = "Asia/Shanghai"
    # 针对babel模块的语言和设置
    BABEL_DEFAULT_LOCALE = LANGUAGE
    BABEL_DEFAULT_TIMEZONE = TIMEZONE
    
    
    1. 运行项目, 查看后台站点, 英文就变成了中文显示
  • 相关阅读:
    指出在 spring aop 中 concern 和 cross-cutting concern 的不同之处?
    什么是 spring bean?
    Java 中,Serializable 与 Externalizable 的区别?
    spring DAO 有什么用?
    spring 支持集中 bean scope?
    Spring 应用程序有哪些不同组件?
    什么是切点JoinPoint?
    @Required 注解有什么用?
    用什么命令对一个文件的内容进行统计?(行号、单词数、 字节数) ?
    区分构造函数注入和 setter 注入?
  • 原文地址:https://www.cnblogs.com/jia-shu/p/14885094.html
Copyright © 2011-2022 走看看