<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Flask 自建擴展

      • 自建擴展介紹

        • Flask擴展分兩類
          1. 純功能, 如: Flask-Login 提供用戶認證
          2. 對已有的庫和工具包裝(簡化繼承操作,并提供有用的功能,更方便)
            如: Flask-SQLAlchemy 包裝了 SQLAlchemy
        • 涉及的 python 包
          1. setuptools
          2. wheel
          3. twine: 發布python 包 (發布到 PyPI 后才能使用 pippipenv 安裝)
          4. readme_renderer: 將 mdrsttxt 文本 渲染成.html
        • 命名:
          1. 擴展的名稱: Flask-<功能/第三方庫名> 或 <功能/第三方庫名>-Flask
          2. 擴展的包名: 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) # 是否使用內置資源
            
        • 實現擴展功能
          • 加載靜態資源
            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('分享到:') }}
            
      • 開源發布準備

          1. 添加文檔字符串與注釋后的完整代碼
          """
              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.
              """
             
          
          1. 編寫 README 與文檔
          • 小項目 直接用 README概括所有的必需的說明
          • 大項目 比較復雜的,多文件組織文檔內容
            將項目部署到 Read the Docs
            Sphinx + Github + Readthedocs的工作流編寫和部署文檔
          1. 定義 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']
            ],
          )
          
          1. 指定打包其他文件: MANIFEST.in
            需要在 setup()方法中設置: include_package_data=True
          graft flask_share/static
          include LICENSE test_flask_share.py
          # exclude 用來排除匹配文件
          # recursive-include 遞歸匹配
          # recursive-exclude 遞歸排除匹配
          # graft 目錄 包含目錄下所有
          # prune 目錄 配出目錄下所有
          
          1. 編寫單元測試
          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))
           
          
          1. 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
            
        • twine 上傳
          • 安裝 twine
            pipenv install twine --dev
            
          • 上傳
            twine upload dist/*
            
      • 編寫良好的擴展

        • 命名規范(Flask-Foo 或 Foo-Flask)
        • 使用相對寬松的開源許可證(MIT/BSD)
        • 支持工廠模式(添加 initi_app() 方法)
        • 支持同時運行多程序實例( 使用 current_app 獲取程序實例)
        • 包含 setup.py腳本,并列出所有安裝依賴(必需)
        • 包含單元測試
        • 編寫文檔并在線發布
        • 上傳到 PyPI
      posted @ 2022-03-07 21:38  lghgo  閱讀(478)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 成A人片亚洲日本久久| 四虎影视一区二区精品 | аⅴ天堂中文在线网| 久热这里只精品99国产6-99RE视…| 日韩人妻无码一区二区三区久久 | 伊人精品久久久大香线蕉| 日本一码二码三码的区分| 亚洲欧美日韩综合久久久| 精品久久久久久国产| 国产精品成| 精品偷拍一区二区三区在| 伊人久久大香线蕉av一区二区 | 免费无码成人AV片在线| 成人免费无遮挡无码黄漫视频| 国产精品人妻中文字幕| 亚洲精品无码av人在线观看| 无码专区 人妻系列 在线| 国产精品揄拍100视频| 天天爽天天摸天天碰| 九九热视频在线观看视频| 久久精品丝袜高跟鞋| 国产精品成人网址在线观看| 亚洲精品一区三区三区在| 国产成人精品三级麻豆| 国产精品制服丝袜第一页| 亚洲www永久成人网站| 国产精品无码专区| 免费无码影视在线观看mov| 亚洲国产精品日韩在线| 欲香欲色天天天综合和网| 中文字幕一区二区三区麻豆| 又爽又黄又无遮挡的激情视频| 中文字幕亚洲综合久久青草| 九九热在线视频免费播放| 日韩V欧美V中文在线| 菏泽市| 国内自拍第一区二区三区| 人妻系列无码专区免费 | 爆乳女仆高潮在线观看| 亚洲sm另类一区二区三区| 视频二区中文字幕在线|