【问题标题】:Call function by URL in Flask通过 Flask 中的 URL 调用函数
【发布时间】:2018-05-17 08:39:44
【问题描述】:

我有一个 C++ DLL。我想制作一个 Flask 服务器来调用这个 DLL 中的函数。所以我在Flask 中使用ctypes。这是我在views.py 中的代码:

from flask import render_template
from MusicServer_Flask import app
from ctypes import *
import os

#load Dll:
cppdll = CDLL("C:\\VS_projects\\MusicServer_Flask\\NetServerInterface.dll")

#wrapping DLL function:
initnetwork = getattr(cppdll, "?InitNetwork@@YAHQAD0H@Z") #The function can be accessed successfully
initnetwork.argtypes = [c_char_p,c_char_p,c_int]
initnetwork.restype = wintypes.BOOL

#define route:
@app.route('/InitNetwork/<LocalIP>/<ServerIP>/<LocalDeviceID>')
def InitNetwork(LocalIP, ServerIP, LocalDeviceID):
    return initnetwork(LocalIP, ServerIP, LocalDeviceID)

this question的帮助下,我可以在Python交互窗口中成功调用这个函数:InitNetwork(b"192.168.1.101",b"192.168.1.101",555) 但是,当我运行 Flask 项目并输入这条路线时:http://192.168.1.102:8081/InitNetwork/b"192.168.1.102"/b"22192.168.1.102"/555 它给了我这样的错误: 在请求的 URL 中,b"192.168.1.102" 似乎变成了 b%22192.168.1.102%22。为什么会发生这种情况?如何使用正确的 URL 调用此函数?

感谢您的关注。

编辑:

感谢@Paula Thomas 的回答,我想我向答案迈进了一步。我将代码更改如下,将第一个和第二个输入参数转换为字节:

@app.route('/InitNetwork/<LocalIP>/<ServerIP>/<LocalDeviceID>')
def InitNetwork(LocalIP, ServerIP, LocalDeviceID):
    b_LocalIP = bytes(LocalIP,'utf-8')
    b_ServerIP = bytes(ServerIP,'utf-8')
    return initnetwork(b_LocalIP, b_ServerIP, LocalDeviceID)

但是,http://172.16.4.218:8081/InitNetwork/172.16.4.218/172.16.4.218/555http://172.16.4.218:8081/InitNetwork/"172.16.4.218"/"172.16.4.218"/555 都不起作用。仍然给我wrong type 错误。有人可以帮忙吗?

【问题讨论】:

    标签: python url flask dll ctypes


    【解决方案1】:

    我想您会发现 Flask 正在向您传递字符串(类型 str),而您的 C 或 C++ 函数期望前两个参数的字节(因此两个参数之前的 'b')和一个 int第三。转换它们是您的责任。

    【讨论】:

    • 我同意。但我不知道如何将输入变量转换为字节。你能给我一些提示吗?
    • 根据您的建议,我已经更新了我的帖子。
    • 但是你还没有把最后一个参数从str改成int。
    • 原来我应该返回一个类似return str(initnetwork(d_LocalIP,d_ServerIP,DeviceID))的字符串。它给了我正确的结果
    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多