gpt4 book ai didi

python - 使用 web.py 从表单提交启动的进程动态输出值

转载 作者:太空宇宙 更新时间:2023-11-03 17:55:31 27 4
gpt4 key购买 nike

我是网络服务器新手,因此我需要一些关于如何实现以下目标的指导:

  1. 与服务器位于同一网络的用户在服务器上打开一个页面(例如 10.42.68.130:8080/cycle)。
  2. 系统会向用户显示一个表单,要求他输入循环次数。
  3. 用户点击提交。提交会激活另一个函数,该函数执行指定次数的 for 循环(我简化了所有这些,因此它实际上应该在 beaglebone black 上触发 GPIO 引脚)
  4. 用户会收到进度反馈,因此计数器会显示已完成的周期数。

任何帮助将不胜感激。

我将放弃 learnpythonthehardway.com 第 50 课和第 51 课中的教程。这就是我设法开始的内容。

bin/app.py

import web
import time

urls = ('/cycle', 'Index')

app = web.application(urls, globals())

render = web.template.render('templates/', base="layout")

class Index(object):
def GET(self):
return render.hello_form2()

def POST(self):
form = web.input(cycles=0)
cycleparams = "%s" % (form.cycles)
cycleGPIO(form.cycles)
return render.index2(cycleparams = cycleparams)

if __name__ == "__main__":
app.run()

def cycleGPIO(cycles):
for i in range(int(cycles)):
print "cycle " + str(i+1)
time.sleep(1)

模板/layout.html

$def with (content)

<html>
<head>
<title>Test Page</title>
</head>
<body>

$:content

</body>
</html>

模板/index2.html

$def with (cycleparams)

$if cycleparams:
Test completed with the following parameters:
<br>
$cycleparams
$else:
No parameters specified
<br><br>
<a href="/cycle">Return to form</a>

模板/hello_form2.html

<fieldset>
<legend>Output Cycling</legend>

<form action="/cycle" method="POST">
<br>Number of cycles:
<br><input type="number" name="cycles">
<input type="submit">
</form>
</fieldset>

最佳答案

解决此问题的最佳方法是将 Web 和 GPIO 循环进程分开。之后,您可以使用 python 中可用的多种进程间通信机制之一。阅读此内容的一个很好的页面是 Interprocess Communication and Networking .

现在,我将选择一种在两个 python 进程之间进行通信的最简单方法,即纯文本文件。我们将有两个文件。您的 Web 服务进程将使用其中一个将表单输入发送到 GPIO 进程,而 GPIO 进程将使用另一个将反馈发送到 Web 服务。

请记住,这只是一个示例,还有很多更好的方法来解决进程间通信问题。这只是为了给您一个粗略的想法,而不是您应该在任何生产系统中使用的东西。

这就是代码的样子。

web.py 服务更改

...

urls = ('/cycle-status', 'StatusIndex')

...

class StatusIndex(object):
def GET(self):
# Read feedback params from a file
cycleparams = read_gpio_feedback_file()
return render.index2(cycleparams = cycleparams)

class Index(object):

...

def POST(self):
form = web.input(cycles = 0)
cycleparams = "%s" % (form.cycles)
# Write cycle params to a file
write_cycle_params(form.cycles)
# This call probably won't produce any results
# because your GPIO process couldn't react so fast.
return render.index2(cycleparams = {})

def write_cycle_params(cycles):
f = open('/path/to/cycles/file.txt', 'w')
for i in range(int(cycles)):
f.write("cycle " + str(i + 1))
f.close()

def read_gpio_feedback():
cycleparams = {}
f = open('/path/to/feedback/file.txt', 'r')
for line in f:
cycleparams['param1'] = line
f.close()
return cycleparams

GPIO流程

#!/usr/bin/env python

import sys

if __name__ == '__main__':
cycleparams = ""
f = open('/path/to/cycles/file.txt', 'r')
for line in f:
cycleparams = cycleparams + line
f.close()

# Do something with cycleparams related to GPIO
# Get your cycle params from GPIO pins

...

cycleparams = ""

f = open('/path/to/feedback/file.txt','w')
f.write(cycleparams + '\n')
f.close()

sys.exit(0)

您的 GPIO 进程必须定期运行,以从 Web 服务生成的文件中读取信息,并写入 Web 服务将解析和显示输出的反馈。您可以通过将 GPIO 进程添加到 crontab 中来实现此目的(或者任何其他进程调度机制都可以正常工作)。

关于python - 使用 web.py 从表单提交启动的进程动态输出值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28508869/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com