requests.post 从 python 脚本到我使用 Apache 托管的 Django 网站提供 403 Forbidden

requests.post from python script to my Django website hosted using Apache giving 403 Forbidden

我的 Django 网站是使用 Apache 服务器托管的。我想在我的电脑上使用 python 脚本使用 requests.post 将数据发送到我的网站,但它给出了 403 forbidden.

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 目录的权限。 我已经经历了许多其他答案,但他们没有帮助。 我也尝试过没有 json.dumps 的代码,但它也无法使用。 如何解决?

经过调查,您需要 post 才能登录的 URL 似乎是:http://54.161.205.225/Project/accounts/login/?next=/Project/

您可以通过查看 Chrome DevTools 的“网络”选项卡来确定需要在 post 请求中发送的内容。这告诉我们您需要发送需要从页面中提取的字段 usernamepasswordcsrfmiddlewaretoken

从第一个get请求的响应中提取即可。它存储在页面上是这样的:

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

因此您需要执行某种正则表达式才能获得它。你会解决的。

所以首先你必须创建一个 session。然后使用 get 请求加载登录页面。然后将带有您的登录凭据的 post 请求发送到相同的 URL。然后您的会话将获得所需的 cookie,然后允许您 post 到您想要的 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 Requests and persistent sessions

我遇到过很多次这种情况 问题是:

  1. 54.161.205.225 未添加到 settings.py
  2. 中允许的主机
  3. apache wsgi 配置不正确

可能有助于调试的东西:

检查 apache 错误日志以调查问题所在
在本地尝试 运行 服务器并 post 以确保概率与 apache 无关