⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgi.py

📁 mallet是自然语言处理、机器学习领域的一个开源项目。
💻 PY
📖 第 1 页 / 共 3 页
字号:
    filename = None    list = None    type = None    file = None    type_options = {}    disposition = None    disposition_options = {}    headers = {}    def __init__(self, name, value):        """Constructor from field name and value."""        self.name = name        self.value = value        # self.file = StringIO(value)    def __repr__(self):        """Return printable representation."""        return "MiniFieldStorage(%s, %s)" % (`self.name`, `self.value`)class FieldStorage:    """Store a sequence of fields, reading multipart/form-data.    This class provides naming, typing, files stored on disk, and    more.  At the top level, it is accessible like a dictionary, whose    keys are the field names.  (Note: None can occur as a field name.)    The items are either a Python list (if there's multiple values) or    another FieldStorage or MiniFieldStorage object.  If it's a single    object, it has the following attributes:    name: the field name, if specified; otherwise None    filename: the filename, if specified; otherwise None; this is the        client side filename, *not* the file name on which it is        stored (that's a temporary file you don't deal with)    value: the value as a *string*; for file uploads, this        transparently reads the file every time you request the value    file: the file(-like) object from which you can read the data;        None if the data is stored a simple string    type: the content-type, or None if not specified    type_options: dictionary of options specified on the content-type        line    disposition: content-disposition, or None if not specified    disposition_options: dictionary of corresponding options    headers: a dictionary(-like) object (sometimes rfc822.Message or a        subclass thereof) containing *all* headers    The class is subclassable, mostly for the purpose of overriding    the make_file() method, which is called internally to come up with    a file open for reading and writing.  This makes it possible to    override the default choice of storing all files in a temporary    directory and unlinking them as soon as they have been opened.    """    def __init__(self, fp=None, headers=None, outerboundary="",                 environ=os.environ, keep_blank_values=0, strict_parsing=0):        """Constructor.  Read multipart/* until last part.        Arguments, all optional:        fp              : file pointer; default: sys.stdin            (not used when the request method is GET)        headers         : header dictionary-like object; default:            taken from environ as per CGI spec        outerboundary   : terminating multipart boundary            (for internal use only)        environ         : environment dictionary; default: os.environ        keep_blank_values: flag indicating whether blank values in            URL encoded forms should be treated as blank strings.            A true value indicates that blanks should be retained as            blank strings.  The default false value indicates that            blank values are to be ignored and treated as if they were            not included.        strict_parsing: flag indicating what to do with parsing errors.            If false (the default), errors are silently ignored.            If true, errors raise a ValueError exception.        """        method = 'GET'        self.keep_blank_values = keep_blank_values        self.strict_parsing = strict_parsing        if environ.has_key('REQUEST_METHOD'):            method = environ['REQUEST_METHOD'].upper()        if method == 'GET' or method == 'HEAD':            if environ.has_key('QUERY_STRING'):                qs = environ['QUERY_STRING']            elif sys.argv[1:]:                qs = sys.argv[1]            else:                qs = ""            fp = StringIO(qs)            if headers is None:                headers = {'content-type':                           "application/x-www-form-urlencoded"}        if headers is None:            headers = {}            if method == 'POST':                # Set default content-type for POST to what's traditional                headers['content-type'] = "application/x-www-form-urlencoded"            if environ.has_key('CONTENT_TYPE'):                headers['content-type'] = environ['CONTENT_TYPE']            if environ.has_key('CONTENT_LENGTH'):                headers['content-length'] = environ['CONTENT_LENGTH']        self.fp = fp or sys.stdin        self.headers = headers        self.outerboundary = outerboundary        # Process content-disposition header        cdisp, pdict = "", {}        if self.headers.has_key('content-disposition'):            cdisp, pdict = parse_header(self.headers['content-disposition'])        self.disposition = cdisp        self.disposition_options = pdict        self.name = None        if pdict.has_key('name'):            self.name = pdict['name']        self.filename = None        if pdict.has_key('filename'):            self.filename = pdict['filename']        # Process content-type header        #        # Honor any existing content-type header.  But if there is no        # content-type header, use some sensible defaults.  Assume        # outerboundary is "" at the outer level, but something non-false        # inside a multi-part.  The default for an inner part is text/plain,        # but for an outer part it should be urlencoded.  This should catch        # bogus clients which erroneously forget to include a content-type        # header.        #        # See below for what we do if there does exist a content-type header,        # but it happens to be something we don't understand.        if self.headers.has_key('content-type'):            ctype, pdict = parse_header(self.headers['content-type'])        elif self.outerboundary or method != 'POST':            ctype, pdict = "text/plain", {}        else:            ctype, pdict = 'application/x-www-form-urlencoded', {}        self.type = ctype        self.type_options = pdict        self.innerboundary = ""        if pdict.has_key('boundary'):            self.innerboundary = pdict['boundary']        clen = -1        if self.headers.has_key('content-length'):            try:                clen = int(self.headers['content-length'])            except:                pass            if maxlen and clen > maxlen:                raise ValueError, 'Maximum content length exceeded'        self.length = clen        self.list = self.file = None        self.done = 0        if ctype == 'application/x-www-form-urlencoded':            self.read_urlencoded()        elif ctype[:10] == 'multipart/':            self.read_multi(environ, keep_blank_values, strict_parsing)        else:            self.read_single()    def __repr__(self):        """Return a printable representation."""        return "FieldStorage(%s, %s, %s)" % (                `self.name`, `self.filename`, `self.value`)    def __getattr__(self, name):        if name != 'value':            raise AttributeError, name        if self.file:            self.file.seek(0)            value = self.file.read()            self.file.seek(0)        elif self.list is not None:            value = self.list        else:            value = None        return value    def __getitem__(self, key):        """Dictionary style indexing."""        if self.list is None:            raise TypeError, "not indexable"        found = []        for item in self.list:            if item.name == key: found.append(item)        if not found:            raise KeyError, key        if len(found) == 1:            return found[0]        else:            return found    def getvalue(self, key, default=None):        """Dictionary style get() method, including 'value' lookup."""        if self.has_key(key):            value = self[key]            if type(value) is type([]):                return map(lambda v: v.value, value)            else:                return value.value        else:            return default    def getfirst(self, key, default=None):        """ Return the first value received."""        if self.has_key(key):            value = self[key]            if type(value) is type([]):                return value[0].value            else:                return value.value        else:            return default    def getlist(self, key):        """ Return list of received values."""        if self.has_key(key):            value = self[key]            if type(value) is type([]):                return map(lambda v: v.value, value)            else:                return [value.value]        else:            return []    def keys(self):        """Dictionary style keys() method."""        if self.list is None:            raise TypeError, "not indexable"        keys = []        for item in self.list:            if item.name not in keys: keys.append(item.name)        return keys    def has_key(self, key):        """Dictionary style has_key() method."""        if self.list is None:            raise TypeError, "not indexable"        for item in self.list:            if item.name == key: return 1        return 0    def __len__(self):        """Dictionary style len(x) support."""        return len(self.keys())    def read_urlencoded(self):        """Internal: read data in query string format."""        qs = self.fp.read(self.length)        self.list = list = []        for key, value in parse_qsl(qs, self.keep_blank_values,                                    self.strict_parsing):            list.append(MiniFieldStorage(key, value))        self.skip_lines()    FieldStorageClass = None    def read_multi(self, environ, keep_blank_values, strict_parsing):        """Internal: read a part that is itself multipart."""        ib = self.innerboundary        if not valid_boundary(ib):            raise ValueError, ('Invalid boundary in multipart form: %s'                               % `ib`)        self.list = []        klass = self.FieldStorageClass or self.__class__        part = klass(self.fp, {}, ib,                     environ, keep_blank_values, strict_parsing)        # Throw first part away        while not part.done:            headers = rfc822.Message(self.fp)            part = klass(self.fp, headers, ib,                         environ, keep_blank_values, strict_parsing)            self.list.append(part)        self.skip_lines()    def read_single(self):        """Internal: read an atomic part."""        if self.length >= 0:            self.read_binary()            self.skip_lines()        else:            self.read_lines()        self.file.seek(0)    bufsize = 8*1024            # I/O buffering size for copy to file    def read_binary(self):        """Internal: read binary data."""        self.file = self.make_file('b')        todo = self.length        if todo >= 0:            while todo > 0:                data = self.fp.read(min(todo, self.bufsize))                if not data:                    self.done = -1                    break                self.file.write(data)                todo = todo - len(data)    def read_lines(self):        """Internal: read lines until EOF or outerboundary."""        self.file = self.__file = StringIO()        if self.outerboundary:            self.read_lines_to_outerboundary()        else:            self.read_lines_to_eof()    def __write(self, line):        if self.__file is not None:            if self.__file.tell() + len(line) > 1000:                self.file = self.make_file('')                self.file.write(self.__file.getvalue())                self.__file = None        self.file.write(line)    def read_lines_to_eof(self):        """Internal: read lines until EOF."""        while 1:            line = self.fp.readline()            if not line:                self.done = -1                break            self.__write(line)    def read_lines_to_outerboundary(self):        """Internal: read lines until outerboundary."""        next = "--" + self.outerboundary        last = next + "--"        delim = ""        while 1:            line = self.fp.readline()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -