这是python的基础环境。
下载地址https://www.python.org/ftp/python/3.10.0/ ,安装一路下一步到底,能勾的都勾上(至少应该把环境变量pip IDLE等工具勾上)。
社会主义机构,免费。
这是配合python的编程环境,高效而优雅。
下载地址:https://www.jetbrains.com/pycharm/download/#section=windows
试用30天,够用。试用到期继续用是8.9刀每月。
SSH管理工具。
下址地址:https://www.xshellcn.com/xiazai.html
直接填一下信息,然后邮箱里接收链接,个人免费够用,不需要去搞注册那些。
数据库管理工具。
下载地址:http://www.navicat.com.cn/download/navicat-premium
14天试用,个人版的3个月819太阳币。..有点巨。也可度娘国情方案。
数据库环境。
登录阿里云,我这里是用的ECS。
实例与镜像 – 实例 – 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端口,换成刚改的端口号。
准备环境到此完成。
问题:os保存文件到本地并复制时,若目录下已经有同名文件,则出现该错误。
解决:做一个if判断,然后else一个处理方法,如果有多个if,则if嵌套,例
import shutil import so # 文件保存本地txt,没有文件则自动创建 f = open('moon/working/doc_01.txt', 'a+', encoding='utf-8') # 复制文件 shutil.copy('moon/working/doc_01.txt', 'moon/backups/') # 重命名备份文件,同时判断文件是否存在 new_file = os.path.exists('moon/backups/new_1.txt')#定义要重命名的文件 if new_file == True: #如果重名,返回Trun并执行if语句 del_file = 'moon/backups/new_1.txt'#定义要删除对象 os.remove(del_file)#删除 else: pass #不重名,则什么也不做 # 再次重命名备份文件 os.rename('moon/backups/doc_01.txt', 'moon/backups/new_1.txt') print("原稿已备份并重命名...")
要注意两点:1. 要用f‘code{变量}.xxx’把代码包起来;2. 要确保title是str,不确定的话就str(title)一下。
title = '我是一个标题' #定义title # 用rename方法重命名,用花括号把量传进去,注意必须用f把整段标进来 os.rename('moon/backups/doc_01.txt', f'moon/backups/{title}.txt')
path = 'moon/working/doc_01.txt' # 读取文件 file = open(path, encoding="utf-8") results = [] # 逐行读取 for line in file: if line == '\n': #跳过空白行 continue results.append(line.strip()) file.close() # 关闭文件 print(列表已生成...")
# -*- 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()
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()
# 登陆路由 @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!'
# 传参路由 单个参数 @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>
# 接收的定义 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框架只有在启动的时候运行渲染,并把结果传给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()
这样,这种笨笨的办法,也算是实现我要的效果了。
执行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>
<input name="name" type="hidden" value="value"> # type="hidden" 隐藏表单参数
Powered by BetterDocs
要发表评论,您必须先登录。