zoukankan      html  css  js  c++  java
  • python HTTP服务端使用BaseHTTPServer、客户端urllib2.Request

    服务端,继承HTTPServer,BaseHTTPRequestHandler

    处理post请求数据,交给后端,并发送响应信息。

    参考:

    https://blog.csdn.net/zhuyu_deng/article/details/38223207

    https://www.cnblogs.com/findumars/p/6375541.html

    #!/usr/bin/env python
     
    """Simple HTTP Server With Upload.
    This module builds on BaseHTTPServer by implementing the standard GET
    and HEAD requests in a fairly straightforward manner.
    """
     
     
    __version__ = "0.1"
    __all__ = ["SimpleHTTPRequestHandler"]
    __author__ = "caitian"
    __home_page__ = "https://www.cnblogs.com/caitian"
     
    import os
    import posixpath
    import BaseHTTPServer
    from  BaseHTTPServer import HTTPServer,BaseHTTPRequestHandler
    import urllib
    import time
    import re
    import random
    import json
    from TitleHandler import TitleHandler 
    
    def tokenizer(iterator):
        TOKENIZER_RE = re.compile(r"[^s]+", re.UNICODE)
        for value in iterator:
            yield TOKENIZER_RE.findall(value)
    
    
    class MsParserServer(BaseHTTPServer.BaseHTTPRequestHandler):
     
        """Simple HTTP request handler with GET/HEAD/POST commands.
        This serves files from the current directory and any of its
        subdirectories.  The MIME type for files is determined by
        calling the .guess_type() method. And can reveive file uploaded
        by client.
        The GET/HEAD/POST requests are identical except that the HEAD
        request omits the actual contents of the file.
        """
     
        server_version = "SimpleHTTPWithUpload/" + __version__
         
     
        def do_POST(self):
            """Serve a POST request."""
            flag, path = self.deal_post_data()
            if flag:
                req_dic = {"req_type":"type_doc", 
                   "file_link": path}
                datas = json.dumps(req_dic)
                tt_obj = TitleHandler()
                req = tt_obj.titletree(datas)
            else:
                req = {"req": "failed"}
            self.send_response(200)
            self.send_header("Content-type","json")
            self.end_headers()
            self.wfile.write(json.dumps(req))
    
     
        def deal_post_data(self):
            boundary = self.headers.plisttext.split("=")[1]
            remainbytes = int(self.headers['content-length'])
            #print self.rfile.read(remainbytes)
            line = self.rfile.readline()
            print line
            remainbytes -= len(line)
            if not boundary in line:
                return (False, "Content NOT begin with boundary")
            line = self.rfile.readline()
            remainbytes -= len(line)
            print line
            fn = re.findall(r'Content-Disposition.*name="file"; filename="(.*)"', line)
            if not fn:
                return (False, "Can't find out file name...")
           
            path = self.translate_path(self.path)
            fn = os.path.join(path, fn[0])
            fn = fn.split('/')[:-1]
            path_cut = ""
            for item in fn:
                path_cut+=item+'/'
            fn = path_cut + "%d_%d.docx" % (int(time.time()), random.randint(1,10000))
            print fn
           
            line = self.rfile.readline()
            remainbytes -= len(line)
            line = self.rfile.readline()
            remainbytes -= len(line)
            try:
                out = open(fn, 'wb')
            except IOError:
                return (False, "Can't create file to write, do you have permission to write?")
                    
            preline = self.rfile.readline()
            remainbytes -= len(preline)
            while remainbytes > 0:
                line = self.rfile.readline()
                remainbytes -= len(line)
                if boundary in line:
                    preline = preline[0:-1]
                    if preline.endswith('
    '):
                        preline = preline[0:-1]
                    out.write(preline)
                    out.close()
                    return (True, fn)
                else:
                    out.write(preline)
                    preline = line
            return (False, None)
    
        def translate_path(self, path):
            """Translate a /-separated PATH to the local filename syntax.
            Components that mean special things to the local file system
            (e.g. drive or directory names) are ignored.  (XXX They should
            probably be diagnosed.)
            """
            # abandon query parameters
            path = path.split('?',1)[0]
            path = path.split('#',1)[0]
            path = posixpath.normpath(urllib.unquote(path))
            words = path.split('/')
            words = filter(None, words)
            path = os.getcwd()
            for word in words:
                drive, word = os.path.splitdrive(word)
                head, word = os.path.split(word)
                if word in (os.curdir, os.pardir): continue
                path = os.path.join(path, word)
            return path
    
    def test(port):
        http_server =HTTPServer(('', int(port)), MsParserServer)
        http_server.serve_forever()
     
    if __name__ == '__main__':
        test(8006)

    客户端post请求doc二进制数据,上传表单

    需要安装poster模块

    参考https://www.cnblogs.com/yu-zhang/p/3643528.html

    #!/bin/python
    #encoding=utf8
    
    import os
    import sys
    import json
    import logging
    import time
    import random
    import re
    from datetime import datetime
    import json,urllib2
    from poster.encode import multipart_encode
    from poster.streaminghttp import register_openers
    
    reload(sys)  
    sys.setdefaultencoding('utf8')
    
    path = "data/K0001-A.docx"
    url='http://192.168.2.42:8006'
    # 在 urllib2 上注册 http 流处理句柄
    register_openers()
    
    # "file" 是参数的名字,一般通过 HTML 中的 <input> 标签的 name 参数设置
    
    # headers 包含必须的 Content-Type 和 Content-Length
    # datagen 是一个生成器对象,返回编码过后的参数,这里如果有多个参数的话依次添加即可
    datagen, headers = multipart_encode({"file":open(path, "rb")})
    
    # 创建请求对象
    request = urllib2.Request(url, datagen, headers)
    # 实际执行请求并取得返回
    print urllib2.urlopen(request).read()
  • 相关阅读:
    atitit.无为而治在企业管理,国家治理,教育领域的具体思想与实践
    atitit.浏览器web gui操作类库 和 操作chrome浏览器的类库使用总结
    atitit.loading的设计与实现控件选型attilax 总结
    atitit.系统托盘图标的设计java swing c# .net c++ js
    atitit.流程标准化 mysql启动不起来的排查流程attilax总结
    atitit.图片相似度与图片查找的设计 获取图片指纹
    atitit.it企业管理 项目管理 中的 授权机制 的来源 君权神授 的一定合理性
    atitit..国富论 在现代it企业项目管理中的作用attialx 总结国富论读后感 attialx
    atitit.印度教与java宗教的特点与观念对比 attilax总结
    atitit.验证码识别step2剪贴板ClipBoard copy image图像 attilax总结
  • 原文地址:https://www.cnblogs.com/caitian/p/9412317.html
Copyright © 2011-2022 走看看