>  기사  >  백엔드 개발  >  Bottle 소스코드의 HeaderDict에 대한 자세한 설명

Bottle 소스코드의 HeaderDict에 대한 자세한 설명

零下一度
零下一度원래의
2017-07-24 09:20:031485검색

求 모든 프레임워크 요청 응답은 하나의 원칙을 기반으로 합니다. http 요청 --> wsgi 서버 --> wsgi 인터페이스(실제로 프레임워크에서 사용자 정의 구현으로 구현된 기능은 하단에 캡슐화되어 있음) Liao Xuefeng의 튜토리얼

class HeaderDict(dict):''' A dictionary with case insensitive (titled) keys.        You may add a list of strings to send multible headers with the same name.'''def __setitem__(self, key, value):return dict.__setitem__(self,key.title(), value) #注意这里使用title函数,它能将每个单词的开头大写def __getitem__(self, key):return dict.__getitem__(self,key.title())def __delitem__(self, key):return dict.__delitem__(self,key.title())def __contains__(self, key):return dict.__contains__(self,key.title())def items(self):""" Returns a list of (key, value) tuples """for key, values in dict.items(self):if not isinstance(values, list):
                values = [values]for value in values:yield (key, str(value))                def add(self, key, value):""" Adds a new header without deleting old ones """if isinstance(value, list):for v in value:self.add(key, v) #注意这里使用了递归elif key in self:if isinstance(self[key], list):self[key].append(value)else:self[key] = [self[key], value]else:          self[key] = [value]
에서 wsgi 인터페이스에 대한 설명을 참조할 수 있습니다. HeaderDict는 사전을 캡슐화하고 사전 키에 있는 단어의 첫 글자를 대문자로 표시합니다. 그리고 value를 반복 가능한 객체로 바꾸고, value를 목록 객체, 즉 value=[value]로 바꿉니다. WSGI 표준은 문자열 유형을 목록 유형으로 변환해야 더 나은 표현을 제공하도록 정의합니다. 서버는 한꺼번에 출력할 필요는 없지만, 한 번에 너무 많은 출력을 방지하기 위해 Yield를 사용하여 출력을 제어할 수 있습니다. 전체적으로 dict를 캡슐화하는 이 클래스는 두 가지 기능을 구현합니다:

  1. 값을 목록으로 변환, 데이터 표현 최적화

  2. 키에 있는 단어의 첫 글자를 대문자로 표시

def abort(code=500, text='Unknown Error: Appliction stopped.'):""" Aborts execution and causes a HTTP error. """raise HTTPError(code, text)def redirect(url, code=307):""" Aborts execution and causes a 307 redirect """response.status = code
    response.header['Location'] = urlraise BreakTheBottle("")def send_file(filename, root, guessmime = True, mimetype = 'text/plain'):""" Aborts execution and sends a static files as response. """root = os.path.abspath(root) + '/'filename = os.path.normpath(filename).strip('/')
    filename = os.path.join(root, filename)#判断文件是否可获得if not filename.startswith(root): #主目录下的文件不可以下载abort(401, "Access denied.")if not os.path.exists(filename) or not os.path.isfile(filename):
        abort(404, "File does not exist.")if not os.access(filename, os.R_OK):
        abort(401, "You do not have permission to access this file.")# 获得文件类型if guessmime:
        guess = mimetypes.guess_type(filename)[0]if guess:
            response.content_type = guesselif mimetype:
            response.content_type = mimetypeelif mimetype:
        response.content_type = mimetype#设置Content_typestats = os.stat(filename)# TODO: HTTP_IF_MODIFIED_SINCE -> 304 (Thu, 02 Jul 2009 23:16:31 CEST)if 'Content-Length' not in response.header:
        response.header['Content-Length'] = stats.st_sizeif 'Last-Modified' not in response.header:
        ts = time.gmtime(stats.st_mtime)
        ts = time.strftime("%a, %d %b %Y %H:%M:%S +0000", ts)
        response.header['Last-Modified'] = tsraise BreakTheBottle(open(filename, 'r'))
위의 세 가지 기능 서버 내부 오류, 리디렉션, 파일 다운로드 등이 각각 구현됩니다. 이 파일 다운로드 기능은 파일 유형 판단, Content_type 설정, 파일 권한 판단, 파일 상태 획득 등을 구현합니다. 이 기능은 여전히 ​​매우 간단하며 사용자 정의가 가능합니다.

위 내용은 Bottle 소스코드의 HeaderDict에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.