保存变量Python蓝图瓶

时间:2014-06-19 08:09:32

标签: python flask raspberry-pi

我有一个我开发的应用程序,用于通过互联网控制Raspberry Pi上的烧瓶和蓝图。我在客户端有一个Android应用程序发送http请求和raspberry pi与烧瓶应用程序作为服务器的答案。我有一个场景,我通过设置一个引脚来执行pwm控制风扇,然后改变它的占空比来控制它的速度。在我改变速度后,我让应用程序返回一个带有当前工作周期的json消息,如果风扇正在旋转或旋转(旋转部件没用,我知道:))。问题是,我不能在一个变量中保存占空比而不会在每次重新调用刚报告状态的函数(其上带有“/”路径的函数)时重置。我想不出一种方法可以让它在不保存文件的情况下简单快速地做到这一点,如果可能的话,我不想让它与文件复杂化。

这是主应用程序的代码,其中风扇已注册为蓝图。

from flask import Flask
from scen3 import scen3_api
from scen2 import scen2_api
app = Flask(__name__)


app.register_blueprint(scen3_api, url_prefix='/scenariu/3')
app.register_blueprint(scen2_api, url_prefix='/scenariu/2')
@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80, debug=True)

这是第二个包含sce 2内容的脚本的代码。基本上它在设置引脚后有两个功能,它们在“/”路径上返回占空比和自旋状态,并通过“/ PWMValue /”路径上的参数改变PWM的值。

import RPi.GPIO as GPIO
from flask import Flask, render_template, request, jsonify, Blueprint

scen2_api= Blueprint('scen2_api', __name__)    

GPIO.setmode(GPIO.BOARD)

GPIO.setup(12, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)

GPIO.output(18, GPIO.HIGH)

GPIO.setup(16,GPIO.OUT)
GPIO.output(16,GPIO.LOW)

dutyCycle=0
spin=0
p = GPIO.PWM(12, 500)

p.start(float(dutyCycle))
#spin=0
@scen2_api.route("/")
def main():
    spin=0  
    if dutyCycle != 0.0:
        spin=1
return jsonify(state=str(spin),pwmvalue=str(dutyCycle))


@scen2_api.route("/PWMValue/<action>")
def action( action):

    dutyCycle=float(action)
    p.ChangeDutyCycle(float(dutyCycle))

    return jsonify(state=str(spin),pwmvalue=str(dutyCycle))

每当我用报告功能调用该函数时,它返回0占空比并旋转。我怎么能解决这个问题,但仍然可以在不使用文件的情况下使其行为相同谢谢:))

2 个答案:

答案 0 :(得分:0)

{p> spindutyCycle分别是mainaction函数中的 locals 。您自动分配的所有变量都是。使用global关键字告诉Python以其他方式对待它们:

@scen2_api.route("/")
def main():
    global spin
    spin=0
    if dutyCycle != 0.0:
        spin=1
    return jsonify(state=str(spin), pwmvalue=str(dutyCycle))


@scen2_api.route("/PWMValue/<action>")
def action( action):
    global dutyCycle
    dutyCycle = float(action)
    p.ChangeDutyCycle(float(dutyCycle))

    return jsonify(state=str(spin), pwmvalue=str(dutyCycle))

答案 1 :(得分:0)

您可能存在范围问题,并且可能存在缩进问题...但您的问题与范围相关:

action(action)中,您设置了一个名为dutyCycle的变量,该变量是action函数的本地变量,我相信您期望更改“全局”变量。要了解正在发生的事情,请查看以下内容:

>>> g = 34
>>> g
34
>>> def f(n):
...     g = n
...     print g
...
>>> f(3)
3
>>> g
34
>>>

f更改其本地g,而不是您期望的全局。看一下understanding Python's execution model的博客文章。您可以前往“块和范围”,但我建议您阅读所有内容。

返回您的代码:

  • 不需要全局dutyCyclespin
  • 将所有GPIO初始化放在单独的函数/路由