PHP语言检测用户输入密码及调用Python脚本

  现在有一份计算流体力学N-S方程的Python脚本,想要在用户登录网站后可以可以运行该脚本,然后将脚本运行后绘制的图片显示在用户网页上。
建一个名为N_S.py的python脚本文件,这个脚本在生成图像后会自行关闭,随后将图片保存在指定的文件夹里:

import matplotlib.pyplot as plt  
import numpy as np  
from tqdm import tqdm  N_POINTS = 41  #网格点数
DOMAIN_SIZE = 1.0  #模拟区域大小
N_ITERATIONS = 500  #迭代次数  
TIME_STEP_LENGTH = 0.001  #时间步长
KINEMATIC_VISCOSITY = 0.1  #运动粘度 
DENSITY = 1.0  #密度
HORIZONTAL_VELOCITY_TOP = 1.0  #顶部水平速度 
N_PRESSURE_POISSON_ITERATIONS = 50  #Poisson迭代的次数  def initialize_fields():  element_length = DOMAIN_SIZE / (N_POINTS + 1)  x = np.linspace(0.0, DOMAIN_SIZE, N_POINTS)  y = np.linspace(0.0, DOMAIN_SIZE, N_POINTS)  X, Y = np.meshgrid(x, y)  u_prev = np.zeros_like(X)v_prev = np.zeros_like(X)p_prev = np.zeros_like(X)  return X, Y, u_prev, v_prev, p_prev, element_length  #element网格间距def central_difference(f, axis, element_length):    diff = np.zeros_like(f)    if axis == 'x':    diff[1:-1, 1:-1] = (f[1:-1, 2:] - f[1:-1, 0:-2]) / (2 * element_length)    elif axis == 'y':    diff[1:-1, 1:-1] = (f[2:, 1:-1] - f[0:-2, 1:-1]) / (2 * element_length)    return diff #计算拉稀拉丝算子
def laplace(f, element_length):    diff = np.zeros_like(f)    diff[1:-1, 1:-1] = (f[1:-1, 0:-2] + f[0:-2, 1:-1] - 4 * f[1:-1, 1:-1] + f[1:-1, 2:] + f[2:, 1:-1]) / (element_length**2)    return diff  def set_boundary_conditions(u, v, p):  #u=水平速度 v=垂直速度 p=压力u[0, :] = 0.0  #上部水平速度设为常数,其他全是0u[:, 0] = 0.0u[:, -1] = 0.0  u[-1, :] = HORIZONTAL_VELOCITY_TOP  v[0, :] = 0.0  v[:, 0] = 0.0  v[:, -1] = 0.0  v[-1, :] = 0.0  p[:, -1] = p[:, -2]  p[0, :] = p[1, :]  p[:, 0] = p[:, 1]  p[-1, :] = 0.0  def main():     X, Y, u_prev, v_prev, p_prev, element_length = initialize_fields()    for _ in tqdm(range(N_ITERATIONS)):    d_u_prev__d_x = central_difference(u_prev, 'x', element_length)    d_u_prev__d_y = central_difference(u_prev, 'y', element_length)    d_v_prev__d_x = central_difference(v_prev, 'x', element_length)    d_v_prev__d_y = central_difference(v_prev, 'y', element_length)    laplace__u_prev = laplace(u_prev, element_length)    laplace__v_prev = laplace(v_prev, element_length)    u_tent = u_prev + TIME_STEP_LENGTH * (-(u_prev * d_u_prev__d_x + v_prev * d_u_prev__d_y) + KINEMATIC_VISCOSITY * laplace__u_prev)  v_tent = v_prev + TIME_STEP_LENGTH * (-(u_prev * d_v_prev__d_x + v_prev * d_v_prev__d_y) + KINEMATIC_VISCOSITY * laplace__v_prev)set_boundary_conditions(u_tent, v_tent, p_prev)  d_u_tent__d_x = central_difference(u_tent, 'x',  element_length)  d_v_tent__d_y = central_difference(v_tent, 'y',  element_length)  rhs = (DENSITY / TIME_STEP_LENGTH) * (d_u_tent__d_x + d_v_tent__d_y)  for _ in range(N_PRESSURE_POISSON_ITERATIONS):  p_next = np.zeros_like(p_prev)  p_next[1:-1, 1:-1] = 0.25 * (p_prev[1:-1, 0:-2] + p_prev[0:-2, 1:-1] + p_prev[1:-1, 2:] + p_prev[2:, 1:-1] - element_length**2 * rhs[1:-1, 1:-1])  p_next[:, -1] = p_next[:, -2]  p_next[0, :] = p_next[1, :]  p_next[:, 0] = p_next[:, 1]  p_next[-1, :] = 0.0  p_prev = p_next  d_p_next__d_x = central_difference(p_next, 'x', element_length)  d_p_next__d_y = central_difference(p_next, 'y',  element_length)  u_next = u_tent - TIME_STEP_LENGTH / DENSITY * d_p_next__d_x  v_next = v_tent - TIME_STEP_LENGTH / DENSITY * d_p_next__d_y  set_boundary_conditions(u_next, v_next, p_next)  u_prev = u_next  v_prev = v_next  p_prev = p_next  speed = np.sqrt(u_next**2 + v_next**2)  plt.figure()  plt.contour(X, Y, p_next, cmap='coolwarm')  plt.colorbar()  plt.quiver(X, Y, u_next, v_next, color="black")  plt.quiver(X[::2, ::2], Y[::2, ::2], u_next[::2, ::2], v_next[::2, ::2], speed[::2, ::2], cmap='jet')  quiv_colorbar = plt.colorbar()  quiv_colorbar.set_label('Speed')save_path = 'GGboy/images/my_plot.png'  plt.savefig(save_path) plt.close() #显示图像换成plt.show()if __name__ == "__main__":  main()  

脚本运行后生成的图片

 

PHP调用Python脚本可以使用exec()函数,运行该脚本后再将脚本生成并保存的图片反馈给用户。

先建立一个名为的login.html的HTML文件,在HTML页面中建立用于读取用户输入密码的文本框,将用户输入的密码传递给处理密码的PHP脚本。

<!-- 不完整代码 -->
<!DOCTYPE html>    
<html lang="zh">    
<head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>这是标题</title>       
</head>    
<body>     <form action="/文件保存路径/脚本.php" method="post">  <label for="password">请输入密码:</label> <!-- 传递至PHP脚本  --><input type="password" id="password" name="password">  <input type="submit" value="提交">  </form>  </body>    
</html>

再建立一个名为GGBond.php的PHP文件,用来识别用户输入的密码是否正确:

//不完整代码
<?php  
if ($_SERVER["REQUEST_METHOD"] == "POST") {   $password = $_POST["password"];  if ($password == "ggboy") {  echo "密码正确";  } else {  echo "密码错误!";  }  
}  

这时应该优化功能,使PHP脚本能更安全地获取和处理 POST 数据,还能清理无用的缓存和防止注入攻击,顺便优化一下HTML页面 ,这时建立3个文件夹,一个用来存放CSS代码,一个用来存放JavaScript代码,一个用来存放页面图片总体结构如下:

先实现基本功能,使PHP代码调用Python脚本,先将GGBond.php的代码补全,把登录密码设置为ggboy

<?php  
if ($_SERVER["REQUEST_METHOD"] == "POST") {   $password = $_POST["password"];  // 密码是ggboyif ($password == "ggboy") {  // exce函数调用pythonexec("python N_S.py");  $imagePath = "/GGboy/images/my_plot.png";  echo "<img src='$imagePath' alt='Generated Image'>";  } else {  echo "密码错误!";  }  
}  

现在以下都是完整版代码,我先写的CSS代码,因为通过人力GPU运算的方式,我已设计好页面布局,有一个用来供用户护眼的滑动小猫,四张ins风格图型作为背景 ,再增加一组王者风的<h1>标题,确认好布局后开始CSS优化:

/* 让小猫划来划去 */
#sliding-image {  position: relative;  animation: slide 5s infinite;  
}  @keyframes slide {  0% {  transform: translateX(0);  }  100% {  /* 可以改成transform: translateX(calc(100vw - 500px)); 让小猫少划一点 */transform: translateX(calc(1000vw - 500px)); }  
}  /* 酷炫的闪耀标题 */
.shining-title {  font-size: 3em;  text-align: center;  margin: 20px;  animation: color-change 2s infinite;  
}  @keyframes color-change {  0% { color: red; text-shadow: 0 0 10px red, 0 0 20px red, 0 0 30px red; }  33% { color: yellow; text-shadow: 0 0 10px yellow, 0 0 20px yellow, 0 0 30px yellow; }  66% { color: blue; text-shadow: 0 0 10px blue, 0 0 20px blue, 0 0 30px blue; }  100% { color: red; text-shadow: 0 0 10px red, 0 0 20px red, 0 0 30px red; }  
}/* 四个角放置四个GGBond靓照 */
body {  margin: 0;  padding: 0;  display: flex;  justify-content: center;  align-items: center;  height: 100vh;  background-color: #f0f0f0;  position: relative;  
}  .container {  text-align: center;  
}  .form-center {  display: flex;  flex-direction: column;  
}  .password-input {  padding: 10px;  margin-bottom: 10px;  border-radius: 5px;  border: 1px solid #ccc;  
}  .submit-btn {  padding: 10px 20px;  border-radius: 5px;  background-color: #4CAF50;  color: white;  cursor: pointer;  border: none;  
}  .submit-btn:hover {  background-color: #45a049;  
}  .background-image {  position: absolute;  width: 300px;  height: 300px;  background-size: cover;  background-repeat: no-repeat;  
}  .top-left {  top: 0;  left: 0;  background-image: url('/GGboy/images/22.jpg'); 
}  .top-right {  top: 0;  right: 0;  background-image: url('/GGboy/images/33.jpg'); 
}  .bottom-left {  bottom: 0;  left: 0;  background-image: url('/GGboy/images/44.jpg'); 
}  .bottom-right {  bottom: 0;  right: 0;  background-image: url('/GGboy/images/55.jpg'); 
}

因为设计中加入了图片移动动作,所以再编写好JavaScript代码:
 

document.addEventListener('DOMContentLoaded', function() {    var img = document.getElementById('sliding-image');    if (!img) {  console.error('Image element not found');  return;  }  var maxSlide = window.innerWidth - img.offsetWidth;    setInterval(function() {    var randomSlide = Math.random() * maxSlide;    img.style.transform = 'translateX(' + randomSlide + 'px)';    // 哈基米的滑动时间间隔setTimeout(function() {    img.style.transform = 'translateX(0)';    }, 200);    }, 3000); });

最后完备好HTML:

<!DOCTYPE html>    
<html lang="zh">    
<head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>哎呦喂,您猜怎么着</title>    <link rel="stylesheet" href="/GGboy/Csgo/GGBond.css">    
</head>    
<body>    <h1 class="shining-title">学流体力学的爷就是爷</h1>  <div class="background-image top-left"></div>    <div class="background-image top-right"></div>    <div class="background-image bottom-left"></div>    <div class="background-image bottom-right"></div> <img id="sliding-image" src="/GGboy/images/66.jpg" alt="Moving Image">     <script src="/GGboy/jvav/AUV.js"></script> <form action="/GGboy/GGBond.php" method="post">  <label for="password">请输入密码:</label> <!-- 密码是ggboy  --><input type="password" id="password" name="password">  <input type="submit" value="提交">  </form>  </body>    
</html>

在VScode打开login.html文件中右键空白处,点击PHP Server:Server project试运行下:

 

 可以看到密码文本框这里效果很好 

 客户页面感觉不太妙啊,但是PHP和Python运行正常,我认为如果上线的话客户是不会投诉的
 


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/701772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BIO实战、NIO编程与直接内存、零拷贝深入辨析

BIO实战、NIO编程与直接内存、零拷贝深入辨析 长连接、短连接 长连接 socket连接后不管是否使用都会保持连接状态多用于操作频繁&#xff0c;点对点的通讯&#xff0c;避免频繁socket创建造成资源浪费&#xff0c;比如TCP 短连接 socket连接后发送完数据后就断开早期的http服…

简单上手若依框架

简介 若依是一个基于SpringBoot&#xff0c;Shiro&#xff0c;Mybatis的权限后台管理系统官网文档&#xff1a;介绍 | RuoYi源码 前后端不分离 RuoYi: &#x1f389; 基于SpringBoot的权限管理系统 易读易懂、界面简洁美观。 核心技术采用Spring、MyBatis、Shiro没有任何其它重…

第6.4章:StarRocks查询加速——Colocation Join

目录 一、StarRocks数据划分 1.1 分区 1.2 分桶 二、Colocation Join实现原理 2.1 Colocate Join概述 2.2 Colocate Join实现原理 三、应用案例 注&#xff1a;本篇文章阐述的是StarRocks-3.2版本的Colocation Join 官网文章地址&#xff1a; Colocate Join | StarRoc…

五大方法教你如何分分钟构造百万测试数据!

在测试的工作过程中&#xff0c;很多场景是需要构造一些数据在项目里的&#xff0c;方便测试工作的进行&#xff0c;构造的方法有很多&#xff0c;难度和技术深度也不一样。本文提供方法供你选择。 在测试的工作过程中&#xff0c;很多场景是需要构造一些数据在项目里的&#…

Centos服务器部署前后端项目

目录 准备工作1. 准备传输软件2. 连接服务器 部署Mysql1.下载Mysql(Linux版本)2. 解压3. 修改配置4. 启动服务另一种方法Docker 部署后端1. 在项目根目录中创建Dockerfile文件写入2. 启动 部署前端1. 在项目根目录中创建Dockerfile文件写入2. 启动 准备工作 1. 准备传输软件 …

全网唯一基于共享内存的C++ RPC框架

首先声明&#xff1a;我不是标题党&#xff0c;我是在找遍全网&#xff0c;没有找到一个基于共享内存实现、开源且跨平台的C RPC框架之后&#xff0c;才着手开发的这个框架。 项目地址&#xff1a;https://github.com/winsoft666/veigar 1. Veigar Veigar一词来源于英雄联盟里…

2024年湖北省事业单位考试报名流程图解

⏰ 时间安排 ✔️ 注册&#xff1a;2024年2月19日至2月27日15:00 ✔️ 报名&#xff1a;2024年2月21日9:00至2月27日17:00 ✔️ 资格审查&#xff1a;2024年2月21日9:00至2月28日9:00 ✔️ 缴费确认&#xff1a;2024年2月28日9:00至3月1日24:00 ✔️ 岗位调整和改报&#…

上门服务系统|上门服务小程序|上门服务软件开发

随着移动互联网技术的普及&#xff0c;上门服务小程序系统成为现代企业数字化转型的关键一环。这一系统为消费者提供了更加便捷、高效以及个性化的服务体验&#xff0c;同时也为企业带来了更广阔的商业机会。让我们来看看上门服务小程序系统的优势和功能。 首先&#xff0c;上门…

vue3新特性-defineOptions和defineModel

defineOptions 背景说明&#xff1a; 有 <script setup> 之前&#xff0c;如果要定义 props, emits 可以轻而易举地添加一个与 setup 平级的属性。 但是用了 <script setup> 后&#xff0c;就没法这么干了 setup 属性已经没有了&#xff0c;自然无法添加与其平…

Docker基础篇(二)

docker run -d docker run -d 容器名或容器ID docker run -d 后台生成容器&#xff0c;并退出容器&#xff08;除容器中在运行脚本&#xff09; docker run -it 交互生成容器 docker run -d centos /bin/sh -c “while true; do echo zen; sleep 2;done” 查看容器中的进程…

【进程创建】

目录 进程创建的方式查看进程pid 调用系统调用创建子进程fock函数做了的工作子进程刚开始创建的状态 一个变量&#xff0c;两个不同的值创建子进程的作用 进程创建的方式 1.在操作系统上输入的指令。 2.已经启动的软件。 3.程序员在代码层面上调用系统调用创建进程。 linux中第…

服务器被黑该如何查找入侵痕迹以及如何防御攻击

当公司的网站服务器被黑&#xff0c;被入侵导致整个网站&#xff0c;以及业务系统瘫痪&#xff0c;给企业带来的损失无法估量&#xff0c;但是当发生服务器被攻击的情况&#xff0c;作为服务器的维护人员应当在第一时间做好安全响应&#xff0c;对服务器以及网站应以最快的时间…

【Java程序设计】【C00287】基于Springboot的疫情防控期间某村外出务工人员管理系统(有论文)

基于Springboot的疫情防控期间某村外出务工人员管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的疫情防控期间某村外出务工人员信息管理系统 本系统分为系统功能模块、管理员功能模块、用户功能模块、采集…

git 获取仓库代码与提交代码

1. 建文件夹&#xff0c;获取项目的完整代码 2.Git安装 打开安装程序后&#xff0c;一直点击下一步&#xff0c;直到以下位置&#xff1a; 此处代表使用VIM作为Git默认的编辑器。继续下一步&#xff0c;直到: 这里选择第一项&#xff0c;即仅仅在Bash中使用Git。如果有Linux的学…

ASCII编码的影响与作用:数字化时代的不可或缺之物

title: ASCII编码的影响与作用&#xff1a;数字化时代的不可或缺之物 date: 2024/2/25 16:03:37 updated: 2024/2/25 16:03:37 tags: ASCII起源标准化字符文本处理基础编程语言基石数据库存储标准跨平台兼容多语言编码基础 一、ASCII编码的起源 ASCII&#xff08;American St…

Qt的QFileSystemModel与QTreeView、QTableView、QListView的组合使用

1.相关描述 QFileSystemModel与QTreeView、QTableView、QListView的组合&#xff0c;当QTreeView点击发生改变&#xff0c;QTableView和QListView也会发生变化 2.相关界面 3.相关代码 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h"…

2.WEB渗透测试-前置基础知识-web基础知识和操作系统

web基础知识 1.http协议 超文本传输协议是互联网上应用最广泛的一种网络协议。所有www文件都必须遵守的一个标准&#xff0c;是以 ASCII 码传输&#xff0c;建立在 TCP/IP 协议之上的应用层规范&#xff0c;通俗点说就是一种固定的通讯规则。 2、网络的三种架构及特点 网络应…

备战蓝桥杯————双指针技巧巧解数组3

利用双指针技巧来解决七道与数组相关的题目。 两数之和 II - 输入有序数组&#xff1a; 给定一个按升序排列的数组&#xff0c;找到两个数使它们的和等于目标值。可以使用双指针技巧&#xff0c;在数组两端设置左右指针&#xff0c;根据两数之和与目标值的大小关系移动指针。 …

年关将至送大礼 社区适时献爱心

在这个快节奏的时代&#xff0c;社区作为人们生活的重要组成部分&#xff0c;其凝聚力和互助精神显得尤为重要。2024年2月7日&#xff0c;实践队员李若钰有幸参与了社区礼盒分装的活动&#xff0c;这不仅仅是一次简单的劳动&#xff0c;更是一次心灵的洗礼和感悟。 礼盒分装&am…

Ansible user 模块 该模块主要是用来管理用户账号

目录 参数语法验证创建用户删除用户验证 删除用户 参数 comment  # 用户的描述信息 createhome  # 是否创建家目录 force  # 在使用stateabsent时, 行为与userdel –force一致. group  # 指定基本组 groups  # 指定附加组&#xff0c;如果指定为(groups)表示删除所有…