Flask 代碼打包

關鍵字 flask setuptools mvc blueprint pycharm python2.7.13

背景

基于flask開發了一款產品,屆時會部署到客戶的環境,為了避免重要的代碼泄露,故而對部分代碼進行打包封裝。在這里blueprint不是必須要使用的,但樓主為了以后做準備,這里也用上了。于是乎,開始一路嘗試...總結下分享給大家參考。

開始

step1 pycharm創建flask項目

剛新建ok的項目,都是空的,不多說

step2 項目新建python package

  • 創建frame
  • 創建web
    • web下創建controller
      • calculate下添加calculate.py文件
  • 創建setup.py
    項目目前如圖:
Paste_Image.png

step3 coding

controller->_init__.py

from web import app
from web.controller.calculte 

import calculate_blueprint
app.register_blueprint(calculate_blueprint)

controller->calculate.py

from flask import Blueprint

calculate_blueprint = Blueprint('calculate', __name__,url_prefix='/calculate')


@calculate_blueprint.route('/')
def home():
      return 'calculate'

web->_init_.py:

from flask import Flask

app = Flask(__name__)

import controller

Flask-blueprint.py

from web import app


if __name__ == '__main__':name="zsf-test",
    version="1.0.0",
    description="zsf-test",
    author="zsf",
    author_email="zsfbest@gmail.com",
    long_description=textwrap.dedent("""zsf-test"""),
    packages=find_packages(),
    install_requires=[
        "Flask",
        "xmltodict",
    ],
    include_package_data=True,
    zip_safe=False,
)


    app.run(threaded=True)

setup.py

import setuptools
import textwrap
from setuptools import find_packages

if __name__ == "__main__":
    setuptools.setup(
        name="zsf-test",
        version="1.0.0",
        description="zsf-test",
        author="zsf",
        author_email="zsfbest@gmail.com",
        long_description=textwrap.dedent("""zsf-test"""),
        packages=find_packages(),
        install_requires=[
            "Flask",
            "xmltodict",
        ],
        include_package_data=True,
        zip_safe=False,
    )

step 4 代碼釋義

1.為何要在web下的_init_.py初始化app?

其實像剛創建好項目放在Flask-blueprint初始化也是可以的,這里是為了深度隱藏app初始化的一些內容,在web下的_init_.py 其實還會放請求攔截日志初始化等功能性代碼。

2.web下的_init_.py為何先初始化app后在導入controller?

這里是因為controller需要導入web下的app來注冊藍圖。反過來說,如果web下的_init.py還沒初始化app,controller下的_init.py就無法從web導入app,那直接就導入報錯,更別談注冊藍圖。

3.setup.py代碼釋義

packages=find_packages()這里請務必使用這個函數來找需要打包的packages。最開始看了一篇博客,寫法類似于 packages={'web'},后面解壓縮了打包后的文件一看,只把我的web第一級目錄打包進去了,web下的controller完全沒有。

4.controller 下的代碼及Flask-blueprint.py代碼釋義

這里代碼都很簡單,就是藍圖的簡單實例,以及app的run。用manager來跑項目的自行擴展

5.附注

其實不添加setup.py 已經可以運行了,右鍵Flask-blueprint.py文件,run或debug,然后瀏覽器訪問http://127.0.0.1:5000/calculate/ 會打印 calculate到頁面

step 5 開始打包

pycharm下直接alt f12 喚出自帶的terminal。執行:
python setup.py sdist
刷新項目結構會發現自動生成了dist,和zsf_test.egg-info文件夾.如圖所示:

Paste_Image.png

pip可以直接安裝dist下的壓縮包,代碼:
pip install zsf-test-1.0.0.tar.gz
解壓縮看一下,如圖:

Paste_Image.png

樓主平時用linux系統開發,用tar -zxvf 解壓的該文件,其他系統用戶自行解決。可以看到所有的項目代碼都已經打包進來了到這里。下面我們實際運用一下,來驗證一下這個包是否能正常工作。

step 6 項目認證

1.新建一個virtualenv

創建一個新的virtualenv并安裝之前生成好的python包

2.創建一個新的flask項目

創建一個新的flask項目,并使用剛剛創建的virtualenv運行
這兩步有難度的可以參考我的另一篇文章Python virtualenv
目前項目如圖:

Paste_Image.png
3.coding
from web import app

if __name__ == '__main__':
    app.run(port=1234)#為了和上個項目做區分,特地換個端口
4.運行setuptoolsTest.py

瀏覽器訪問http://127.0.0.1:1234/calculate/ 出現如圖效果

Paste_Image.png

step 7 結束

????新項目只導入app,并啟動,其余代碼都在python packages里面。至此,一切都完成。屆時部署到客戶環境時,對于代碼起到一定程度的保護性(遇到python大神另說了)。
新年了,項目要上線,每天早上八點到公司寫的這篇文章,有不清晰或者有漏洞的,請大家不吝賜教,本人積極改正。也歡迎各路朋友關注本人,陸續更新一點項目使用的心得給大家。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容