参加了 Pycon China,发现还是 web 和运维区听的人最多。使用 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 之类的插件,只用来提供后端接口。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved