从python脚本到使用Apache403托管的Django网站的requests.post

2024-10-06 12:44:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我的Django网站是使用Apache服务器托管的。我想使用requests.post在我的电脑上使用python脚本发送数据到我的网站,但它给出了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的目录授予了权限,该请求将进入该目录。 我已经看过很多其他的答案,但都没有帮助。 我也尝试过不使用json.dumps的代码,但它也无法使用。 如何解决这个问题


Tags: djangotest目录apijsonurldata网站
2条回答

调查之后,您需要发布到的URL似乎是:http://54.161.205.225/Project/accounts/login/?next=/Project/

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

您可以通过从第一个get请求的响应中提取它来获得它。它存储在页面上,如下所示:

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

所以你需要做一些正则表达式来得到它。你会解决的

enter image description here

所以首先你必须创建一个session。然后加载带有get请求的登录页面。然后将带有登录凭据的post请求发送到同一URL。然后您的会话将获得所需的cookies,从而允许您发布到所需的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. apache wsgi配置不正确

以下内容可能有助于调试:

检查apache错误日志以调查出了什么问题
尝试在本地运行服务器并发送到它,以确保prob与apache无关

相关问题 更多 >