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,一经查实,立即删除!

相关文章

一篇超级最全的python基础篇

1.数据类型和变量 Python使用缩进来组织代码块,一般使用4个空格的缩进.使用#来注释一行,其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块.Python对大小写敏感. 1.1 整数 Python可以处理任意大小的整数,包括负整数,写法与数学上写法一致,例如:-100.如果用十六…

【文本编辑器,哪款适合你?】讲解

文本编辑器&#xff0c;哪款适合你? 文本编辑器介绍 文本编辑器介绍 电脑使用者在选择文本编辑器时&#xff0c;应该考虑以下几个方面&#xff1a; 需求&#xff1a;你是需要进行基本的文字处理工作&#xff0c;比如写作业或者制作报告&#xff0c;还是需要使用到高级功能&am…

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没有任何其它重…

InfluxDB的常用数据操作

1.插入语句 # INSERT语句用于向数据库中插入数据点&#xff08;数据行&#xff09;。 # 这些数据点包含时间戳、测量&#xff08;measurement&#xff09;、标签&#xff08;tags&#xff09;和字段&#xff08;fields&#xff09;等信息。 # 以下是INSERT语句的基本语法 INSE…

C++面试:内存溢出、内存泄漏的原因与解决

目录 内存溢出&#xff08;Memory Overflow&#xff09; 内存溢出介绍 解决内存溢出问题的方法 内存泄漏&#xff08;Memory Leak&#xff09; 内存泄露基础 解决内存泄漏问题的方法 内存溢出&#xff08;Memory Overflow&#xff09; 内存溢出介绍 内存溢出是指程序在执…

第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…

Rust所有权--与go对比学

如何拿返回值&#xff0c;如何不传递所有权就更改原值&#xff1f;如果想操作更改元变量要怎么做呢&#xff1f; 分别执行以下go代码&#xff1a; func main() {var a 10//calc1(a)//a calc_return(a)calc2(&a)a 100calc3(&a)fmt.Println(a) } func calc1(num int…

SQL Server 连接池相关内容

查看最大连接数 SELECT MAX_CONNECTIONS查看指定数据库的连接数 SELECT * FROM master.dbo.sysprocesses WHERE dbid IN ( SELECT dbid FROM master.dbo.sysdatabases WHERE NAMEDB_WMS_KZJ )获取当前SQL服务器所有的连接详细信息 SELECT * FROM sysprocesses获取自上次启动…

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

在测试的工作过程中&#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一词来源于英雄联盟里…

Nacos服务发现及其其他工具

1、什么是Nacos的服务发现功能 在微服务架构中&#xff0c;服务发现功能允许服务提供者&#xff08;服务实例&#xff09;将自己注册到Nacos服务器&#xff0c;同时服务消费者&#xff08;客户端&#xff09;能够通过Nacos服务器发现可用的服务实例。这样&#xff0c;服务消费…

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 ✔️ 岗位调整和改报&#…

数据结构与算法:图形数据结构

1. 图的基本概念和表示方法 图是一种由节点和边组成的非线性数据结构&#xff0c;用于描述事物之间的关系。在计算机科学中&#xff0c;图是一种十分重要的数据结构&#xff0c;广泛应用于各种领域&#xff0c;如网络分析、路径规划等。本节将介绍图的基本概念和两种常见的表示…

C++知识点总结(22):模拟算法

一、概念 模拟算法 根据题目描述进行筛选提取关键要素&#xff0c;按需求书写代码解决实际问题的算法。 二、步骤 1、提取题目的关键要素 2、根据关键要素的需求完成代码 三、关键要素 1、题目目的 2、样例的执行逻辑&#xff08;样例分析&#xff09; 3、数据范围&#xff08;…

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

随着移动互联网技术的普及&#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中第…