0

我正在制作一个与 Jasper 报表服务器通信的小脚本,但现在我需要用 Python 阅读它。

这是我的 Ruby 脚本的一个片段:

def get_uuid_and_cookie
    body = ""
    cookie = ""
    puts "FULL URL: #{"#{REPORT_PATH}/reports/#{REPORT_GROUP}/#{REPORT_NAME}"}"
    uri = URI.parse("#{REPORT_PATH}/reports/#{REPORT_GROUP}/#{REPORT_NAME}")
    http = Net::HTTP.new(uri_put.host, uri_put.port)
    http.start do |http|
        req = Net::HTTP::Put.new(uri_put.path + "?RUN_OUTPUT_FORMAT=#{FORMAT}")
        puts "ACESSANDO: #{uri_put.path}?RUN_OUTPUT_FORMAT=#{FORMAT}"
        req.basic_auth(SERVER_USER, SERVER_PASSWORD)
        req.body = build_xml_request
        resp = http.request(req)
        body = resp.body
        puts "COOKIE RECEBIDO: #{resp['Set-Cookie']}"       
        cookie = resp['Set-Cookie']
    end

这是我的 Python 脚本的一个片段

def get_uuid_and_cookie():
  handle = None
  req = urllib2.Request(REPORT_URI+"reports/"+REPORT_GROUP+"/"+REPORT_NAME+"/")
  base64string = base64.encodestring('%s:%s' % (SERVER_USER, SERVER_PASSWORD))[:-1]
  authheader =  "Basic %s" % base64string
  req.add_header("Authorization", authheader)
  req.get_method = lambda: 'PUT'
  req.data = build_xml_request()
  try:
      handle = urllib2.urlopen(req)
  except IOError, e:
      print "ERROR: "+str(e)

在 Ruby 脚本中,a 可以获得这样的 COOKIE:

cookie = resp['Set-Cookie']

我怎样才能在 Python 中做到这一点?

4

2 回答 2

1

伟大的!我为我的问题应试者处理程序结果找到了一个简单的答案

第一的

    print str(handle.__dict__)
     {
'fp': <socket._fileobject object at 0x7f0b44d534d0>, 
'fileno': <bound method _fileobject.fileno of <socket._fileobject object at 0x7f0b44d534d0>>, 
'code': 201, 
'read': <bound method _fileobject.read of <socket._fileobject object at 0x7f0b44d534d0>>,
'readlines': <bound method _fileobject.readlines of <socket._fileobject object at 0x7f0b44d534d0>>, 
'next': <bound method _fileobject.next of <socket._fileobject object at 0x7f0b44d534d0>>, 
'headers': <httplib.HTTPMessage instance at 0x7f0b44d6bef0>, 
'__iter__': <bound method _fileobject.__iter__ of <socket._fileobject object at 0x7f0b44d534d0>>, 
'url': 'http://127.0.0.1:8080/jasperserver/rest/report/reports/Athenas/protocolo/', 'msg': 'Created', 
'readline': <bound method _fileobject.readline of <socket._fileobject object at 0x7f0b44d534d0>>
}

在观察了httplib.HTTPMessage类型的变量之后, 我发现我可以得到 Set-Cookie。

print handle.headers
Server: Apache-Coyote/1.1
Pragma: No-cache
Cache-Control: no-cache
Expires: Wed, 31 Dec 1969 16:00:00 PST
P3P: CP="ALL"
Set-Cookie: JSESSIONID=92826DC36E6DB54164C47744FE1605CB; Path=/jasperserver
Content-Type: text/xml;charset=UTF-8
Content-Length: 256
Date: Wed, 06 Mar 2013 13:19:26 GMT
Connection: close

所以只需要这样做:

cookie =  handle.headers["Set-Cookie"]

:D

于 2013-03-06T13:31:35.080 回答
0

这应该工作

import urllib2
from cookielib import CookieJar
cj = CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
response = opener.open(my_url)
    if  response.getcode() == 200:
        print 'now cj is the cookie'
        for c in cj:
            print c.name
于 2013-03-06T13:31:15.870 回答