【发布时间】: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/555 和 http://172.16.4.218:8081/InitNetwork/"172.16.4.218"/"172.16.4.218"/555 都不起作用。仍然给我wrong type 错误。有人可以帮忙吗?
【问题讨论】:
标签: python url flask dll ctypes