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)