Вызов функции по URL в Flask - PullRequest
0 голосов
/ 17 мая 2018

У меня есть 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)

С помощью этого вопроса я могу успешно вызвать эту функцию в интерактивном окне Python, используя следующее: 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. Почему это происходит? Как я могу использовать правильный URL для вызова этой функции?

Спасибо за внимание.

Edit:

Благодаря ответу @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 ошибку. Кто-нибудь, пожалуйста, помогите?

1 Ответ

0 голосов
/ 17 мая 2018

Я думаю, вы обнаружите, что Flask передает вам строки (типа str), тогда как ваша функция C или C ++ ожидает байты (отсюда «b» перед двумя параметрами) для первых двух параметров и int дляв третьих.Это ваша обязанность конвертировать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...