从4月10号开始学李魏老师的python入门教程,边学边度边写,到今天5月11,正式完成这个项目的雏形。代码很初级,笨笨地实现一些功能,这周上线到生产环境,边跑边补吧。
简介: #
- 真.轻量简洁,全web应用,后端python,前端html,框架flask,数据库mysql,复杂的目前我也整不来
- 提供3个车间的任务通知,可新建任务、删除(完成)任务
部署环境: #
- 后端:Linux CentOS 7 / Python3.10.0 + Flask 1.14 + Mysql 5.6
- 前端:Html5
- 本地服务器+云端数据库
系统特点: #
- web前端脱管运行,任务更新时前端会自动渲染刷新
- 其它的 也就那么回事吧
演示界面: #
后台登陆
任务发布
任务修改和结束
任务通知界面
开源地址: #
https://github.com/ruderal828/Saida_project.git
开发过程: #
开发环境: #
1. 安装Pyhton3.10.0。 #
这是python的基础环境。
下载地址https://www.python.org/ftp/python/3.10.0/ ,安装一路下一步到底,能勾的都勾上(至少应该把环境变量pip IDLE等工具勾上)。
社会主义机构,免费。
2. 安装Pycharm。 #
这是配合python的编程环境,高效而优雅。
下载地址:https://www.jetbrains.com/pycharm/download/#section=windows
试用30天,够用。试用到期继续用是8.9刀每月。
3. 安装Xshell。 #
SSH管理工具。
下址地址:https://www.xshellcn.com/xiazai.html
直接填一下信息,然后邮箱里接收链接,个人免费够用,不需要去搞注册那些。
4 安装Navicat Premium。 #
数据库管理工具。
下载地址:http://www.navicat.com.cn/download/navicat-premium
14天试用,个人版的3个月819太阳币。..有点巨。也可度娘国情方案。
5. 安装云端mysql。 #
数据库环境。
登录阿里云,我这里是用的ECS。
为什么不一起装在本地或云端,主要考量安全问题。自己的代码不完美,在局域网跑要安全一些;而数据库分在云端,则是防止自己给本地Linux整挂了。
实例与镜像 – 实例 – ECS – 安装centOS8 – 配置root密码 – 完成
网络与安全 – 安全组 – 规则配置 – 开放ssh端口(通常是22)、888端口(BT初始界面需要) – 完成
打开第二步安装好的Xshell 7连接云服务器。
# 获取所有权限 sudo -i # 一键盘安装BT工具界面 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec
中途有几个需要确认的地方 -y 一下,等待一阵,完成后把最后的登陆信息复制保存。
切换到浏览器中登陆操作,最好把用户、密码、授权路径、端口号等改一下。
主页 – 数据库 – 增加数据库 – 完成
回到阿里云上的网络规则,关闭888端口,换成刚改的端口号。
准备环境基本就完成了。
开发过程: #
只记录遇到小要点的笔记。
Python 连接ssh并执行Linux脚本 #
# -*- codeing = utf-8 -*- # @Time : 2022/4/26 21:37 # @Author : Ruderal.cn # @File : courceurl.py # @Software : PyCharm # 引入paramiko模块,若无则pip3 install paramiko import paramiko # 创建连接 client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 client.connect(hostname='192.168.1.230', port=22, username='root', password='password') # 执行预订的脚本操作 stdin, stdout, stderr = client.exec_command('/root/xx.sh') # 要执行的脚路径 #5.获取命令执行的结果 result_ssh = stdout.tell() # print(result_ssh) # time.sleep(10) #6.关闭连接 client.close()
Python 通过SSH连接云服务器 操作mysql数据库 #
from sshtunnel import SSHTunnelForwarder import pymysql # 通过SSH连接云服务器 server = SSHTunnelForwarder( ssh_address_or_host=('192.168.1.230', 22), ssh_username='root', ssh_password='password', remote_bind_address=('localhost', 3306) ) # 连接服务器并启用通道 server.start() # 连接数据库 con = pymysql.connect( host='127.0.0.1', port=server.local_bind_port, user='user', password='password', db="sqlname", charset='utf8') # 创建游标 cur = con.cursor() # 要执行的语句 sql = '' # 执行语句 exe = cur.execute(sql) # 提交 con.commit() # 关闭游标 cur.close() # 关闭连接 con.close()
用post方法form到flask@app.route下接收做返回 #
# 登陆路由 @app.route('/', methods=['GET', 'POST']) def hello_world(): # put application's code here return render_template('admin/sign-in.html')
接上面的方法,做一个简单的登陆验证,基础逻辑是查表返回字典,if==本地input,判断str登陆。
# 用户验证路由 @app.route('/center', methods=['POST']) def login(): if request.method == 'POST': # print(request.form) # return login from database import con # 引入连接数据库文件database的连接con cur = con.cursor(cursor=pymysql.cursors.DictCursor) # 创建返回字典(dict)记录的游标 sql = "SELECT * FROM users" # 要执行的sql语法 con.ping(reconnect=True) # 确实连接 cur.execute(sql) # 执行sql f = cur.fetchall() # 接收字典结果 cur.close() # 关闭游标 con.close() # 关闭数据库连接 # server.close() # 判断登陆用户,以匹配用户名密码 if request.form.get('user') == '一只大浣熊': if request.form.get('user') == f[0]['name'] and request.form.get('password') == f[0]['pass']: return '登陆成功!' else: return '用户名或密码错误!' # 多个用户 多个elif elif request.form.get('user') == '另一只大浣熊': balabala... else request.form.get('user') == '别的什么熊': return '用户不存在!' else: return 'need POST methods!'
如何用python flask给前端html传参,以及前端网页显示传参数据 #
# 传参路由 单个参数 @app.route('/tof1', methods=['POST']) def tof1(): # 定义参数user_id user_id = request.form.get('tof1') return render_template("f1.html", user_id=user_id) # 前台网页现实 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>前台显示用户名</title> </head> <body> <h1>今天来的是几号熊?</h1> <p>是{{user_id}}号熊。</p> </body> </html> # 传参路由 多个参数 @app.route('/tof1', methods=['POST']) def tof1(): # 定义参数user_id 并形成列表 user_ids = [] for id in request.form.get('tof1') user_ids.addend(in) return render_template("f1.html", user_id=user_ids) # 前台网页现实 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>前台显示用户名</title> </head> <body> <h1>今天来都有哪些号的熊?</h1> <p>有{{user_ids[0]}}号熊。</p> <p>有{{user_ids[1]}}号熊。</p> <p>有{{user_ids[2]}}号熊。</p> </body> </html>
python 多个变量写入数据库 #
# 接收的定义 c_name = request.form.get('c_name') type_spec = request.form.get('type_spec') quantity = request.form.get('quantity') postscript = request.form.get('postscript') delivery_date = request.form.get('delivery_date') author_id = request.form.get('author_id') # 引入数据库连接 from database import con nitonew = con.cursor() sql = """ INSERT INTO `production_order`.`message_3f` (`c_name`, `type_spec`, `quantity`, `postscript`, `delivery_date`, `author_id`) VALUES (%s, %s, %s, %s, %s, %s) """ values = (c_name, type_spec, quantity, postscript, delivery_date, author_id) # 确认连接 con.ping(reconnect=True) # 执行 nitonew.execute(sql, values) # 提交 con.commit() # 关闭游标 nitonew.close()
数据更新后Flask前端自动刷新 #
这个是折腾最久的一个问题。
我想要数据库更新后,前端也时时更新,而flask框架只有在启动的时候运行渲染,并把结果传给html,但当我后端数据库发生变更时,前端刷新网页显示的仍是之前的旧数据,要显示最数据必须重启flask。
我的解决办法是,先在Linux写一个名为 restart.sh 的重启flask的脚本,放到用户目录下,并赋权限757:
# 杀掉正在运行的flask pkill python3 # 重新启动flask # 程序目录 cd /root/ruderal # 激活虚拟环境 source ENV/bin/activate # 运行flask主程序,!注意末尾必须加上& python3 app.py run & python3 app.py run & # suspend sleep 200 &
再编写一个名为run_again.py文件,通过ssh远程执行Linux脚本的脚本(笨熊套娃)
# 执行预订的脚本,路径为 restart.sh 脚本的全路径 stdin, stdout, stderr = client.exec_command('/root/restart.sh') # 获取结果,这条等下要用 result_ssh = stdout.tell() # print(result_ssh) # 关闭连接 client.close()
然后,在app.py主程序里创建一个返回
# 自动渲染数据并加载 @app.route('/cxjz', methods=['POST']) def cxjz(): # 引入上面run_again.py文件里的返回值,以此调用整个文件运行 from run_anaig import result_ssh if result_ssh == '0': return render_template('ojbk!') else: return render_template('ojbk too!')
最后一步,在前端html中,用form表单方式同步执行数据库操作和重新渲染的效果
<form action="cxjz" method="post"> <br> <p>该指令中止或完成!</p> <input type="hidden" name="cxjz"> <button type="submit">结束指令</button> </form>
到这里基本就实现功能了,但前端必须手动刷新后才会显示最新数据
这里,再用个livereload模块,来现实后端flask重启时,前端自动刷新页面的效果
# 引入livereload 模块中的Server,如果没有就pip一个 from livereload import Server if __name__ == '__main__': app.debug = True live_server = Server(app.wsgi_app) # live_server.watch('**/*.*') # 如果要指定IP和端口,则live_server.serve(host='192.168.1.230', port=5000) live_server.serve() # app.run()
这样,这种笨笨的办法,也算是实现我要的效果了。
html 如何在执行点击事件的同时执行表单提交 #
执行onclick关闭窗口的同时,执行javascript:document.gotodali.submit();表单提交,注意gotodali必须与表单中的name值相同
<form name="gotodali" action="gotodali" method="post"> <input type="hidden" name="gotodali" value="woyequ"> <div><a href="javascript:document.gotodali.submit();" onclick="window.close()">去哪啊朋友?</a></div> </form>
#
服务器部署 #
安装Linux #
下载CentOS Stream 9 地址https://www.centos.org/download/
用UltraISO把镜像写入U盘,启动安装时如果找不到盘,先ls /dev 看一下盘符,找到U盘记下,reboot
重启到安装菜单时e到install的HD:后面写上U盘路径,比如我的U盘是sda4,那我这里就是
vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sda4 quiet
然后ctrl+x,none。
配置网络 #
# 查看网卡 ip addr
# 进入网卡配置目录 cd /etc/sysconfig/network-scripts # 编辑配置文件 vim ifcfg-ensxx # 配置方法 TYPE=Ethernet /*设备类型*/ BOOTPROTO=static /*IP分配方式,一般就是static静态IP和dhcp动态分配IP两种*/ DEVICE=ens12 /*网卡名称,如果要改网卡名称,只改配置文件是没用的*/ ONBOOT=yes /*是否启动,有yes和no两种参数*/ IPADDR=192.168.1.20 /*设置内网IP地址*/ NETMASK=255.255.255.0 /*设置子网掩码*/ GATEWAY=192.168.0.1 /*设置网关*/ DNS1=192.168.0.1 /*设置DNS地址*/
# 重启网卡 systemctl restart network
防火墙配置 #
# 启动 systemctl start firewalld # 关闭 systemctl stop firewalld # 查看状态 systemctl status firewalld # 开机禁用 systemctl disable firewalld # 开机启用 systemctl enable firewalld
Linux CentOS7 配置网络唤醒 #
BIOS设置
进系统配置
# 安装环境 sudo yum install ethtool # or yum install -y ethtool # 查看状态 ethtool enp4s0 |grep Wake-on # Supports Wake-on: pumbg # Wake-on: d # d为关闭,g为激活 # 激活 ethtool -s 网卡名 wol g # ethtool -s enp4s0 wol g # 获取网卡信息 ifconfig 网卡名 | grep ether | awk '{print $2}' # 由于重启之后,ethtool会自动关闭,所以要将激活状态写入启动 cd /etc/rc.d vi rc.local # 在最下面添加一条 ethtool -s 网卡名 wol g
下载控制端软件:https://github.com/basildane/WakeOnLAN/releases/tag/2.12.4
网卡唤醒已完成。
安装环境 #
这里有很多先后依赖要安装,像套娃一样,一个套上另一个,所以要按先后一个个装,不然有的装到一半会报错。
ps. 所有编译安装的过程中出错中断的,再次安装之前必须要先清理编译包:make clean
1. 更新yum源配置 #
#1.查看yum源信息 yum repolist #2.备份配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak #3.下载国内yum源文件(centOs7,比如阿里) wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo (红帽同理 (RHEL 7)) (wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo) #4.清理缓存 yum clean all #5.重新生成缓存 yum make cache 6. 更新yum yum update
2. 安装/升级OpenSSL #
yum install openssl
如果上面的安装不成功
# 先安装这两个前置依赖 yum install build-essential yum install zlib # 再安装openssl yum group install 'Development Tools' yum install perl-core zlib-devel -y git cd /usr/local/src wget https://www.openssl.org/source/openssl-1.1.1o.tar.gz tar -xf openssl-1.1.1o.tar.gz cd openssl-1.1.1o ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib make make test make install
3. 安装 GMP,MPFR,MPC #
wget https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz tar -jxvf gmp-6.2.1.tar.xz cd gmp-6.2.1 ./configure --prefix=/usr/local/gmp-6.2.1 --build=x86_64-linux sudo make && make install wget http://ftp.gnu.org/gnu/mpfr/mpfr-3.1.0.tar.gz tar -xf mpfr-3.1.0.tar.gz cd mpfr-3.1.0 ./configure --prefix=/usr/local/mpfr-3.1.0 --with-gmp=/opt/gmp-6.2.1 --build=x86_64-linux sudo make && make install wget https://ftp.gnu.org/gnu/mpc/mpc-1.2.1.tar.gz tar -zxvf mpc-1.2.1.tar.gz cd mpc-1.2.1 ./configure --prefix=/usr/local/mpc-1.2.1 --with-gmp=/usr/local/gmp-6.2.1 -with-mpfr=/usr/local/mpfr-3.1.0 --build=x86_64-linux sudo make && make install
4. 安装GCC #
wget ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/releases/gcc-11.1.0/gcc-11.1.0.tar.gz tar -zxvf gcc-11.1.0.tar.gz cd gcc-11.1.0/ ls ABOUT-NLS COPYING3.LIB libbacktrace libquadmath Makefile.def ar-lib COPYING.LIB libcc1 libsanitizer Makefile.in ChangeLog COPYING.RUNTIME libcody libssp Makefile.tpl ChangeLog.jit c++tools libcpp libstdc++-v3 MD5SUMS ChangeLog.tree-ssa depcomp libdecnumber libtool-ldflags missing compile fixincludes libffi libtool.m4 mkdep config gcc libgcc libvtv mkinstalldirs config.guess gnattools libgfortran ltgcc.m4 move-if-change config-ml.in gotools libgo ltmain.sh multilib.am config.rpath include libgomp lt~obsolete.m4 NEWS config.sub INSTALL libhsail-rt lto-plugin README configure install-sh libiberty ltoptions.m4 symlink-tree configure.ac intl libitm ltsugar.m4 test-driver contrib LAST_UPDATED libobjc ltversion.m4 ylwrap COPYING libada liboffloadmic MAINTAINERS zlib COPYING3 libatomic libphobos maintainer-scripts ./configure --prefix=$PWD/_install sudo make && make install
5. 安装Prel5 #
wget https://www.cpan.org/src/5.0/perl-5.28.0.tar.gz tar -xzf perl-5.28.0.tar.gz cd perl-5.28.0 ./Configure -des -Dprefix=$HOME/localperl make make test make install
6. 安装phthon3.10.0 #
yum install gcc openssl-devel gcc-c++ compat-gcc-34 compat-gcc-34-c++ wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tgz #解压 tar zxf Python-3.10.0.tgz cd Python-3.10.0 ./configure --prefix=/usr/python3 --with-ssl # 编译安装 make make install # 验证安装 python3 -V pip3 -V # 如果报错,则补软链 # ln -s 源文件或目录 目标文件或目录 ln -s /usr/python3/bin/python3.10 /usr/bin/python3 ln -s /usr/python3/bin/pip3 /usr/bin/pip3 # 配置环境变量 # 使用whereis python3 查找文件目录,把目录配置到环境变量中 vim /etc/profile export PATH=/usr/python3/bin:$PATH # 使变量生效 source /etc/profile # 再次检验 python3 -V pip3 -V
10. Linux用户免输入密码登陆 #
cd /etc/gdm ls vi custom.conf # 在[daemon]下增加 AutomaticLoginEnable=True AutomaticLogin=root # root为要免密码登陆的用户
11. 其它小本本记录 #
登陆后自动执行程序
vim ~/.bash_profile export DISPLAY=:0 && moon is my lovey & # moon is my lovey 为要执行的应用
安装google chorme
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm rpm -ivh google-chrome-stable_current_x86_64.rpm # 如果报错 sudo yum -y localinstall google-chrome-stable_current_x86_64.rpm # 添加google-chrome快捷方式 cp /usr/share/applications/google-chrome.desktop /root/desktop/
centos7安装deb包
yum install alien # 如果没有这alien包 yum install epel-release # 安装好后再 yum install alien alien -r 软件名 generated rpm -ivh 文件名.rpm # 如果安装不上可以强制进行安装。 rpm -ivh --nodeps --force 文件名.rpm
Linux安装google chrome后 自动全屏最大化
google-chrome --no-sandbox -kiosk # 但重启后发现google chrome只是比窗口最大化大一点,并不能全屏 # cd到目录后再运行程序,完美实现 # 务必加上sudo以管理员身份运行,否则全屏前会弹input密码 # runing after login the google chrome # export DISPLAY=:0 &sudo google-chrome --no-sandbox -kiosk & cd /usr/bin sudo google-chrome --no-sandbox -kiosk https://ruderal.cn/f3