在Flask中通过URL调用函数

时间:2018-05-17 08:39:45

标签: python url flask dll ctypes

我有一个C ++ DLL。我想创建一个 Flask 服务器来调用此DLL中的函数。所以我在ctypes内使用Flask。这是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 interactice窗口中成功调用此函数:InitNetwork(b"192.168.1.101",b"192.168.1.101",555)enter image description here但是,当我运行Flask项目并输入此路线时:http://192.168.1.102:8081/InitNetwork/b"192.168.1.102"/b"22192.168.1.102"/555它给出了如下错误: enter image description here 似乎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错误。有人请帮忙吗?

1 个答案:

答案 0 :(得分:0)

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