首页 > 解决方案 > 从单独的 requests.post python 脚本中填写 Django 表单

问题描述

在阅读 Requests 库时,我突然想到我可以尝试使用它来填写表格。所以,由于我有 Django 和服务器,我首先检查了我的 URL 是否正确并得到了 200 答案代码。

像这样:

import requests
r = requests.get('127.0.0.1/myform')
print(r.status_code)

是的,这是200

所以下一步是在文本字段中输入一个值,实际上是表单,因为这个例子只是一个字段。

我试过这个:

r = requests.post('127.0.0.1/myform', data ={'name' : 'Mexico'})

什么都没有输入。在这里,我有 3 个有趣的问题:

  1. 当我检查元素时,因为表单是使用 Django 的 ModelForm 创建的,所以我实际上无法为该字段命名(本来应该是名称)和 2。Django 反而用 csrf 令牌值和 3 填充我的名称. 实际上,我看不到 requests.post 是如何按下提交按钮的。

为了成功通过表单发布值,这里缺少什么?

谢谢你

标签: pythondjango

解决方案


在 Django Web 应用程序中,在执行时前端和后端是分开的,并通过 http/https 请求和响应进行通信。前端向用户显示元素,收集输入等,但是为了与后端通信,它从该数据构建一个 POST 请求,并在用户单击提交时发送它。表单本身不会被发送,只是与表单的字段和每个字段中的用户输入相对应的键值对的集合。在后端,数据被传递给表单,以便它可以验证/保存/等。

所以回答你的问题:

1)我不完全确定你在问什么,但重要的是 post 有效负载有一个与相应 Django 表单中的字段名称匹配的键。

2) CSRF 令牌是一种安全措施,您必须在requests.post通话中手动说明这一点。从禁用它们开始可能会更容易,直到您的帖子正常工作,然后努力让它们正常工作。

3)requests.post实际上并没有按下提交按钮,您只是在重新创建用户按下提交按钮时由浏览器生成的相同 http 请求。这有意义吗?这是理解的关键点。

最后,为了帮助您找到可行的解决方案,我们需要了解更多。你的表格是什么样的?你的观点是什么样的?


推荐阅读