Flask 自建扩展
- 自建扩展介绍- Flask扩展分两类
- 纯功能, 如: Flask-Login 提供用户认证
- 对已有的库和工具包装(简化继承操作,并提供有用的功能,更方便)
 如: Flask-SQLAlchemy 包装了 SQLAlchemy
 
- 涉及的 python 包
- setuptools:
- wheel:
- twine: 发布- python包 (发布到- PyPI后才能使用- pip或- pipenv安装)
- readme_renderer: 将- md、- rst、- txt文本 渲染成- .html
 
- 命名:
- 扩展的名称: Flask-<功能/第三方库名> 或 <功能/第三方库名>-Flask
- 扩展的包名: flask_<功能/第三方库名> (小写加下划线)
 
 
- Flask扩展分两类
- 扩展类实现- 编写扩展类(以 Flask-Share 为例)
- 使用扩展步骤: 导入扩展类 - 实例化 - 传入 app 初始化
from flask_share import Share
 share = Share() # extensions.py 中统一实例化所有扩展
 share.init_app(app) # 在工厂函数中统一初始化所有扩展
 # 也可以一步到位
 # share = share(app)
 
- 新建扩展类 (flask_share/__init__.py)class Share(object):
 def __inti__(self, app=None):
 self.init_app(app) def init_app(self, app):
 # 兼容 0.7 以前版本
 if not hasattr(app, 'extensions'):
 app.extensions={} # 在 app 应用中存储所有扩展实例, 可验证扩展是否完成实例化
 app.extensions['share'] = self # 扩展类添加到模板上下文中
 app.jinja_env.globals['share'] = self
 # app.context_processor(lambda:{'share': self}) # 扩展配置, 初始化后添加到 app.config 中, 以 SHARE_ 开头避免冲突
 app.config.setdefault('SHARE_SITES', 'weibo,wechat,douban,facebook,twitter,google,linkedin,qq,qzone')
 app.config.setdefault('SHARE_MOBILESITES','weibo,douban,qq,qzone')
 app.config.setdefault('SHARE_HIDE_ON_MOBILE', False)
 app.config.setdefault('SHARE_SERVER_LOCAL', False) # 是否使用内置资源
 
 
- 使用扩展步骤: 导入扩展类 - 实例化 - 传入 app 初始化
- 实现扩展功能
- 加载静态资源
class Share(object):
 @staticmethod
 def load(css_url=None, js_url=None): if current_app.config('SHARE_SERVE_LOCAL'):# 使用本地进入条件
 css_url = url_for('share.static', filename='css/share.min.css')
 js_url = url_for('share.static', filename='js/share.min.js') if css_url is None:
 css_url = 'https://cdn.bootcss.com/social.share.js/1.0.16/css/share.min.css'
 if js_url is None:
 js_url = 'https://cdn.bootcss.com/social-share.js/1.0.16/js/social-share.min.js'
 return Markup('''<link rel="stylesheet" href="%s">\n
 <script src="%s"></script>'''% (css_url, js_url)) def init_app(self, app):
 # app.static_url_path 的引用是为了和用户设置一致
 blueprint = Blueprint('share', __name__, static_folder='static',
 static_url_path='/share'+ app.static_url_path)
 app.register_blueprint(blueprint)
- 创建前端分享组件
class Share(object):
 @staticmethod
 def create( title='', sites=None, mobile_sites=None,align='left',addtion_class=''):
 if sites is None:
 sites = current_app.config['SHARE_SITES']
 if mobile_sites is None:
 mobile_sites = current_app.config['SHARE_MOBILE_SITES'] return Markup('''
 <div class="social-share %s" data-sites="%s" data-mobile-site="%s"align="%s">
 %s</div>'''%(addition_class, sites, mobile_sites,align, title ))
- 在模板中使用
{{ share.create('分享到:') }}
 
 
- 加载静态资源
 
- 编写扩展类(以 Flask-Share 为例)
- 开源发布准备- 添加文档字符串与注释后的完整代码
 - """
 Flask-Share
 # ~~~~~~~~~~~~~~
 Create social share component in Jinja2 tempalte based on share.js.
 :copyright: (c) 2017 by Gavin Li.
 :license: MIT, see LICENSE for more details.
 """ import re
 from flask import current_app, url_for, Markup, Blueprint, request class Share(object): @staticmethod
 def load(css_url=None, js_url=None):
 """ Load share.js resourse. :param css_url: if set, will be used as css url
 :param js_url: if set, will be used as js url
 :param serve_local: if set to True, the local resource will be used
 """ @staticmethod
 def create( title='', sites=None, mobile_sites=None,align='left',addtion_class=''):
 """ Create a share component. :param title: the prompt displayed on the left of the share component.
 :param sites: a string that consist of sites, separate by comma.
 :param mobile_sites: a string that consist of sites, separate by comma.
 supported site name: weibo, wechat, douban, facebook, twitter, google, linkedin, qq, qzone."
 for example: weibo,wechat, qq.
 :param mobile_sites: the sites displayed on mobile.
 :param align: the align of the share component,default to '`left`'.
 :param addition_class: the style class added to the share component.
 """
- 编写 README 与文档
 - 小项目 直接用 README概括所有的必需的说明
- 大项目 比较复杂的,多文件组织文档内容
 将项目部署到 Read the Docs上
 Sphinx + Github + Readthedocs的工作流编写和部署文档
 
- 定义 python 包的元数据:(setup.py)
 - """
 Flask-Share Create social share component in Jinja2 template based on share.js.
 :copyright: (c) 2022 by Gavin li.
 :license: MIT, see LICENSE for more details.
 """
 form os import path
 from codecs import open
 form setuptools import setup basedir = path.abspath(path.dirname(__file__)) # Get the long description from the README file
 with open(path.join(basedir,'README.md'), encoding='utf-8') as f:
 long_description = f.read() setup(
 name='Flask-Share', # 包名称
 version='0.1.0', # 版本
 url='https://github.com/lghpython/flask-share',
 license='MIT',
 author='xxx'
 author_email='xx@xx.com',
 description='xxx',
 long_description=long_description,
 long_description_content_type='text/markdown', # 默认渲染格式为 rst
 platforms='any',
 packages=['flask_share'], # 包含的包列表,包括子包,可用find_pakages()
 zip_safe=False,
 test_suite='test_flask_share', 测试包或模块
 include_package_data=True,
 install_requires=['Flask'], # 安装依赖
 keywords='flask extension development', # 项目关键词
 classifiers=[ # 分类词, 在 PyPI 中设置分类
 'DevelopmentStatus::3-Alpha',
 'Environment::WebEnvironment',
 'IntendedAudience::Developers',
 'License::OSIApproved::MITLicense',
 'ProgrammingLanguage::Python',
 'ProgrammingLanguage::Python::2',
 'ProgrammingLanguage::Python::2.7',
 'ProgrammingLanguage::Python::3',
 'ProgrammingLanguage::Python::3.3',
 'ProgrammingLanguage::Python::3.4',
 'ProgrammingLanguage::Python::3.5',
 'ProgrammingLanguage::Python::3.6',
 'Topic::Internet::WWW/HTTP::DynamicContent',
 'Topic::SoftwareDevelopment::Libraries::PythonModules']
 ],
 )
 
- 定义 python 包的元数据:(
- 指定打包其他文件: MANIFEST.in
 需要在 setup()方法中设置: include_package_data=True
 - graft flask_share/static
 include LICENSE test_flask_share.py
 # exclude 用来排除匹配文件
 # recursive-include 递归匹配
 # recursive-exclude 递归排除匹配
 # graft 目录 包含目录下所有
 # prune 目录 配出目录下所有
 
- 指定打包其他文件: MANIFEST.in
- 编写单元测试
 - import unittest from flask import Flask, render_template_string, current_app
 from flask_share import Share class ShareTestCase(unittest.TestCase): def setUp(self):
 self.mobile_agent={{'HTTP_USER_AGENT':'Mozilla/5.0(iPhone;CPUiPhoneOS9_1likeMacOSX)\
 AppleWebKit/601.1.46(KHTML,likeGecko)Version/9.0Mobile/13B143Safari/601.1'}}
 app = Flask(__name__)
 app.testing=True
 self.share=Share(app) @app.route('/')
 def index():
 return render_template_string('{{share.load() }}\n {{share.create() }}')
 # 推送上下文
 self.context=app.app_context()
 self.context.push()
 self.client - app.test_client() def tearDown(self):
 self.context.pop() def test_create_on_mobile(self):
 current_app.config['SHARE_HIDE_ON_MOBILE'] = True
 response = self.client.get('/', environ_base=self.mobile_agent)
 data = response.get_data(as_text=True)
 self.assertIn('social-share.min.js', data)
 self.assertNotIn('<div class="socail-share"', data))
- setup.cfg
 
 
- 发布到 PyPI- 创建 PyPI 账号
- 注册访问
- 方便访问: 创建 .pypirc文件, 放置$HOME/.pypirc(win) 或~/.pypir(mac linux) 明文密码限制访问权限
[distutils]
 index-servers=
 pypi [pypi]
 username: 用户名
 password: 密码
 
 
- setuptools打包- 创建 Source Distributions 包
python setup.py sdist
 
- 创建 Wheel 包
python setup.py bdist_wheel
 
- 合并命令
python setup.py sdist bdist_wheel
 
 
- 创建 Source Distributions 包
- twine 上传
- 安装 twine
pipenv install twine --dev
 
- 上传
twine upload dist/*
 
 
- 安装 twine
 
- 创建 PyPI 账号
- 编写良好的扩展- 命名规范(Flask-Foo 或 Foo-Flask)
- 使用相对宽松的开源许可证(MIT/BSD)
- 支持工厂模式(添加 initi_app() 方法)
- 支持同时运行多程序实例( 使用 current_app 获取程序实例)
- 包含 setup.py脚本,并列出所有安装依赖(必需)
- 包含单元测试
- 编写文档并在线发布
- 上传到 PyPI
 
Flask 自建扩展的更多相关文章
- Flask 的 请求扩展 与 中间件
		Flask 的 请求扩展 与 中间件 flask 可以通过 扩展(装饰器)来实现类似于django 中间件的功能 类似于django 的中间件, 在执行视图函数之前, 之后的执行某些功能 1 @app ... 
- Python flask 构建可扩展的restful apl☝☝☝
		Python flask 构建可扩展的restful apl☝☝☝ Flask-RESTful是flask的扩展,增加了对快速构建REST API的支持.Flask-RESTful通过最少的设置鼓励最 ... 
- Python flask 构建可扩展的restful apl✍✍✍
		Python flask 构建可扩展的restful apl 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ... 
- flask 利用flask_wtf扩展 创建web表单
		在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能 创建语句格式: startTime = DateTimeField('计划开 ... 
- Flask之邮件扩展
		4.4 Flask—Mail 在开发过程中,很多应用程序都需要通过邮件提醒用户,Flask的扩展包Flask-Mail通过包装了Python内置的smtplib包,可以用在Flask程序中发送邮件. ... 
- flask 之(四) --- 扩展|缓存|会话
		扩展 蓝图内置扩展 (实现的是路由的拆分) '''----------- app.py -------------''' from flask import Flask from users_view ... 
- Python flask 构建可扩展的restful ap
		Flask-RESTful是flask的扩展,增加了对快速构建REST API的支持. Flask-RESTful通过最少的设置鼓励最佳的实践. pip install flask-restfulFl ... 
- Flask的请求扩展
		from flask import Flask,request app = Flask(__name__) 一.请求前 before_request 用法 @app.before_request de ... 
- Chrome 33+ 自建 扩展 实现 custom.css
		http://bbs.kafan.cn/thread-1674386-1-2.html 
随机推荐
- ApacheCN jQuery 译文集 20211121 更新
			创建 jQueryMobile 移动应用 零.序言 一.jQueryMobile 原型制作 二.jQuery Mobile 网站 三.分析.长表单和前端验证 四.QR 码.地理位置.谷歌地图 API ... 
- CF Round #669 Div2
			A 可以发现不论往怎样一个串往后加上两个 \(0\) 或两个 \(1\) 其奇数位和偶数位上的差值都是相同的.因此我们两位两位考虑这个 \(01\) 串,对于相邻两位相同那么直接留下,否则留下 \(0 ... 
- Java中HttpURLConnection使用详解、总结。
			感谢大佬:https://blog.csdn.net/qq_40036754/article/details/102554755 文章目录 一.前言 二.HttpURLConnection 介绍 三. ... 
- Android 如何让EditText不自动获取焦点&隐藏软键盘
			感谢大佬:https://blog.csdn.net/a18615971648/article/details/72869345 有时候的项目当中进入某个页面edittext会自动获取焦点弹出软键盘, ... 
- 企业级Docker容器镜像仓库Harbor的搭建
			Harbor简述 Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理 ... 
- docker基础——5.Dockerfile
			把应用部署在容器中,改变了用文本文件保存配置信息的方式.而通过传环境变量配置. Dockerfile是一个文本文件,包括容器的指令.按顺序从上到下执行,第一行非注释指令必须是FROM指定基础镜像. D ... 
- JS实现判断点是否在多边形范围内
			一.说明 在GIS领域,判断点是否在多边形范围内是一个基础方法,这里主要说下实现原理. 原理比较简单,就是有一个GIS理论,一个点向一个方向发送射线,射线与多边形各个边相交的交点如果是奇数说明点在多边 ... 
- webhook触发jenkins进行sonar检测
			目的 jenkins仅需创建一个job,git推送后自动进行sonar代码检测并上传到sonarqube jenkins插件 已按社区推荐安装基本插件 Generic Webhook Trigger ... 
- uni-app、Vue3 + ucharts 图表 H5 无法渲染
			文章已收录到 github,欢迎 Watch 和 Star. 简介 从问题定位开始,到给框架(uni-app)提 issue.出解决方案(PR),再到最后的思考,详细记录了整个过程. 前序 当你在业务 ... 
- opencv笔记--Active contours
			Active Contours 也称作 Snake,通过定义封闭区域曲线的能量函数,并使其最小化得到最终曲线. Active Contours 被用作物体边界精确定位上,opencv 给出了一个实现, ... 
