Python笔记

环境配置: #

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。

实例与镜像 – 实例 – 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文件处理 #

FileExistsError:[WinError 183] 该文件已存在时无法创建该文件 #

问题: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')

读取本地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(列表已生成...")

Python ssh #

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()

python+html+flask套餐食用 #

用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>

#

如何在form表单中隐藏传参 #

<input name="name" type="hidden" value="value">
# type="hidden" 隐藏表单参数

Powered by BetterDocs

发表回复