【问题标题】:FLask python: Repeated code, issue of overwriting existing endpoint functionFlask python:重复代码,覆盖现有端点函数的问题
【发布时间】:2021-08-19 08:26:49
【问题描述】:

我正在使用 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>

【问题讨论】:

    标签: python endpoint


    【解决方案1】:

    该错误意味着当给出第二个注释时,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)
    

    【讨论】:

    • 我用return form(1) 和return form(2) 和statusId_val = statusId 尝试了你的代码。我没有连接到电机,所以我想用简单的值进行测试。当我继续http://localhost:5000/liquid_silos/ 时,我遇到了以下问题:raise TypeError(TypeError: The view function for 'form_liquid_silos' did not return a valid response. The function either returned None or ended without a return statement.,当我继续http://localhost:5000/solid_silos/ 时,我遇到了同样的问题:'form_liquid_silos' 的相同错误没有返回有效响应。`
    • 对不起,我的错,我没有注意到返回模板时正在使用端点名称。我编辑了代码,现在应该没问题了。
    猜你喜欢
    • 2013-11-26
    • 1970-01-01
    • 2011-06-11
    • 2021-08-08
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    相关资源
    最近更新 更多