在 Flask 中通过 URL 调用函数

Call function by URL in Flask

我有一个 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)

的帮助下,我可以在 Python interactice window 中成功调用此函数: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 它给我这样的错误: 看起来 b"192.168.1.102" 在请求的 URL 中变成了 b%22192.168.1.102%22。为什么会这样?我怎样才能使用右边的URL来调用这个函数呢?

感谢您的关注。

编辑:

感谢@Paula Thomas 的回答,我想我朝着 answer.I 迈出了一步 更改代码如下,将第一个和第二个输入参数转换为字节:

@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 错误。有人可以帮忙吗?

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