zoukankan      html  css  js  c++  java
  • 加密Python项目代码之把Django或Flask项目打包成exe

    一 前提

    # Python是解释型语言,我们写的Flask或Django项目如果部署,源码可能会泄露,因此我们可以把项目打包成exe,来保护源码
    # 需要用到工具
    	-pyinstaller:把python项目打包成不同平台的可执行文件
      -nsis:NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序,它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的
    

    二 打包Flask项目

    2.1 项目源码

    # 项目源代码放在百度网盘上,如果需要自取,或者自己写个Flask项目亦可
    # 百度网盘地址
    链接: https://pan.baidu.com/s/1eJ029dk6ENCJyPJjMLN6vA 
    提取码: a2qq 
    # 目录结构如下
    
    image-20211107161643342

    2.2 下载pyinstaller

    pip3 install pyinstaller
    
    # 参数介绍
    
    可选参数 示例 说明
    -F pyinstaller -F demo.py 只在dist文件夹中生成一个程序demo.exe文件,适用于一个模块没有多依赖.py文件
    -D pyinstaller -D demo.py 默认选项,除了主程序demo.exe外,还会在在dist文件夹中生成很多依赖文件,推荐使用这个
    -c pyinstaller -c demo.py 默认选项,只对windows有效,使用控制台
    -w pyinstaller -w demo.py 只对windows有效,不使用控制台
    -p pyinstaller -p D:\project\demo.py 设置导入路径
    -i pyinstaller -i D:\demo.ico demo.py 给生成的demo.exe文件设置一个自定义的图标

    2.3 进入到项目路径下,执行

    # run.py 是flask项目的执行文件,app.run所在py文件
    
    pyinstaller -D run.py    
    
    # 可以看到项目路径下有
    	-build文件夹
      -dist文件夹:重要,下有run文件夹(py文件名字),有个run.exe(py文件的名字)
      -run.spec
      
    # 把pro_flask这个文件夹,拷贝到dist下的run文件夹
    	-因为flask项目有静态文件和html文件,如果不拷贝过去,静态文件和html文件会找不到
      -我们为了隐藏代码,可以把所有python的代码都删除,只留static和templates文件夹
      
    
    image-20211107161943563

    2.4 运行exe,测试

    # 今日到dist/run文件夹下,双击 run.exe,启动
    如下图
    # 浏览器访问
    如下图
    
    image-20211107162731197 image-20211107162626975

    2.5 使用nsis把文件夹打包成windows的安装包

    2.5.1 下载安装nsis

    nsis:NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序,它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的
      
    利用 nsis 把刚刚的dist的run文件夹打包成windows的安装包
    
    # nsis下载地址
    https://nsis.sourceforge.io/Download
      
    # 一路下一步安装,打开
    如下图
    
    image-20211107163120534

    2.5.2 把dist文件夹下的run文件夹压缩成zip

    image-20211107163517224

    2.5.3 使用nsis把压缩包,做成windows安装文件

    image-20211107163628684 image-20211107163814165 image-20211107163921611

    2.6 安装刚刚打包的安装包测试

    # 双击 run ,打开,一路下一步
    
    image-20211107164118276 image-20211107164256856 image-20211107164330225

    image-20211107164416124

    三 打包Django项目

    3.1 准备django项目

    # 百度网盘下载,或自己创建一个即可
    链接: https://pan.baidu.com/s/1p77wF1BaJzo7baCJIl-Z1g 
    提取码: 51dn 
    
    # 在django项目的配置文件中修改settings.py
    STATIC_ROOT = os.path.join(BASE_DIR, 'static', 'static_root')
    
    # 修改urls.py
    from django.conf.urls import static
    from django.conf import settings
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', views.index),
    ]
    urlpatterns += static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    
    # 执行 静态文件收集
    python manage.py collectstatic  # 会把所有静态文件收集到项目的static路径下的static_root文件夹下
    
    

    3.2 使用 pyinstaller打包

    # 进入到项目路径下
    pyinstaller -D manage.py
    
    # 生成dist文件夹,build文件夹和manage.spec文件
    

    3.3 执行打包成的exe

    # 此时在项目路径下会生成dist文件夹,内部manage文件夹下有manage.exe
    
    manage.exe runserver 
    
    # 运行服务是会提示No module named XXX
    执行会报错,提升缺少模块,我的提示少app01.apps
    
    
    #########
    这是因为Django有些module不会自动收集,需要手动添加
    解决方法:在manage.spec文件中修改hiddenimports=[]为hiddenimports=['app01.apps','users.apps',],提示缺少什么module就在此处添加什么。
    #########
    
    修改manage.spec,hiddenimports=['app01.apps',]
    
    # 再重新编译一下,运行
    
    pyinstaller manage.spec
    
    
    

    3.4 把templates和static文件夹copy到dist/manage文件夹下

    image-20211107172611930

    3.5 运行项目

    manage.exe runserver 0.0.0.0:8080
    
    image-20211107173113450 image-20211107173158109

    3.6 注意一些坑

    # 问题1:运行服务提示No module named XXX
    
    这是因为Django有些module不会自动收集,需要手动添加
    解决方法:在manage.spec文件中修改hiddenimports=[]为hiddenimports=['users','users.apps',],提示缺少什么module就在此处添加什么。
    
    
    # 问题2:打开网页出现TemplateDoesNotExist 错误
    
    解决方法:把项目中的模板文件templates拷贝到dist下的manage文件夹,刷新页面即可。
    
    # 问题3:静态文件找不到
    
    1、首先在项目中的settings文件中添加如下代码,其中static是项目中的静态文件位置,static_root是static下的一个空文件夹,然后执行python manage.py collectstatic命令将静态文件收录到static_root中
    
    STATIC_ROOT = os.path.join(BASE_DIR, 'static', 'static_root')
    2、然后在urls.py中添加如下代码:
    
    from django.conf.urls import static
    from project_1 import settings
    urlpatterns += static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    

    四 本笔记所有代码

    链接: https://pan.baidu.com/s/1gLbkU5F0MVEIzaDjTSLV6Q 
    提取码: 3uqr
    
  • 相关阅读:
    java如何实现以数据流的形式下载压缩包到本地?
    在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了?
    windows中当你的键盘无法使用时我们可以用另一种方法哦
    Idea中如何将web项目打包成war包并放到tomcat中启动
    [CSS3] Use media query to split css files and Dark mode (prefers-color-scheme: dark)
    [PWA] Storage information for PWA application
    [HTML5] Native lazy-loading for the web
    [Dynamic Programming] 198. House Robber
    [Javascript] Sort by multi factors
    [Javascript] Keyword 'in' to check prop exists on Object
  • 原文地址:https://www.cnblogs.com/liuqingzheng/p/15521006.html
Copyright © 2011-2022 走看看