利用工程模式加密代碼
pyarmor工程模式加密代碼時,為了確保代碼可以被uwsgi和manage.py 啟動,加密入口指定為工程名稱下的init.py文件(與wsgi.py同一個目錄)和工程目錄下的manage.py文件
pyarmor init --entry=/project_name/__init__.py,manage.py
pyarmor build
-
問題利用uwsgi啟動報錯ModuleNotFoundError: No module named 'project_name.pytransform'
原因是pyarmor創(chuàng)建入口加密入口的init.py文件中有生成了import 錯誤的代碼,把init.py中的下面代碼進行修改即可。
from .pytransform import pyarmor_runtime
#修改為 (去掉相對import)
from pytransform import pyarmor_runtime
即可修復uwsgi啟動錯誤。以上方法無法修復,采用pyarmor的高級模式
上面加密方式支持python manage.py runserver 啟動
上面的方法已經不適用于django的工程的加密,下面是完整的加密腳本
下面的腳本只是演示加密django工程下面的所有app,不加密manage.py文件,可以使用runserver啟動,也可以用uwsgi啟動。
import os
import sys
import pyarmor
from pyarmor.pyarmor import main as call_pyarmor
import shutil
import traceback
def migrate_project(encred_dir="encred_project/dist"):
"""
復制非加密的文件到加密后的工程
請修改下面need_copy_list、need_copy_folder、need_create_folder的內容
"""
#不用加密的文件,復制
need_copy_list = ['manage.py', 'config.ini', 'settings.py']
#不用加密的文件夾,復制
need_copy_folder = ['database_dirver']
#項目依賴的文件夾,新建
need_create_folder = ['static', 'logs', 'uploads']
for copy_file in need_copy_list:
shutil.copyfile(copy_file, encred_dir + "/" + copy_file)
for copy_folder in need_copy_folder:
try:
shutil.copytree(copy_folder, encred_dir + "/" + copy_folder)
except Exception as e:
traceback.print_exc()
continue
for create_folder in need_create_folder:
try:
os.mkdir(encred_dir + "/" + create_folder)
except Exception as e:
traceback.print_exc()
continue
def encry_project():
"""
運行pyarmor,構建本腳本目錄下的所有django的app執(zhí)行加密,
請修改下面app_name為自己app的名稱
"""
need_encry_modules = ['app_name1', 'app_name2']
init_cmds = [
['init', '--src', module, '--encry=__init__.py', f'encred_project/{module}'] for module in need_encry_modules
]
for each_init in init_cmds:
try:
call_pyarmor(each_init)
except RuntimeError:
traceback.print_exc()
pass
create_common_runtime_cmd = [
'build',
'--output',
'encred_project/dist',
'--only-runtime',
f'encred_project/{need_encry_modules[0]}'
]
call_pyarmor(create_common_runtime_cmd)
encry_cmds =[
['build',
'--output',
'encred_project/dist',
'--no-runtime',
f'encred_project/{module}']
for module in need_encry_modules
]
for each_encry in encry_cmds:
call_pyarmor(each_encry)
if __name__ == "__main__":
encry_project()
migrate_project()
添加和修改license的操作如同encry_project那般。