1. 创建扩展包目录,结构如下:
flask-logging/
├ LICENSE # 授权说明
├ README # 项目介绍
├ setup.py # 打包分发文件
└ flask_logging/ # 扩展代码包
└ __init__.py # 扩展代码
注意:根据Flask扩展命名规范,约束如下:
- 扩展的代码必须放在名为”flask_logging/flask_logging”目录下,单词都小写。
- “LICENSE”和“README”文件都是审核必须的。
2. 编写“setup.py”文件
"""
Flask-Logging
-------------
For the view access and the expansion of the log
"""
from setuptools import setup
setup(
name='Flask-Logging',
version='1.0',
url='http://example.com/flask-logging/',
license='BSD',
author='Huo',
author_email='240516816@qq.com',
description='For the view access and the expansion of the log',
long_description=__doc__,
packages=['flask_logging'],
zip_safe=False,
include_package_data=True,
platforms='any',
install_requires=[
'Flask'
],
classifiers=[
'Environment :: Web Environment',
'Intended Audience :: Developers',
'License :: OSI Approved :: BSD License',
'Operating System :: OS Independent',
'Programming Language :: Python',
'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
'Topic :: Software Development :: Libraries :: Python Modules'
]
)
注意:
- 扩展包名称为:Flask-Logging(格式要求以”Flask-“为前缀,后面的单词首字母大写)。
- 必须指定url链接到扩展主页或文档。
- “zip_safe”必须为False。
- “install_requires”必须列出所有依赖的库。
- 其他可默认。
3. 编写扩展代码,__init__.py
#coding:utf8
from flask import current_app, request
from functools import wraps
from logging.handlers import TimedRotatingFileHandler
import logging
import time
# 指定日志文件名,日志级别,及日志记录格式
my_log = TimedRotatingFileHandler('my_log.log','D')
my_log.setLevel(logging.DEBUG)
my_log.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s'))
class Logging:
# 构造函数
def __init__(self, app=None):
self.app = app
if app is not None:
self.init_app(app)
# 初始化应用
def init_app(self, app):
app.logger.addHandler(my_log)
# 视图装饰器,被装饰的视图将自动记录访问日志
def print_log(self, func):
app = self.app or current_app
@wraps(func)
def decorator(*args, **kwargs):
start = time.time()
# 记录请求开始
app.logger.debug('Start request call: %s' % request.url)
ret = func(*args, **kwargs)
# 记录请求结束
app.logger.debug('Finish request call: %s' % request.url)
duration = time.time() - start
# 记录请求所耗时长
app.logger.debug('Request: %s consumed %f s' % (request.url, duration))
return ret
return decorator
注意:
- 构造函数”init()”和初始化函数”init_app()”是必须的。
4. 创建应用,测试扩展包
from flask import Flask
from flask_logging import Logging
app = Flask(__name__)
logging = Logging(app)
@app.route('/')
@logging.print_log
def index():
return '<h1>Hello World</h1>'
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
启动应用,访问“http://localhost:5000/”,即可看到代码的当前路径下新生成的“my_log.log”文件。
6. 扩展包提交及审核
如果想提交自己的扩展包到官网,则至少需满足以下审核条件:
扩展代码在包”flask_myext”下,审核通过后,Flask会设置一个重定向包”flask.ext.myext”来指向你的包。对于用户来说,官方扩展建议导入”flask.ext.myext”格式的包
必须提供一个”setup.py”分发文件,并在PyPI上注册,这样用户就可以通过”pip install”来安装你的扩展
必须提供”LICENSE”文件,并且授权是BSD, MIT或WTFPL
必须提供”README”文件及文档,文档是由Sphinx生成
必须同时提交单元测试代码
必须支持Python 2.6和2.7版本
更多要求请参考官方文档
本文参考:思诚之道
更多参考:
Flask扩展官方英文文档
Flask扩展官方中文文档
官方扩展列表中已有扩展