利用工程模式加密代碼
pyarmor工程模式加密代碼時(shí),為了確保代碼可以被uwsgi和manage.py 啟動(dòng)圆仔,加密入口指定為工程名稱下的init.py文件(與wsgi.py同一個(gè)目錄)和工程目錄下的manage.py文件
pyarmor init --entry=/project_name/__init__.py,manage.py
pyarmor build
-
問題利用uwsgi啟動(dòng)報(bào)錯(cuò)ModuleNotFoundError: No module named 'project_name.pytransform'
原因是pyarmor創(chuàng)建入口加密入口的init.py文件中有生成了import 錯(cuò)誤的代碼垃瞧,把init.py中的下面代碼進(jìn)行修改即可。
from .pytransform import pyarmor_runtime
#修改為 (去掉相對(duì)import)
from pytransform import pyarmor_runtime
即可修復(fù)uwsgi啟動(dòng)錯(cuò)誤坪郭。以上方法無法修復(fù)个从,采用pyarmor的高級(jí)模式
上面加密方式支持python manage.py runserver
啟動(dòng)
上面的方法已經(jīng)不適用于django的工程的加密,下面是完整的加密腳本
下面的腳本只是演示加密django工程下面的所有app歪沃,不加密manage.py文件嗦锐,可以使用runserver啟動(dòng),也可以用uwsgi啟動(dòng)沪曙。
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"):
"""
復(fù)制非加密的文件到加密后的工程
請(qǐng)修改下面need_copy_list奕污、need_copy_folder、need_create_folder的內(nèi)容
"""
#不用加密的文件液走,復(fù)制
need_copy_list = ['manage.py', 'config.ini', 'settings.py']
#不用加密的文件夾碳默,復(fù)制
need_copy_folder = ['database_dirver']
#項(xiàng)目依賴的文件夾贾陷,新建
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():
"""
運(yùn)行pyarmor,構(gòu)建本腳本目錄下的所有django的app執(zhí)行加密,
請(qǐng)修改下面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那般嘱根。