Python cookiecutter-flask,如何在几分钟内启动一个像模像样的网站[视频]

512 阅读3分钟
原文链接: zhuanlan.zhihu.com
Write code that writes code. Code generators increase your productivity and help avoid duplication.

昨天去参加了 Pycon China,发现还是 web 和运维区听的人最多。使用 Python 的一个好处是可以用来快速构建原型,今天我们看看如何快速启动一个网站。
这次的视频里我会介绍一个 flask 网站模板的快速生成工具,帮助大家快速启动网站。

快速启动 python flask 项目

天下武功,唯快不破

每当我们启动一个新项目的时候,总有很多重复性工作,创建后端app模板就是其中之一。如果是使用django还好,django提供了生成项目app的命令直接创建,不过貌似现在很多pythoner都倾向于用flask这种微框架。flask的好处在于你可以随意替换插件(ORM,模板等),相比django更加灵活。缺点就是有时候会选择困难,不知道如何组织大型项目,而且需要学习各种flask的插件,实际上把flask一套插件都整明白也需要一定的学习成本。今天笔者介绍的这个Cookiecutter项目就是专门用来解决项目模板生成问题的。

使用cookiecutter-flask生成模板

使用很简单(需要具备基本的flask框架知识),cookiecutter-flask项目地址:

$ pip install cookiecutter
$ cookiecutter https://github.com/sloria/cookiecutter-flask.git

执行完以后按照提示填写app名称(注意app名称符合python包名规范)就可以生成了,非常方便。后边注意了,有新手在github的issue里提出没有一个新手指引,实际上生成到README里了。

添加flask_restful, redis,sentry,flask_admin等支持

项目自动生成的模板里头已经引入了很多插件了,不过还有几个比较常用的插件,比如redis支持,sentry支持(sentry记录异常信息非常好用),flask_admin(类似django的后台管理)等。最后笔者的extensions.py如下:

# -*- coding: utf-8 -*-
"""Extensions module. Each extension is initialized in the app factory located
in app.py."""

import os
import types

from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
from flask_babel import Babel
from flask_bcrypt import Bcrypt
from flask_caching import Cache
from flask_debugtoolbar import DebugToolbarExtension
from flask_login import LoginManager
from flask_mail import Mail
from flask_migrate import Migrate
from flask_redis import FlaskRedis
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
from flask_wtf.csrf import CsrfProtect
from mockredis import MockRedis
from raven.contrib.flask import Sentry


bcrypt = Bcrypt()
csrf_protect = CsrfProtect()
login_manager = LoginManager()
db = SQLAlchemy()
migrate = Migrate()
cache = Cache()
debug_toolbar = DebugToolbarExtension()
api = Api(decorators=[csrf_protect.exempt])
mail = Mail()
babel = Babel()    # 用babel处理时区转换问题
admin = Admin()
sentry = Sentry()    # settings里配置Setnry服务器地址


def api_route(self, *args, **kwargs):
    """ 给flask api加上route功能,避免直接调用api.add_resource函数了.
    具体请参考crm_backend.employee.api里的使用
    http://flask.pocoo.org/snippets/129/
    """
    def wrapper(cls):
        self.add_resource(cls, *args, **kwargs)
        return cls
    return wrapper


api.route = types.MethodType(api_route, api)


class MockRedisWrapper(MockRedis):
    """A wrapper to add the `from_url` classmethod
    https://github.com/underyx/flask-redis
    """
    @classmethod
    def from_url(cls, *args, **kwargs):
        return cls(decode_responses=True)


if os.environ.get('USE_CONFIG') == 'prod':
    redis_store = FlaskRedis(decode_responses=True)
else:
    redis_store = FlaskRedis.from_custom_provider(MockRedisWrapper)

当然也可以按照你自己的需求自己增删功能,最近的flask版本在DEBUG模式下支持自动检测重启,开发起来还是非常爽快的,笔者最近的几个后端项目都是用cookiecutter-flask生成后自己按需修改,感兴趣的可以试试。

如果是前后端分离的项目也可以引入 flask-restful 之类的插件,只用来提供后端接口。