利用工程模式加密代码
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创建入口加密入口的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执行加密,
请修改下面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那般。