Как сделать так, чтобы мой вызов функции оставался в контексте? - PullRequest
0 голосов
/ 21 мая 2019

У меня есть класс, который пытается вызвать RPC с сервера, используя метод name_me, определенный на сервере. Он отлично работает, если я позвоню в iPython, используя:

jsonrpcclient.request ('http://localhost:5000', 'name_me', N=6).data.result

но когда я пытаюсь построить его с моим классом, я получаю ошибку:

RuntimeError: Working outside of request context.

Обычно это означает, что вы пытались использовать функциональность, которая требовалась активный HTTP-запрос. Обратитесь к документации по тестированию для информация о том, как избежать этой проблемы.

Я положу код клиента в разделе кода.

class LyricCaller:

    def __update_host_port (self, new_port):
        self.__port = new_port

    def __update_host_address (self, new_address):
        self.__address = new_address

    def __target (self):
        return '{}:{}'.format (self.__address, self.__port)

    def __init__(self, host_address = 'http://localhost:5000', host_port = 5000):
        self.lyric = []
        self.__Lyr_fn = 'name_me'
        self.__update_host_address (host_address)
        self.__update_host_port (host_port)

    def __parse_choice (self, choice):
        return abs (choice)


    def sing(self):
        print (self.lyric)

    def fetch_lyric (self, choice):
        C = self.__parse_choice (choice)
        K = request (self.__target(), self.Lyr_fn, N=1)

Я ожидаю возвращенную строку, которая работает, когда я просто вызываю jsonrpcclient.request ('http://localhost:5000',' name_me ', N = 6) .data.result,

но вместо этого я все еще получаю ошибку контекста. Я попытался перезагрузить сервер, но все равно происходит то же самое.

для дальнейшего использования, вот код сервера:

'' '

from flask import Flask, request, Response
from jsonrpcserver import method, dispatch

LServer = Flask(__name__)

@method
def name_me (N = 1):
    K = ['How do we sleep while our beds are burning?',
         'You label me, I label you, and so I dub thee Unforgiven', 
         'Carry on my wayward son!',
         'Not dead which eternal lie, stranger aeons death may die',
         'Let the bodies hit the floor', 
         'Wollt ihr das bed in flammen siehen']

    #N = 4
    if N <= len (K):
        O = K[N-1] 
    else:
        import random
        n = random.randint (0, len(K)-1)
        O = K[n]

    return O

@LServer.route ('/', methods = ['POST'])
def index():
    #with LServer.test_request_context():
        req = request.get_data().decode()
        response = dispatch(req)
        return Response (str(response), response.http_status, mimetype="application/json")

if __name__ == '__main__':
    LServer.run()

'' '

1 Ответ

0 голосов
/ 21 мая 2019

Документация Flask гласит: Если вы видите эту ошибку где-то еще в вашем коде, не связанном с тестированием, это, скорее всего, означает, что вы должны переместить этот код в функцию представления.

Таким образом, ваш код будет похож на это:

from flask.views import View

# ...

class Index(View):

    def dispatch_request(self):
        req = request.get_data().decode()
        response = dispatch(req)
        return Response (str(response), response.http_status, mimetype="application/json")


LServer.add_url_rule('/', 'index', view_func=Index.as_view('index'),methods=['POST'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...