Не удается выполнить POST-запрос из представления Django

#python #django #python-requests

#python #django #python-запросы

Вопрос:

TL; DR: У меня есть POST-запрос (из модуля запросов), который работает вне представления Django, но вызывает исключение типа ‘OpenSSL.SSL.Error’ внутри представления. Может кто-нибудь, пожалуйста, сказать мне, как это исправить?

Проблема:

Я использую Django 1.7.11, запросы 2.14.2 и Python 2.7.14 для размещения веб-приложения в Linux на AWS.

Структура каталогов веб-приложения настроена следующим образом:

 myproject
|___myapp
|  |
|  |___templates
|  |   |
|  |   |___mytemplate.html
|  |
|  |___views.py
|  |___urls.py
|
|___post_request.py
  

У меня есть функция в views.py который вызывается непосредственно по ссылке в шаблоне Django, mytemplate.html. Ссылка в шаблоне не является частью формы и указывается следующим образом:

 <li><a href="{% url 'myapp:myview' %}">The Link to My View</a></li>
  

Соответствующая запись в myapp/urls.py является:

 url(r"^myview/$", the_view_function, name="myview")
  

Моя функция внутри myapp/views.py выглядит так:

 def the_view_function(request):
    if request.user.is_authenticated():
        context = {}
        data = {}
        headers = {}
        headers['Authorization'] = 'Token aaaaabbbbbcccc'
        the_url = "https://www.example.com/rest/endpoint/"

        logger.info("view function called")

        if 'variable_1' in request.session:
            variable_1 = request.session['variable_1']
            logger.info("Variable 1 is set")
        else:
            variable_1 = 0
            logger.info("Variable 1 is zero")

        if 'variable_2' in request.session:
            variable_2 = request.session['variable_2']
        else:
            variable_2 = -1

        if variable_1 == 0:
            logger.info("First time")
            data['first_name'] = 'firstname'
            data['last_name'] = 'lastname'
            data['email'] = 'user@not.valid.email.com'
            data['role'] = "User"

            the_response = requests.post(the_url, headers=headers, data=data, verify=False)
  

Следующая строка завершается ошибкой:

 the_response = requests.post(the_url, headers=headers, data=data, verify=False)
  

Когда я нажимаю «Ссылка на мое представление» со страницы в моем веб-браузере, запрос вызывает исключение типа «OpenSSL.SSL.Error».

Однако:

У меня есть следующий код в post_request.py файл:

 import requests

the_url = "https://www.example.com/rest/endpoint/"
headers = {'Authorization': 'Token aaaaabbbbbcccc'}
post_data = dict()
post_data['first_name'] = 'firstname'
post_data['last_name'] = 'lastname'
post_data['email'] = 'user@not.valid.email.com'
post_data['role'] = "User"

the_response = requests.post(the_url, headers=headers, data=post_data, verify=False)
print(the_response.status_code)
  

Когда я запускаю этот код из каталога myproject с помощью:

 python post_request.py
  

Я получаю 201 ответ, который я должен получать из представления.

Может кто-нибудь, пожалуйста, объяснить, почему POST-запрос работает, когда он не выполняется как часть представления Django, но не выполняется изнутри представления? И как мне это исправить?

Комментарии:

1. На самом деле вы не предоставили здесь достаточно информации. Где остальная часть этого представления? Что такое the_url ? Указывает ли он на внешний сайт или обратно на тот же сайт Django?

2. @DanielRoseman URL указывает на внешний сайт; это конечная точка REST из API, который мы используем в других проектах много раз в день. Добавление функции из представления.