FLask python: 重复代码,覆盖现有端点函数的问题
FLask python: Repeated code, issue of overwriting existing endpoint function
我正在使用 Flask python 编写一个应用程序,它允许我管理 2 个不同的电机。一个用于固体筒仓,另一个用于液体筒仓。
为了连接到这些电机,我使用了 OPCUA 连接。
在我的 python 文件中,我重复了两次代码,因为它是完全相同的过程,只有 nodeId 发生了变化。对于固体它是 ua.NodeId(13,4) 而对于另一个它是 ua.NodeId(23,4).
我试着写了下面的代码:
from flask import Flask
from flask import request
from flask import render_template
from opcua import Client
from opcua import ua
client = Client("opc.tcp://{ip}:4840/freeopcua/server/".format(ip='10.1.5.xxx'))
root = client.get_root_node()
objects = client.get_objects_node()
client.connect()
client.load_type_definitions()
app = Flask(__name__)
drive_state = 'Off'
if request.endpoint == 'solid_silos':
statusId = client.get_node(ua.NodeId(13, 5))
elif request.endpoint == 'liquid_silos':
statusId = client.get_node(ua.NodeId(23, 5))
statusId_val = statusId.get_value()
if statusId_val == 1:
drive_state = 'On'
if statusId_val == 2:
drive_state = 'Off'
print(statusId_val)
opc_state = 0
@app.route('/solid_silos/', endpoint='solid_silos')
@app.route('/liquid_silos/', endpoint='liquid_silos')
def form():
global drive_state
if request.endpoint == 'solid_silos':
statusId = client.get_node(ua.NodeId(13, 5))
elif request.endpoint == 'liquid_silos':
statusId = client.get_node(ua.NodeId(23, 5))
statusId_val = statusId.get_value()
if statusId_val == 1:
drive_state = 'On'
function_id = 101
if statusId_val == 2:
drive_state = 'Off'
function_id = 100
print(statusId_val)
if request.endpoint == 'solid_silos':
return render_template('solid_silos.html',drive_state=drive_state, function_id=function_id)
elif request.endpoint == 'liquid_silos':
return render_template('liquid_silos.html',drive_state=drive_state, function_id=function_id)
但我最终遇到了这个问题
raise AssertionError( AssertionError: View function mapping is overwriting an existing endpoint function: liquid_silos
此外,这两个不同的页面用我在 html 文件中创建的标签分隔,如下所示:
<div id="menu">
<ul id="onglets">
<li><a href="/solid_silos/"> Solid Silos </a></li>
<li class="active"><a href="/liquid_silos/"> Liquid Silos </a></li>
</ul>
</div>
该错误意味着当提供第二个注解时,flask 会尝试覆盖第一个注解定义的端点,而这不受 Flask 的支持,并且似乎没有达到您在此处尝试实现的目的。
更一般地说,端点最常用于反向查找,似乎不适用于此处的用例。
了解更多信息 - What is an 'endpoint' in Flask?
如果我正确理解你的目标,这可能会成功:
@app.route('/solid_silos/')
def form_solid_silos():
return form(client.get_node(ua.NodeId(13, 5)), 'solid_silos.html')
@app.route('/liquid_silos/')
def form_liquid_silos():
return form(client.get_node(ua.NodeId(23, 5)), 'liquid_silos.html')
def form(statusId, template_file):
global drive_state
statusId_val = statusId.get_value()
if statusId_val == 1:
drive_state = 'On'
function_id = 101
if statusId_val == 2:
drive_state = 'Off'
function_id = 100
print(statusId_val)
return render_template(template_file, drive_state=drive_state, function_id=function_id)
我正在使用 Flask python 编写一个应用程序,它允许我管理 2 个不同的电机。一个用于固体筒仓,另一个用于液体筒仓。
为了连接到这些电机,我使用了 OPCUA 连接。 在我的 python 文件中,我重复了两次代码,因为它是完全相同的过程,只有 nodeId 发生了变化。对于固体它是 ua.NodeId(13,4) 而对于另一个它是 ua.NodeId(23,4).
我试着写了下面的代码:
from flask import Flask
from flask import request
from flask import render_template
from opcua import Client
from opcua import ua
client = Client("opc.tcp://{ip}:4840/freeopcua/server/".format(ip='10.1.5.xxx'))
root = client.get_root_node()
objects = client.get_objects_node()
client.connect()
client.load_type_definitions()
app = Flask(__name__)
drive_state = 'Off'
if request.endpoint == 'solid_silos':
statusId = client.get_node(ua.NodeId(13, 5))
elif request.endpoint == 'liquid_silos':
statusId = client.get_node(ua.NodeId(23, 5))
statusId_val = statusId.get_value()
if statusId_val == 1:
drive_state = 'On'
if statusId_val == 2:
drive_state = 'Off'
print(statusId_val)
opc_state = 0
@app.route('/solid_silos/', endpoint='solid_silos')
@app.route('/liquid_silos/', endpoint='liquid_silos')
def form():
global drive_state
if request.endpoint == 'solid_silos':
statusId = client.get_node(ua.NodeId(13, 5))
elif request.endpoint == 'liquid_silos':
statusId = client.get_node(ua.NodeId(23, 5))
statusId_val = statusId.get_value()
if statusId_val == 1:
drive_state = 'On'
function_id = 101
if statusId_val == 2:
drive_state = 'Off'
function_id = 100
print(statusId_val)
if request.endpoint == 'solid_silos':
return render_template('solid_silos.html',drive_state=drive_state, function_id=function_id)
elif request.endpoint == 'liquid_silos':
return render_template('liquid_silos.html',drive_state=drive_state, function_id=function_id)
但我最终遇到了这个问题
raise AssertionError( AssertionError: View function mapping is overwriting an existing endpoint function: liquid_silos
此外,这两个不同的页面用我在 html 文件中创建的标签分隔,如下所示:
<div id="menu">
<ul id="onglets">
<li><a href="/solid_silos/"> Solid Silos </a></li>
<li class="active"><a href="/liquid_silos/"> Liquid Silos </a></li>
</ul>
</div>
该错误意味着当提供第二个注解时,flask 会尝试覆盖第一个注解定义的端点,而这不受 Flask 的支持,并且似乎没有达到您在此处尝试实现的目的。
更一般地说,端点最常用于反向查找,似乎不适用于此处的用例。
了解更多信息 - What is an 'endpoint' in Flask?
如果我正确理解你的目标,这可能会成功:
@app.route('/solid_silos/')
def form_solid_silos():
return form(client.get_node(ua.NodeId(13, 5)), 'solid_silos.html')
@app.route('/liquid_silos/')
def form_liquid_silos():
return form(client.get_node(ua.NodeId(23, 5)), 'liquid_silos.html')
def form(statusId, template_file):
global drive_state
statusId_val = statusId.get_value()
if statusId_val == 1:
drive_state = 'On'
function_id = 101
if statusId_val == 2:
drive_state = 'Off'
function_id = 100
print(statusId_val)
return render_template(template_file, drive_state=drive_state, function_id=function_id)