本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理
本文章来自腾讯云 作者:somenzz
阅读本文大概需要 4 分钟。
凡人皆有一死,凡人皆需侍奉。
很喜欢这句高等瓦雷利亚语,简单却蕴含人生哲理。
程序员是个非常辛苦的职业,为了写出健壮的代码,可能要牺牲娱乐和休息的时间。但这是值得的,只要你的代码有价值,也就是能满足特定人群的需求,或节省他们的时间,或解决他们的问题,这些付出最终都能带来金钱上的回报。
那么先想好你的优势,你的擅长的方面,最适合侍奉何种人群,能帮他们解决什么问题,在哪些方面需要与人合作,哪些方面需要自己学习,这都是要先考虑的。
作为技术人员,侍奉的一定是非技术人员,因为技术人员的问题已经自己通过技术解决了。因此你写的程序就要易用,健壮。这两个要求已经够你折腾一阵子了。
最近我在业余时间做的两件事情:
1、完善云端学习助手,使之更加易用,实现一键双击就可以使用,无需要安装任何其他软件。星球介绍链接:https://t.zsxq.com/i2jyZNj。
2、与朋友一起开发了一个学习类网站,青蛙学堂,网站:https://www.qwxtw.com。
做这些事情一方面是出于兴趣,另一方面有人买单,做起来自然动力十足,虽然经常写代码到 12 点,也不觉得太累。以上都是使用 Python 开发。在开发的过程中有 4 点新的收获,分享在这里,希望对于从事技术的你也所帮助。
1、如何让 Python 程序在 Windows 平台通用?
Python 代码要想执行,机器上必须有一个 Python 解释器,也就是从官网下载的 Python 安装程序。但想运行你写的程序的人,自己电脑上不一定有 Python 解释器,可能也不会安装,不会设置环境变量,不会打开命令窗口。
最好的方法是像 C 或 C++ 那样,直接编译成 exe 文件,别人一运行这个 exe 文件就可以运行。Python 提供了类似的工具,pyinstaller 和 py2exe 都可以将 Python 源文件(.py)打包成 exe 文件。但这个 exe 文件并不是走真正编译生成的,是把 Python 解释器和 Python 源文件打包在一起,因此生成的 exe 文件都很大。
上述方法不能保证每台机器都能正常运行,因为它依赖很多 Windows dll 文件,而且在打包过程中很容易报错,也是缺少各种各样的头文件。
后来我发现 Python 官网中提供了这样的一种版本:Windows x86-64 embeddable zip file。看了官网的介绍,这是一个绿色名安装的 Python 解释器,可以嵌入其他程序中以便执行 Python 程序,最新的 Python3.7 版本解压后也就 25M,并不大,这正是我想要的。
写好 Python 代码后,将 python 源代码和 python-3.7.4-embed-amd64 放在一起,发送给别人,再提供一个 startup.bat 文件,写入以下内容:
python-3.7.4-embed-amd64\python.exe yourPythonScript.py
pause
这样,别人双击 startup.bat 即可运行你提供的 Python 程序。如果代码中使用第三方的库。则需要修改 python-3.7.4-embed-amd64 目录下的 python37._pth 文件,把最后一行的注释去掉,文件内容应该是这样的:
python37.zip
.
# Uncomment to run site.main() automatically
import site
然后将同版本 Python pip 安装后的包从 site-packages 复制到 python-3.7.4-embed-amd64\Lib\site-packages 即可。
这样下来,你写的所有 Python 程序都可以放在这里,免去别人安装各种软件和依赖的麻烦,别人解压你的提供的压缩包,双击 startup.bat 即可运行,不需要任何额外的配置,简单易行,不懂技术的小白也可以使用。
2、如何保护 Python 源码,不被反编译破解。
Python 是一种解释型语言,解释型的语言特点就是常容易被反编译,如果代码中涉及加密环节,一但被破解就不好玩了。虽然 Python 也支持编译成 Python 字节码,如 pyc、pyo 文件,但可以轻松反编译,如 uncompyle6 就可以轻松反编译,代码规范的话,甚至连注释都给你还原出来。
上述的 py2exe,pyinstaller 虽然也起一定的保护作用,但其本质是打包,不是编译,因此也可以破解,感兴趣的可以去网上搜索下。
最彻底的方式是使用编译型的语言来写代码,像 C、C++ 那样,编译后直接生成机器代码,全是二进制的 0 或 1,无论如何也是没有办法反编译出来的。
借助这个思路就有两种方案:
1、并不是所有的代码都需要保密:需要保密的那部分代码可以使用 C 来写,然后生成使用 gcc 等编译器生成 Windows 的动态链接库文件 dll 文件,然后使用 Python 来引入 dll 文件。
import ctypes
dll = ctypes.windll.LoadLibrary( 'test.dll' )
这样,我们就可以使用 dll.function() 来调用 dll 文件中的函数了。
2、生成 pyd 文件,pyd 文件本质是 dll 文件,是适用于 Python 的 dll 文件,因此叫 pyd,可以可直接被 python 通过 import 导入。以下代码可以将 python 源代码直接编译成 pyd 文件。
注意先安装 Cython
pip install Cython
setup.py 文件内容,可根据需要进行修改。
from distutils.core import setup
from Cython.Build import cythonize
build_dir = 'build'
build_tmp_dir = 'build/temp'
setup(
name = 'myapp',
ext_modules=cythonize(['aaa.py','bbb.py','ccc.py']),
#script_args=["build_ext", "-b", build_dir, "-t", build_tmp_dir],
script_args=["install",]
)
在目录内执行 python setup.py 即可将 aaa.py,bbb.py,ccc.py 编译成对应的 pyd 并安装在 Python 的库目录 site-packages 中。
在写代码时可以直接以 import aaa,bbb,ccc 这样的方式来使用,就像引用其他Python文件一样,但是你无法查看 aaa,bbb,ccc 内的源代码,也几乎不可能被反编译,也就不可能被破解了。
大部分情况下,你在编译成 pyd 时都会报错,提示缺少 vcvarsall.bat。
解决方法:https://devblogs.microsoft.com/python/unable-to-find-vcvarsall-bat/#comments
对于 Python3 来说,安装下 vs2019 就可以了,选择 C/C++ 组件,及 Windows 10 sdk。约占用 4G 左右空间。
在 Linux 系统下,对应的是 so 文件,道理是相通的,掌握一个系统,很容易搞定其他系统。
3、使用 Django-rest-framework 开发后端接口,使用 JWT 认证。
什么是 JWT,如何使用,有一篇博文写的非常好,我就不再重复写了,有用到的点击下面的链接看下:
https://blog.csdn.net/weixin_42578481/article/details/86599681
4、使用 Nginx 配置 https 服务器,并自动更新证书。
同样有一篇非常好的博文,我当时就是参考这个配置成功的,放在此处,需要的可以自行访问。
HTTPS 简介及使用官方工具 Certbot 配置 Let’s Encrypt SSL 安全证书详细教程:
https://10.linuxstory.net/deploy-lets-encrypt-ssl-certificate-with-certbot/
先配置好 http 服务器,cerbot-auto 会自动为你配置 https 的配置,这里贴下我自己 nginx 的配置,供参考:
server {
server_name www.your_name.com; # managed by Certbot
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8080;
uwsgi_param UWSGI_SCRIPT you_dir.wsgi;
uwsgi_param UWSGI_CHDIR /home/xxxx/xxxx/you_dir;
index index.html index.htm;
client_max_body_size 35m;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/www.your_name.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.your_name.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.your_name.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 ;
listen [::]:80 ;
server_name www.your_name.com;
return 404; # managed by Certbot
}