request.post из скрипта python на мой Django веб-сайт, размещенный с использованием Apache, что дает 403 Forbidden - PullRequest
0 голосов
/ 13 апреля 2020

Мой Django веб-сайт размещен на сервере Apache. Я хочу отправить данные, используя request.post, на мой веб-сайт с помощью скрипта python на моем p c, но он запрещает 403.

import json


url = "http://54.161.205.225/Project/devicecapture"
headers = {'User-Agent':
           'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
           'content-type': 'application/json'}


data = {
    "nb_imsi":"test API",
    "tmsi1":"test", 
    "tmsi2":"test",
    "imsi":"test API", 
    "country":"USA", 
    "brand":"Vodafone", 
    "operator":"test",
    "mcc":"aa", 
    "mnc":"jhj",
    "lac":"hfhf", 
    "cellIid":"test cell"
}
response = requests.post(url, data =json.dumps(data),headers=headers) 

print(response.status_code)

Я также дал разрешение на каталог, содержащий views.py, где этот запрос будет go. Я прошел через много других ответов, но они не помогли. Я пробовал код без json .dumps , но он также не работает с этим. Как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Я сталкивался с такой ситуацией много раз. Проблемы были:

  1. 54.161.205.225 не добавлено к разрешенным хостам в settings.py
  2. wsgi apache неправильно настроен

вещи могут помочь с отладкой:

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

0 голосов
/ 13 апреля 2020

После исследования выглядит, что URL, который вам нужно опубликовать для входа в систему: http://54.161.205.225/Project/accounts/login/?next= / Project /

Вы можете решить, что вам нужно отправить в запрос на публикацию с помощью вкладки Chrome DevTools, Network. Это говорит нам о том, что вам нужно отправить поля username, password и csrfmiddlewaretoken, которые вам нужно извлечь со страницы.

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

<input type="hidden" name="csrfmiddlewaretoken" value="OspZfYQscPMHXZ3inZ5Yy5HUPt52LTiARwVuAxpD6r4xbgyVu4wYbfpgYMxDgHta">

Так что вам понадобится какое-то регулярное выражение, чтобы получить его. Вы решите это.

enter image description here

Итак, сначала вы должны создать session. Затем загрузите страницу входа с запросом get. Затем отправьте запрос с вашими учетными данными на тот же URL. И тогда ваша сессия получит необходимые куки, которые затем позволят вам публиковать на желаемый URL. Это пример ниже.

import requests

# Create session
session = requests.session()

# Add user-agent string
session.headers.update({'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) ' +
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'})

# Get login page
response = session.get('http://54.161.205.225/Project/accounts/login/?next=/Project/')

# Get csrf
# Do something to response.text

# Post to login
response = session.post('http://54.161.205.225/Project/accounts/login/?next=/Project/', data={
    'username': 'example123',
    'password': 'examplexamplexample',
    'csrfmiddlewaretoken': 'something123123',
})

# Post desired data
response = session.post('http://url.url/other_page', data={
    'data': 'something',
})

print(response.status_code)

Надеюсь, это поможет вам. Удачи.

Для получения дополнительной информации проверьте этот вопрос по запросам: Python Запросы и постоянные сеансы

...