Python请求会话不适用于下一次调用中的put/post

Python请求会话不适用于下一次调用中的put/post,python,python-2.7,python-requests,Python,Python 2.7,Python Requests,您好,我正在尝试访问一个rest api,只有在登录后才能访问。我正在使用下面的代码,但得到401,访问被拒绝。我确信,若相同的cookies将应用于下一次put呼叫,则不会拒绝访问。但是python会话没有使用相同的cookie。。而是添加新的cookies..谢谢 with requests.Session() as s: logging.info("Trying to login") response1 = s.post("https://localhost:8080/ap

您好,我正在尝试访问一个rest api,只有在登录后才能访问。我正在使用下面的代码,但得到401,访问被拒绝。我确信,若相同的cookies将应用于下一次put呼叫,则不会拒绝访问。但是python会话没有使用相同的cookie。。而是添加新的cookies..谢谢

with requests.Session() as s:
    logging.info("Trying to login")
    response1 = s.post("https://localhost:8080/api/authentication?j_username=admin&j_password=admin", verify=False)

    for cookie in s.cookies:
        logging.info(str(cookie.name) + " : " + str(cookie.value))
    logging.info("logged in successfully " + str(response1.status_code))
    url = url1 % (params['key'])
    logging.info("inspector profile inpect api : " + url)
    response = s.put(url, verify=False)
    for cookie in s.cookies:
        logging.info(str(cookie.name) + " :: " + str(cookie.value))
    logging.info("code:-->"+ str(response.status_code))
输出为

CSRF-TOKEN : c3ea875b-3df9-4bd4-992e-2b976c150ea6 
JSESSIONID : M3WWdp0PO95ENQSJciqiEbiHZR6ge7O8HkKDkY6R 
logged in successfully 200 
profile api : localhost:8080/api/test/283 
CSRF-TOKEN :--> e5b64a66-5402-430b-8f51-d8d7549fd84e 
JSESSIONID :--> JUZBHKmqsitvlrPvWuaqfTJNH1PIJcEXPTkPYPKk 
CSRF-TOKEN :--> c3ea875b-3df9-4bd4-992e-2b976c150ea6 
JSESSIONID :--> M3WWdp0PO95ENQSJciqiEbiHZR6ge7O8HkKDkY6R
code:401

看起来下一个api调用没有使用cookies,请帮助我解决问题。

此代码对我有效:

from requests import Session
s = Session()
s.auth = ('username', 'password')
s.get('http://host'+'/login/page/')
response = s.get('http://host'+'/login-required-pages/')

这个代码对我有用:

from requests import Session
s = Session()
s.auth = ('username', 'password')
s.get('http://host'+'/login/page/')
response = s.get('http://host'+'/login-required-pages/')

尽管您拥有
CSRF-TOKEN
JSESSIONID
cookies,但您实际上没有成功地对网站进行身份验证。会话数据(包括您是否经过身份验证)存储在服务器端,而您获得的那些cookie只是这些会话数据的密钥

我在验证方式中看到的一个问题是,您将用户名和密码作为查询字符串发布,这通常仅用于GET请求

请尝试使用适当的有效负载进行过帐:

response1 = s.post("https://localhost:8080/api/authentication", data={'j_username': 'admin', 'j_password': 'admin'}, verify=False)

尽管您拥有
CSRF-TOKEN
JSESSIONID
cookies,但您实际上没有成功地对网站进行身份验证。会话数据(包括您是否经过身份验证)存储在服务器端,而您获得的那些cookie只是这些会话数据的密钥

我在验证方式中看到的一个问题是,您将用户名和密码作为查询字符串发布,这通常仅用于GET请求

请尝试使用适当的有效负载进行过帐:

response1 = s.post("https://localhost:8080/api/authentication", data={'j_username': 'admin', 'j_password': 'admin'}, verify=False)

刚刚完成了同一问题的调试

通过RFC 2965:

术语有效主机名与主机名相关如果主机名为 不包含点,有效主机名是带有 string.local附加到它。否则有效主机名为 与主机名相同。请注意,所有有效的主机名 至少包含一个点

Python请求模块使用http.cookiejar模块来处理cookie。它在将收到的cookie应用到会话之前验证这些cookie

使用以下代码获取调试输出:

import logging
import http.cookiejar

logging.basicConfig(level=logging.DEBUG)
http.cookiejar.debug = True
以下是一个示例,当未应用收到的cookie时:

发送到
localhost
的请求,期望web服务器将cookie的域部分设置为
localhost.local

下面是一个示例,当正确应用收到的cookie时:


刚刚完成了同一问题的调试

通过RFC 2965:

术语有效主机名与主机名相关如果主机名为 不包含点,有效主机名是带有 string.local附加到它。否则有效主机名为 与主机名相同。请注意,所有有效的主机名 至少包含一个点

Python请求模块使用http.cookiejar模块来处理cookie。它在将收到的cookie应用到会话之前验证这些cookie

使用以下代码获取调试输出:

import logging
import http.cookiejar

logging.basicConfig(level=logging.DEBUG)
http.cookiejar.debug = True
以下是一个示例,当未应用收到的cookie时:

发送到
localhost
的请求,期望web服务器将cookie的域部分设置为
localhost.local

下面是一个示例,当正确应用收到的cookie时:


您使用的是什么版本的
请求
?早期版本没有cookie持久性,因此您是否尝试手动为其提供PUT,即
s.PUT(url,cookies=s.cookies,verify=False)
?最后,您如何确定Python发送了错误的cookie,而不是后端重建
CSRF-TOKEN
JSESSIONID
-Python本身不会生成这些值,因此它们肯定来自后端。您使用的是什么版本的
请求
?早期版本没有cookie持久性,因此您是否尝试手动为其提供PUT,即
s.PUT(url,cookies=s.cookies,verify=False)
?最后,您如何确定Python发送了错误的cookie,而不是后端重建
CSRF-TOKEN
JSESSIONID
-Python本身不会生成这些值,因此它们肯定来自后端。我还可以在登录后调用get request。。。但不放method@SunnyGupta后端的输出是什么?如果合适的话,把你的代码推到github并共享repo。我也可以在登录后调用get请求。。。但不放method@SunnyGupta后端的输出是什么?如果合适,将代码推送到github并共享回购协议。