Отправьте запрос с представлением Django, используя Python -Запросы - PullRequest
2 голосов
/ 11 января 2020

Я пытаюсь создать простую структуру микросервиса в моем проекте Django: поэтому при вызове определенного представления Django это представление будет отправлять запрос JSON post в микросервис Flask, содержащий пользователя данные; микросервис Flask должен получить запрос, принять данные этого пользователя и отправить обратно в Django некоторые дополнительные данные, снова используя запросы, чтобы мое представление Django могло получать эти данные и выполнять некоторые операции, например показывать их user.

Сейчас я просто отправляю несколько фиктивных данных, чтобы проверить, работает ли вся эта система (Django> запрос к Flask> Flask> Запрос к Django), но я У меня возникли некоторые проблемы.

Чтобы отладить мой код, я пытаюсь просто напечатать полученные данные. Вот мое представление:

def myView(request):

    mydict = {}

    # The request is sent to my external Python script..
    req = requests.post('http://127.0.0.1:5000/', json={"one": 1}) # Some dummy data

    # .. Once the external script sends back a request with data, this should handle it
    if request.method == 'POST':

        # The data is inside this variable
        data = request.POST

        for key in data.items():
            if float(key[1]) > 0:
                mydict.update({key[0]: key[1]})

        print(mydict) #FIRST PRINT STATEMENT

    print(mydict) #SECOND PRINT STATEMENT
    response = HttpResponse(get_token(request))
    return JsonResponse(mydict) #RETURNS "{}"

А вот как мое приложение Flask отправляет данные (как только оно получает запрос POST из представления Django), используя библиотеку Python -Requests:

@app.route("/", methods=["GET","POST"])
def test():
    # After the request from the VIEW is received, a request containing some random json data
    # is sent to Django
    url = 'http://127.0.0.1:8000/myView/'
    client = requests.session()

    # We need to get the CSRF token, in order for the request to be taken by Django
    csrftoken = requests.get(url).cookies['csrftoken']
    data = {"two": 2}

    header = {'X-CSRFToken': csrftoken}
    cookies = {'csrftoken': csrftoken}
    resp = requests.post(url, data=data, headers=header, cookies=cookies)
    # Let's seend the request to Django

    return f"Test!"

Вот что не так с моим кодом:

METHOD:  POST
{'two': 2}
[10/Jan/2020 10:41:37] "POST /myView/ HTTP/1.1" 200 320
{}
[10/Jan/2020 10:41:37] "GET /myView/ HTTP/1.1" 200 2

Вот что не так: почему первый оператор print возвращает правильные данные, а второй - нет? И почему return JsonResponse возвращает пустой словарь?

Я попытался добавить print('METHOD: ', request.method) в первые строки представления, вот что произошло:

METHOD:  GET
METHOD:  GET
[10/Jan/2020 10:46:22] "GET /myView/ HTTP/1.1" 200 2
METHOD:  POST
[10/Jan/2020 10:46:26] "POST /myView/ HTTP/1.1" 200 320
[10/Jan/2020 10:46:26] "GET /myView/ HTTP/1.1" 200 2

1 Ответ

1 голос
/ 11 января 2020

Представление flask можно упростить, чтобы просто вернуть необходимые данные

@app.route("/", methods=["GET","POST"])
def test():
    return {"two": 2}

Затем вы можете использовать данные в представлении Django после того, как сделали запрос на flask

response = requests.post('http://127.0.0.1:5000/', json={"one": 1})
print(response.json()) # This should contain the returned data
...