Write code that writes code. Code generators increase your productivity and help avoid duplication.
天下武功,唯快不破每当我们启动一个新项目的时候,总有很多重复性工作,创建后端app模板就是其中之一。如果是使用django还好,django提供了生成项目app的命令直接创建,不过貌似现在很多pythoner都倾向于用flask这种微框架。虽然很多成功的项目是基于django(Instagram,Disqus,Pinterest等)构建,不过笔者还是更喜欢flask这种微框架。flask的好处在于你可以随意替换插件(ORM,模板等),相比django更加灵活。缺点就是有时候会选择困难,不知道如何组织大型项目,而且需要学习各种flask的插件,实际上把flask一套插件都整明白也需要一定的学习成本。今天笔者介绍的这个 Cookiecutter 项目就是专门用来解决项目模板生成问题的,经过了python3.5.2生产环境的检验。
使用cookiecutter-flask生成模板使用很简单(需要具备基本的flask框架知识), cookiecutter-flask 项目地址:
$ pip install cookiecutter $ cookiecutter https://github.com/sloria/cookiecutter-flask.git执行完以后按照提示填写app名称(注意app名称符合python包名规范)就可以生成了,非常方便。后边注意了,有新手在github的issue里提出没有一个新手指引,实际上生成到README里了。
=============================== flaskapp =============================== Test flask-cookiecutter Quickstart ---------- First, set your app's secret key as an environment variable. For example, add the following to ``.bashrc`` or ``.bash_profile``. .. code-block:: bash export APP_SECRET='something-really-secret' Before running shell commands, set the ``FLASK_APP`` and ``FLASK_DEBUG`` environment variables :: export FLASK_APP=/path/to/autoapp.py export FLASK_DEBUG=1 Then run the following commands to bootstrap your environment :: git clone https://github.com/PegasusWang/app cd app pip install -r requirements/dev.txt bower install flask run You will see a pretty welcome screen. Once you have installed your DBMS, run the following to create your app's database tables and perform the initial migration :: flask db init flask db migrate flask db upgrade flask run Deployment ---------- In your production environment, make sure the ``FLASK_DEBUG`` environment variable is unset or is set to ``0``, so that ``ProdConfig`` is used. Shell ----- To open the interactive shell, run :: flask shell By default, you will have access to the flask ``app``. Running Tests ------------- To run all tests, run :: flask test Migrations ---------- Whenever a database migration needs to be made. Run the following commands :: flask db migrate This will generate a new migration script. Then run :: flask db upgrade To apply the migration. For a full migration command reference, run ``flask db --help``.按照步骤执行一次就能看到效果了。你只需要新建自己的蓝图,开始填写自己的业务就行了。
添加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生成后自己按需修改,感兴趣的可以试试。
Refcookiecutter-flask
cookiecutter