python flask Blueprint搭建

随着功能的添加,路由越来越多,view层的拆分变成了刚需
蓝图的杀手锏是将你的应用组织成不同的组件,比如把这里的admin,main,course等相关的视图方法分为组件。这时我们可以
创建三个蓝图实现这两个独立的组件。static文件存放的是静态文件,templates是模板。
目录结构


Blueprint
首先是我们项目的配置文件(config.py)
# -*- coding: utf-8 -*-
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]'
    FLASKY_MAIL_SENDER = 'Flasky Admin <flasky@example.com>'
    FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
    @staticmethod
    def init_app(app):
        pass
 
# 开发环境的配置
class DevelopmentConfig(Config):
    DEBUG = True
    MAIL_SERVER = 'smtp.googlemail.com'
    MAIL_PORT = 587
    MAIL_USE_TLS = True
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
    SQLALCHEMY_DATABASE_URI = "mysql://root:123456@localhost/flasktestdb"
    RECAPTCHA_PUBLIC_KEY = '6LeYIbsSAAAAACRPIllxA7wvXjIE411PfdB2gt2J'
    RECAPTCHA_PRIVATE_KEY = '6LeYIbsSAAAAAJezaIq3Ft_hSTo0YtyeFG-JgRtu'
 
# 测试环境的配置
class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = "mysql://root:123456@localhost/flasktestdb"
    RECAPTCHA_PUBLIC_KEY = '6LeYIbsSAAAAACRPIllxA7wvXjIE411PfdB2gt2J'
    RECAPTCHA_PRIVATE_KEY = '6LeYIbsSAAAAAJezaIq3Ft_hSTo0YtyeFG-JgRtu'
 
 
# 生产环境的配置
class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = "mysql://root:123456@localhost/flasktestdb"
 
 
    RECAPTCHA_PUBLIC_KEY = '6LeYIbsSAAAAACRPIllxA7wvXjIE411PfdB2gt2J'
    RECAPTCHA_PRIVATE_KEY = '6LeYIbsSAAAAAJezaIq3Ft_hSTo0YtyeFG-JgRtu'
 
 
config = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}
app应用(app/__init__.py)

# -*- coding: utf-8 -*-
from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_sqlalchemy import SQLAlchemy
from config import config
from flask_login import LoginManager
 
bootstrap = Bootstrap()
mail = Mail()
db = SQLAlchemy()
login_manager = LoginManager()
# None basic strong
login_manager.session_protection = "strong"
login_manager.login_view = "main.login"
login_manager.login_message = u'请先登录'
app = Flask(__name__, static_url_path='')
 
# jquery.tmpl 和 jinja2 模板语法冲突 修改 jinja2的模板语法
app.jinja_env.variable_start_string = '{{ '
app.jinja_env.variable_end_string = ' }}'
 
def create_app(config_name):
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    bootstrap.init_app(app)
    mail.init_app(app)
    db.init_app(app)
    login_manager.init_app(app)
    
    # 项目启动时自动创建数据库
    with app.test_request_context():
        from .models import User,Document,Video
        db.create_all()
 
 
    # 注册main组件的蓝图
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)
    
    # 注册admin组件的蓝图
    from .admin import admin as admin_blueprint
    app.register_blueprint(admin_blueprint)
    
    # 注册course组件的蓝图
    from .course import course as course_blueprint
    app.register_blueprint(course_blueprint)
 
    return app
app中的models.py 文件是数据库模型,emails.py 是发邮件
运行文件(manager.py)
# -*- coding: utf-8 -*-
import os
from app import create_app, db
from flask_script import Manager,Server
 
app = create_app(os.getenv('FLASK_CONFIG') or 'default')
 
manager = Manager(app)
#开启多线程
manager.add_command("runserver", Server(threaded=True))
 
if __name__ == '__main__':
    manager.run()
admin组件(admin/__init__.py)
# -*- coding: utf-8 -*-
from flask import Blueprint
#创建蓝图admin
admin = Blueprint('admin', __name__)
#从当前文件夹导入views和errors文件,定义的视图/路由就会加载。
from . import views,errors
main和course包中的__init__.py文件是一样的创建,注意要把名字改一下。

每个蓝图的错误页面是一样的(errors.py)
# -*- coding: utf-8 -*-
from flask import render_template
from . import admin
 
@admin.app_errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404
 
@admin.app_errorhandler(500)
def internal_server_error(e):
    return render_template('500.html'), 500
在错误页面里面只定义了404和500的错误

flask 蓝图框架已经搭建完成,剩下的只需要完成各个模块的功能路由即可。
--------------------- 
作者:凡夫俗子66 
来源:CSDN 
原文:https://blog.csdn.net/m0_38061194/article/details/79310437 
版权声明:本文为博主原创文章,转载请附上博文链接!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第6章 服务模式 Service Interface(服务接口)

Service Interface&#xff08;服务接口&#xff09;上下文您正在设计企业应用程序&#xff0c;并且需要能够通过网络使用其部分功能。此功能需要能够被各类系统使用&#xff0c;因此互操作性是设计的重要方面。除互操作性之外&#xff0c;可能还需要支持不同的通信协议&#x…

dialog像父activity传递参数

启动新activity有两种方式&#xff1a; startActivityForResult(Intent, int); startActivity(Intent, Bundle); 新开启的dialog像父activity传递参数用第一种方法。 startActivityForResult(Intent, int) intent&#xff1a;要传递的值 int&#xff1a;给新开启的dialog打标签…

linux目录规范及简单说明

Linux系统目录结构以及简单说明 linux目录图&#xff1a; / root --- 启动Linux时使用的一些核心文件。如操作系统内核、引导程序Grub等。home --- 存储普通用户的个人文件 ftp --- 用户所有服务httpdsambauser1user2 bin --- 系统启动时需要的执行文件&#xff08;二进制&…

Flask中的session操作

https://www.cnblogs.com/notzy/p/9187304.html 一、配置SECRET_KEY 因为flask的session是通过加密之后放到了cookie中。所以有加密就有密钥用于解密&#xff0c;所以&#xff0c;只要用到了flask的session模块就一定要配置“SECRET_KEY”这个全局宏。一般设置为24位的字符。…

逆向Android软件的步骤

2019独角兽企业重金招聘Python工程师标准>>> 逆向Android软件的步骤&#xff1a; 首先使用反编译的工具对反编译&#xff0c;然后阅读反汇编代码&#xff0c;如果有必要还会对其进行动态调试&#xff0c;找到突破口后注入或直接修改反汇编代码&#xff0c;最后重新编…

CRT 重启Was

输入用户名、密码登陆以后 # ps -eaf | grep websphere 找到路径 /usr/IBM/WebSphere/AppServer/ 进入/usr/IBM/WebSphere/AppServer/bin 运行 stopServer.sh server1 其中server1为服务器实例名 需要输入登陆was控制台的用户名、密码 运行 startServer.sh server1 即完成服务器…

JAVA中跨平台分隔符

在Windows下的路径分隔符和Linux下的路径分隔符是不一样的&#xff0c;当直接使用绝对路径时&#xff0c;跨平台会暴出“No such file or diretory”的异常。 比如说要在temp目录下建立一个test.txt文件&#xff0c;在Windows下应该这么写&#xff1a;File file1 new File (&q…

Flask Sessions会话

与Cookie不同&#xff0c;会话数据存储在服务器上。会话是客户端登录到服务器并注销的时间间隔。需要在此会话中进行的数据存储在服务器上的临时目录中。 与每个客户端的会话分配一个会话ID。会话数据存储在cookie顶部&#xff0c;服务器以加密方式签名。对于这种加密&#xf…

linux rsync 远程同步

rsync(Remote Sync) 是一个Unix/linux系统下的文件同步和传输工具。Rsync通过“rsync算法”提供了一个客户机和远程文件服务器的文件同步的快速方法。工作机制&#xff1a; 在远程同步任务中&#xff0c;负责发起rsync同步操作的客户机称为发起端&#xff0c;而负责响应来自客…

GUI 快捷键的实现思路

思路: 前提快捷键操作不可重复,即一个快捷键对应一个控件的动作一个窗体保持一份快捷键的map映射在相应的消息中获取快捷键列表如键盘消息在控件类对象中定义一个默认的响应行为,比如Button按了Enter键当子控件隐藏,父控件关系发生变化时则重新设置快捷键转载于:https://www.cn…

hadoop中unhealthynodes的问题解决

在yarn-site.xml中加入如下配置 <property> <name>yarn.nodemanager.disk-health-checker.min-healthy-disks</name> <value>0.0</value> </property> <property><name>yarn.nodemanager.disk-health-checker.max-d…

javascript权威指南——笔记(第十章:正则)

正则表达式是描述字符模式的对象 为什么使用正则&#xff1a; 1.找数字 1 var str "12 f13kjm54n43 43k";2 var arr [];3 4 for(var i 0, len str.length; i<len; i){5 6 var char str.charAt(i);7 8 if(char > "0"…

解決 centos -bash: vim: command not found

i. 那么如何安裝 vim 呢? 输入rpm -qa|grep vim 命令, 如果 vim 已经正确安裝,会返回下面的三行代码: rootserver1 [~]# rpm -qa|grep vim vim-enhanced-7.0.109-7.el5 vim-minimal-7.0.109-7.el5 vim-common-7.0.109-7.el5 如果少了其中的某一条,比如 vim-enhanced 的,就…

mysql日期和时间类型

mysql日期和时间类型 mysql有5种表示时间值的日期和时间类型&#xff0c;分别为、DATE&#xff0c;TIME&#xff0c;YEAR&#xff0c;DATETIME&#xff0c;TIMESTAMP。 TIMESTAMP类型有专有的自动更新特性&#xff0c; TIMESTAMP类型有专有的自动更新特性&#xff0c; TIME…

Python程序每日一练习

问题一&#xff1a;做为Apple Store App独立开发者&#xff0c;你要搞限时促销&#xff0c;为你的应用生成激活码&#xff08;或者优惠券&#xff09;&#xff0c;使用Python如何生成200个激活码&#xff08;或者优惠券&#xff09;&#xff1f; 简介&#xff1a;通用唯一识别码…

C/C++查找一定范围内的素数(筛法)

本文转自于&#xff1a;http://dalu.blogbus.com/logs/37977984.html 由于一个合数总是可以分解成若干个质数的乘积&#xff0c;那么如果把质数&#xff08;最初只知道2是质数&#xff09;的倍数都去掉&#xff0c;那么剩下的就是质数了。例如要查找100以内的质数&#xff0c;首…

mysql中char,varchar与text类型的区别和选用

关于char&#xff0c;varchar与text平时没有太在意&#xff0c;一般来说&#xff0c;可能现在大家都是用varchar。但是当要存储的内容比较大时&#xff0c;究竟是选择varchar还是text呢&#xff1f;不知道。。。。。。 text 、 char、varchar 是数据在数据库中的存放策略问题…

循环Map方法

public static void main(String[] args) { Map<String, String> map new HashMap<String, String>(); map.put("1", "张三"); map.put("2", "李四"); map.put("3", "王五"); /*方法一 &#xff1a;…

rsync备份学习

备份内容&#xff1a;把虚拟机A&#xff08;192.168.91.243&#xff09;需要把文件备份到虚拟机B&#xff08;192.168.91.207&#xff09; 一、检查两台虚拟机是否已经安装rsync rsync -version命令检查 二、如果没有安装rsync&#xff0c;需要先安装rsync 在客户端和服务器…

四大组件的工作过程

1、四大组件的运行状态 Android的四大组件中除了BroadcastReceiver以外&#xff0c;其他三种组件都必须在AndroidManifest中注册&#xff0c;对于BroadcastReceiver来说&#xff0c;既可以在AndroidManifest中注册也可以通过代码来…