【问题标题】:How to post a file via HTTP with cookies using python poster lib如何使用 python 海报库通过 HTTP 发布带有 cookie 的文件
【发布时间】:2010-12-14 00:14:42
【问题描述】:

使用 Chris Atlee 的 python poster library 有没有办法包含 cookie 处理? 我有 python http 登录代码,它适用于 cookie:

cookiejar = cookielib.CookieJar()
urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
request = urllib2.Request(login_url, params)
result = urlOpener.open(request)

但是当我需要上传文件时,我不知道如何同时使用海报库代码和 cookie 处理代码。海报库似乎需要调用 urllib2.urlopen() 而不是一些自定义 url 打开器,就像上面的代码一样。

例如,我不知道如何将 cookie 与下面的 python 文件发布代码一起使用:

register_openers()
params = {'file': open("test.txt", "rb"), 'name': 'upload test'}
datagen, headers = multipart_encode(params)
request = urllib2.Request(upload_url, datagen, headers)
result = urllib2.urlopen(request)

【问题讨论】:

    标签: python http cookies file-upload


    【解决方案1】:

    我向 Chris AtLee 发送了一封电子邮件,询问我们是否可以获得基本身份验证示例。他很乐意回答我的问题,甚至运行了我发给他的一些示例代码。

    要包含 cookie 处理,您可以执行以下操作:

    opener = poster.streaminghttp.register_openers()
    opener.add_handler(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) # Add cookie handler
    params = {'file': open("test.txt", "rb"), 'name': 'upload test'}
    datagen, headers = poster.encode.multipart_encode(params)
    request = urllib2.Request(upload_url, datagen, headers)
    result = urllib2.urlopen(request)
    

    要为请求添加基本身份验证,您只需执行以下操作(为了完整性,我添加了 base64 编码行):

    opener = poster.streaminghttp.register_openers()
    params = {'file': open("test.txt", "rb"), 'name': 'upload test'}
    datagen, headers = poster.encode.multipart_encode(params)
    request = urllib2.Request(upload_url, datagen, headers)
    auth = base64.encodestring('%s:%s' % ('username', 'password'))[:-1] # This is just standard un/pw encoding  
    request.add_header('Authorization', 'Basic %s' % auth ) # Add Auth header to request
    result = urllib2.urlopen(request)
    

    希望这会有所帮助。还要感谢 Chris AtLee。

    【讨论】:

    • 别忘了关闭test.txt文件?
    【解决方案2】:

    您不必修改原始源代码,只需手动安装所有必需的开启器(无需调用 register_openers()):

    import urllib2
    import cookielib
    import poster
    
    handlers = [poster.streaminghttp.StreamingHTTPHandler(),
                poster.streaminghttp.StreamingHTTPRedirectHandler(),
                urllib2.HTTPCookieProcessor(cookielib.CookieJar())]
    
    urllib2.install_opener(urllib2.build_opener(*handlers))
    
    
    datagen, headers = poster.encode.multipart_encode({"image1": open("DSC0001.jpg", "rb")})
    
    request = urllib2.Request("http://localhost:5000/upload_image", datagen, headers)
    
    print urllib2.urlopen(request).read()
    

    【讨论】:

      【解决方案3】:

      你试过了吗:

      cookiejar = cookielib.CookieJar()
      urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
      register_openers()
      params = {'file': open("test.txt", "rb"), 'name': 'upload test'}
      datagen, headers = multipart_encode(params)
      request = urllib2.Request(upload_url, datagen, headers)
      result = urlOpener.open(request)
      

      【讨论】:

      【解决方案4】:

      我已经想出了如何做到这一点。我不确定这是否是处理事情的最佳方式,但它有效,所以我会分享它。为了使用带有 cookie 的海报库,必须将 urllib2.HTTPCookieProcessor 添加到内置于 poster.streaminghttp.register_openers() 的开瓶器中。

      基本上,修改poster.streaminghttp.register_openers() 使其看起来像下面的代码,如果您想要处理cookie,请传入cookiejar 对象。

      def register_openers(cookiejar=None):
          """Register the streaming http handlers in the global urllib2 default
          opener object.
      
          Returns the created OpenerDirector object."""
          handlers = [StreamingHTTPHandler, StreamingHTTPRedirectHandler]
          if hasattr(httplib, "HTTPS"):
              handlers.append(StreamingHTTPSHandler)
      
          if cookiejar:
              opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar), *handlers)
          else:
              opener = urllib2.build_opener(*handlers)
      
      
          urllib2.install_opener(opener)
      
          return opener
      

      示例用法:

      # Logging in
      import urllib, urllib2, cookielib
      
      from poster.encode import multipart_encode
      from poster.streaminghttp import register_openers
      
      cookiejar = cookielib.CookieJar()
      loginOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
      
      params = urllib.urlencode({'username':'admin', 'password':'default'})
      login_url = "http://127.0.0.1:8000/account/login/"
      request = urllib2.Request(login_url, params)
      login = loginOpener.open(request)
      
      # Upload File
      # use the login cookie for file upload
      register_openers(cookiejar=cookiejar)
      
      params = {'entity_file': open("test.txt", "rb"),'name': 'test', 'action':'upload'}
      upload_url = "http://127.0.0.1:8000/upload/"
      
      datagen, headers = multipart_encode(params)
      
      request = urllib2.Request(upload_url, datagen, headers)
      result = urllib2.urlopen(request)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-17
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多