文章目录

  • 需求提出
  • 需求背景
  • 具体需求
  • 需求图示
  • 需求分析
  • 技术分解
  • 需求实现
  • socket
  • socket client
  • socket server
  • socket result
  • Flask
  • Flask+socket client
  • socket server
  • result
  • 改进版
  • Flask
  • socket client
  • socket server
  • Flask + HTML
  • 改进版result



有需求才有动力!

需求提出

需求背景

公司的每个项目都会产生很多BUG,对应很多LOG,为了快速打开LOG目录进行查看,产生了一个需求

具体需求

网页端超链接或者按钮,点击之后自动打开对应BUG的LOG文件资源管理器

需求图示

python flask放置html的路径 flask打开html_python

需求分析

技术分解

  1. 首先要有超链接或者按钮供点击,这里涉及到HTML和Web部署
    – 对于Python来说就是:Flask+HTML
  2. 其次是数据传输,客户端要知道超链接的内容,需要打开哪个文件夹
    – 这里可以使用socket 进行传输
    – 其实对于IE浏览器有现成的功能,Chrome有类似的插件,但是支持都不好,这里不再赘述
  3. 最后是知道文件目录,要打开文件夹
    – Python有现成的库进行使用:import os

那么要实现这个需求,就是使用到:HTML+Flask+socket+os
其中最关键的就是socket,以下逐步实现

需求实现

socket

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

socket 主要就是为了通信用的,自然分为client端和server端,可以相互发送数据。server端是可以一直监听client端的消息,做出响应。

socket client

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:basic_socket_client.py

import socket               # 导入 socket 模块

s = socket.socket()         # 创建 socket 对象
port = 65432                # 设置端口号
server_ip = socket.gethostbyname(socket.getfqdn(socket.gethostname()))     #server 端IP地址,此处是本机地址
s.connect((server_ip, port))#连接

dir = 'C:\\Users\\wq\\Downloads\\python'
dir = bytes(dir,encoding='utf-8')
s.send(dir)                 #向server端发送数据

s.close()                   #关闭socket

socket server

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:basic_socket_server.py

import socket               # 导入 socket 模块

s = socket.socket()         # 创建 socket 对象
host = socket.gethostbyname(socket.getfqdn(socket.gethostname())) # 获取本地主机名
print(host)
port = 65432               # 设置端口
s.bind((host, port))       # 绑定端口

s.listen()                 # 等待客户端连接
while True:
    conn,addr = s.accept()     # 建立客户端连接
    print("连接地址:", addr)
    #c.send('欢迎访问菜鸟教程!')
    data=conn.recv(1024)
    data = str(data,encoding="utf-8")
    print("received dir:",data)

s.close()                # 关闭连接

socket result

运行socket,首先需要运行server端,保持监听状态,然后运行client端,就可以看到结果了,此处仅展示client向server发送数据的场景,如下

python flask放置html的路径 flask打开html_python_02

Flask

关于Flask Web框架的简单实用,在上篇文章做了简单介绍,对于本次需求的实现足矣。
上文知道了socket的简单使用,那要实现需求,需要将socket放到Flask里面使用,这样架到服务器上就能访问并进行通信了。

Flask+socket client

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:flask_open_dir.py

from flask import Flask #need install flask like:pip install flask
from flask import request
import socket               # 导入 socket 模块

app = Flask(__name__)

@app.route('/open_dir')             #url 路由地址,参考http://127.0.0.1:5000/python_web
def open_dir():

    dir = request.args.get('dir')   #获取url 参数
    client_ip = request.remote_addr #获取客户端访问IP
    print('client ip :',client_ip)
    print('received dir:',dir)

    s = socket.socket()             # 创建 socket 对象
    port = 65432                    # 设置端口号,这个端口要与Flask所使用的的端口保持一致
    s.connect((client_ip, port))

    data = bytes(dir,encoding='utf-8')
    s.send(data)
    s.close()

    return '200'

if __name__ == '__main__':
    ip = socket.gethostbyname(socket.getfqdn(socket.gethostname())) # 获取本地主机名
    app.run(debug=True,host=ip,port='65432')#指定IP,端口

socket server

server不需要Flask,在用户PC上保证一直运行就可以

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:open_dir_server.py
#本文件应该部署在客户端,保持一直运行,监听Flask服务器端发送的数据

import os
import socket               # 导入 socket 模块

s = socket.socket()         # 创建 socket 对象
host = socket.gethostbyname(socket.getfqdn(socket.gethostname())) # 获取本地主机名
print(host)
port = 65432               # 设置端口
s.bind((host, port))       # 绑定端口

s.listen()                 # 等待客户端连接
while True:
    conn,addr = s.accept()     # 建立客户端连接
    print("连接地址:", addr)
    #c.send('欢迎访问菜鸟教程!')
    data=conn.recv(1024)
    data = str(data,encoding="utf-8")
    print("received dir:",data)
    if os.path.exists(data):
        print('dir exist  !')
        os.system('explorer.exe %s' % data) #一行代码就可以实现打开文件资源管理器
    else:
        print('dir not exist !')

s.close()                # 关闭连接

result

这里注意一个问题,socket使用的端口需要和Flask使用的端口保持一致,这就存在端口占用冲突的问题,所以以下的代码在本地无法使用,需要在局域网进行调试(局域网中碰到一个问题,socket server中一直收不到client端发的数据,可能跟Flask有关,才疏学浅暂时没有找到根源)。

改进版

Flask

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:flask_open_system.py

from flask import Flask,render_template #need install flask like:pip install flask
from flask import request
import socket               # 导入 socket 模块
import os

#app实例
app = Flask(__name__)

@app.route('/') #url 路由地址
def index():
    #此处使用Flask的tempplate特性,展示HTML网页
    return  render_template('index.html')


@app.route('/open_dir') #url 路由地址,参考http://127.0.0.1:5000/
def open_dir():
    #获取url 参数
    dir = request.args.get('dir')
    print(dir)
    #获取客户端IP,因为只有一台电脑所以这个IP也是本机IP地址
    #正常在局域网下面,就是访问者的IP地址
    client_ip = request.remote_addr
    print(client_ip)

    #客户端脚本
    client_py_file = '"C:\\Users\\wq\\PycharmProjects\\PythonWebFlask\\FlaskWeb\\open_dir_client.py"'
    #dir = 'C:\\Users\\wq\\Downloads\\python'
    #既然我们最初测试basic socket可以使用,那么类似利用os的方式也就可以正常使用,此时我们可以任意指定其他端口
    #将ip地址,dir参数传递给client端进行发送
    os.system('python.exe %s %s %s' % (client_py_file,client_ip,dir))
    return  '已经打开文件夹!'



if __name__ == '__main__':
    #本机IP,在本机IP上部署Flask
    ip = socket.gethostbyname(socket.getfqdn(socket.gethostname())) # 获取本地主机名
    app.run(debug=True,host=ip,port='65431')
    #app.run(debug=True,port='65431')

socket client

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:open_dir_client.py
#和Flask放在同一端,服务器端,作为socket client发送数据给socket server

import socket               # 导入 socket 模块
import sys

s = socket.socket()         # 创建 socket 对象
port = 65432                # 设置端口号

server_ip = sys.argv[1] #获取参数
#dir = 'C:\\Users\\wq\\Downloads\\python'
dir = sys.argv[2]

s.connect((server_ip, port))

data = bytes(dir,encoding='utf-8')
s.send(data)
s.close()

socket server

file name:open_dir_server.py,参考上文

Flask + HTML

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:flask_open_system.py,在此文件下添加代码

@app.route('/') #url 路由地址
def index():
    #此处使用Flask的tempplate特性,展示HTML网页
    return  render_template('index.html')

改进版result

python flask放置html的路径 flask打开html_socket_03