部署方式

部署流程

不管使用哪种托管方案,程序安装到生产服务器上之后,都要执行一系列的任务,最好的例子就是创建或更新数据库表

如果每次安装或升级程序都手动执行任务,那么容易出错也浪费时间,所以我们可以在manage.py中添加一个命令,自动执行所需操作

下例实现了一个适用于Flasky的deploy命令

# manage.py
@manager.command
def deploy():
    """Run deployment tasks"""
    from flask_migrate import upgrade
    from app.models import Role, User
    # updata
    upgrade()
    # create user_role
    Role.insert_roles()
    # all user follow that
    User.add_self_follows()

定义这些函数时考虑到了多次执行的情况,所以即使多次执行也不会产生问题,因此每次安装或省级程序时只需运行deploy命令就能完成所有操作

把生产环境中的错误写入日志

如果调试模式中运行的程序发生错误,那么会出现Werkzeug中的交互式调试器,网页中显示错误的栈跟踪,而且可以查看源码,甚至还能使用Flask的网页版交互调试器在每个栈帧的上下文中执行表达式

调试器是开发过程中进行问题调试的优秀工具,但其显然不能在生产环境中使用,生产环境中发生的错误会被静默掉,取而代之的是向用户显示一个500错误页面,不过幸好错误的栈跟踪不会完全丢失,因为Flask会将其写入日志文件

在程序启动过程中,Flask会创建一个Python提供的logging.Logger类实例,并将其附属到程序实例上,得到app.logger,在调试模式中,日志记录器会把记录写入终端,但在生产模式中,默认情况下没有配置日志的处理程序,所以如果不添加处理程序,就不会保存日志,下例的改动配置了一个日志处理程序,把生产模式中出现的错误通过电子邮件发送给FLASKY_ADMIN中设置的管理员

# config.py
class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'data.sqlite')     
    @classmethod
    def init_app(cls, app):
        Config.init_app(app)

        # send errorinformation to administrator
        import logging
        from logging_handlers import SMTPHandler
        credentials = None
        secure = None
        if gerattr(cls, 'MAIL_USERNAME', None) is not None:
            credentials = (cls.MAIL_USERNAME, cls.MAIL_PASSWORD)
            if getattr(cls, 'MAIL_USE_TLS', None):
                secure = ()
            mail_handler = SMTPHandler(
                mailhost = (cls.MAIL_SERVER, cls.MAIL_PORT),
                fromaddr = cls.FLASKY_MAIL_SENDER,
                toaddrs = [cls.FLASKY_ADMIN],
                subject = cls.FLASKY_MAIL_SUBJECT_PREFIX + 'Application Error',
                credentials = credentials,
                secure = secure)
            mail_handler.setLevel(logging.ERROR)
            app.logger.addHandler(mail_handler)

所有配置实例都有一个init_app()静态方法,在create_app()方法中调用,在ProductionConfig类和init_app()方法的实现中,配置程序的日志记录器把错误写入电子邮件日志记录器

电子邮件日志记录器的日志等级被设为logging.ERROR, 所以只有发生严重错误时才会发送电子邮件,通过添加适当的日志处理程序,可以把较轻缓等级的日志消息写入文件、系统日志或其他的支持方式,这些日志消息的处理方法很大程度上依赖于程序使用的托管平台

云部署

程序托管的最新潮流是托管到云端,云技术以前称为平台即服务(Platform as a Server, PaaS),它让程序开发者从安装和维护运行程序的软硬件平台的日常工作中解放出来,在PaaS模型中,服务提供商完全接管了运行程序的平台,程序开发者使用服务商提供的工具和库把程序集成到平台上,然后将其上传到提供商维护的服务器中,部署的过程往往只需几秒钟,大多数PaaS提供商都可以通过按需添加或删除服务器以实现程序的动态拓展,从而满足不同请求量的需求

云部署有较高的灵活性,而且使用起来相对容易,这些优势都是花钱买来的,Heroku是最流行的PaaS提供商之一,对Python支持良好

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值