gpt4 book ai didi

django 和 python requests - 在 post 请求上获取 403

转载 作者:行者123 更新时间:2023-12-01 19:37:12 25 4
gpt4 key购买 nike

我正在使用 requests 登录我的 Django 站点进行测试(是的,我知道 Django TestClient,但我在这里需要纯 http)。我可以登录,只要我获取请求,一切就OK。

当我尝试使用 post 代替时,我从 csrf 中间件收到 403。在我看来,我现在已经通过使用 @crsf_exempt 解决了这个问题,但更喜欢长期的解决方案。

这是我的代码:

with requests.Session() as ses:

try:

data = {
'username': self.username,
'password': self.password,
}

ses.get(login_url)
try:
csrftoken = ses.cookies["csrftoken"]
except Exception, e:
raise
data.update(csrfmiddlewaretoken=csrftoken)

_login_response = ses.post(login_url, data=data)

logger.info("ses.cookies:%s" % (ses.cookies))

assert 200 <= _login_response.status_code < 300, "_login_response.status_code:%s" % (_login_response.status_code)

response = ses.post(
full_url,
data=data,
)

return self._process_response(response)

登录工作正常,我可以在此处看到 csrf token 。

 INFO:tests.helper_fetch:ses.cookies:<RequestsCookieJar[<Cookie csrftoken=TmM97gnNHs4YCgQPzfNztrAWY3KcysAg for localhost.local/>, <Cookie sessionid=kj6wfmta

但是,中间件将 cookie 视为空。

INFO:django.middleware.csrf:request.COOKIES:{}

我已向其中添加了日志记录代码:

def process_view(self, request, callback, callback_args, callback_kwargs):

if getattr(request, 'csrf_processing_done', False):
return None

try:
csrf_token = _sanitize_token(
request.COOKIES[settings.CSRF_COOKIE_NAME])
# Use same token next time
request.META['CSRF_COOKIE'] = csrf_token
except KeyError:
# import pdb
# pdb.set_trace()
import logging
logger = logging.getLogger(__name__)
logger.info("request.COOKIES:%s" % (request.COOKIES))

我调用 request 的 session.post 的方式是否遗漏了一些东西?我尝试添加cookie,但没有什么区别。但我完全明白为什么 crsf 中间件会出问题。我以为 cookies 是 session 的一部分,那么为什么我的第二篇文章中缺少它们呢?

            response = ses.post(
self.res.full_url,
data=data,
cookies=ses.cookies,
)

此变体的灵感来自How to send cookies in a post request with the Python Requests library? ,也没有导致任何内容被传递给 csrf 中间件:

            response = ses.post(
self.res.full_url,
data=data,
cookies=dict(csrftoken=csrftoken),
)

最佳答案

对于登录后的后续请求,请尝试将其作为 header X-CSRFToken 提供。

以下内容对我有用:

with requests.Session() as sesssion:
response = session.get(login_url)
response.raise_for_status() # raises HTTPError if: 400 <= status_code < 600

csrf = session.cookies['csrftoken']
data = {
'username': self.username,
'password': self.password,
'csrfmiddlewaretoken': csrf
}


response = session.post(login_url, data=data)
response.raise_for_status()

headers = {'X-CSRFToken': csrf, 'Referer': url}
response = session.post('another_url', data={}, headers=headers)
response.raise_for_status()

return response # At this point we probably made it

文档引用:https://docs.djangoproject.com/en/dev/ref/csrf/#csrf-ajax

关于django 和 python requests - 在 post 请求上获取 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36365621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com