API 참조

대부분 자동 생성된 API 문서다. 보틀이 처음이라면 서술식으로 된 따라하기가 더 유용할 수 있다.

모듈들

모듈에는 여러 함수, 상수, 예외가 정의돼 있다.

debug(mode=True)[source]

디버그 수준 변경. 현재 지원하는 디버그 수준은 한 가지뿐이다.

run(app=None, server='wsgiref', host='127.0.0.1', port=8080, interval=1, reloader=False, quiet=False, plugins=None, debug=None, **kargs)[source]

서버 인스턴스 시작. 서버가 종료할 때까지 이 메소드는 블록된다.

Parameters
  • app – WSGI 응용 또는 load_app()에서 지원하는 대상 문자열. (기본값: default_app())

  • server – 사용할 서버 어댑터. 유효한 이름은 server_names의 키 참고. ServerAdapter 서브클래스 전달해도 됨. (기본값: wsgiref)

  • host – 바인드할 서버 주소. 외부 인터페이스 포함 모든 인터페이스에 리슨하려면 0.0.0.0. (기본값: 127.0.0.1)

  • port – 바인드할 서버 포트. 1024 아래 값에는 루트 권한 필요. (기본값: 8080)

  • reloader – 자동 재적재 모드로 서버 시작? (기본값: False)

  • interval – 자동 재적재 확인 간격. 초 단위. (기본값: 1)

  • quiet – stdout 및 stderr 출력 끄기? (기본값: False)

  • options – 서버 어댑터로 전달할 옵션들.

load(target, **namespace)[source]

모듈을 임포트하거나 모듈에서 객체 가져오기.

  • package.module: module을 모듈 객체로 반환.

  • pack.mod:name: pack.mod의 모듈 변수 name 반환.

  • pack.mod:func():pack.mod.func() 호출하고 결과 반환.

마지막 형식은 함수 호출뿐 아니라 임의 타입의 식도 받는다. 이 함수에 전달한 키워드 인자들을 지역 변수로 사용할 수 있게 된다. 예: import_string('re:compile(x)', x='[a-z]')

load_app(target)[source]

모듈에서 보틀 응용을 적재하면서 임포트가 현재 기본 응용에 영향을 주지 않도록 하고, 응용 객체를 따로 반환한다. target 매개변수에 대해선 load() 참고.

request = <LocalRequest: GET http://127.0.0.1/>

스레드에 안전한 LocalRequest 인스턴스. 요청 콜백 내에서 접근 시 이 인스턴스는 (다중 스레드 서버에서도) 항상 현재 요청을 가리킨다.

response = Content-Type: text/html; charset=UTF-8

스레드에 안전한 LocalResponse 인스턴스. 현재 요청에 대한 HTTP 응답을 바꾸는 데 쓴다.

HTTP_CODES = {<HTTPStatus.CONTINUE: 100>: 'Continue', <HTTPStatus.SWITCHING_PROTOCOLS: 101>: 'Switching Protocols', <HTTPStatus.PROCESSING: 102>: 'Processing', <HTTPStatus.EARLY_HINTS: 103>: 'Early Hints', <HTTPStatus.OK: 200>: 'OK', <HTTPStatus.CREATED: 201>: 'Created', <HTTPStatus.ACCEPTED: 202>: 'Accepted', <HTTPStatus.NON_AUTHORITATIVE_INFORMATION: 203>: 'Non-Authoritative Information', <HTTPStatus.NO_CONTENT: 204>: 'No Content', <HTTPStatus.RESET_CONTENT: 205>: 'Reset Content', <HTTPStatus.PARTIAL_CONTENT: 206>: 'Partial Content', <HTTPStatus.MULTI_STATUS: 207>: 'Multi-Status', <HTTPStatus.ALREADY_REPORTED: 208>: 'Already Reported', <HTTPStatus.IM_USED: 226>: 'IM Used', <HTTPStatus.MULTIPLE_CHOICES: 300>: 'Multiple Choices', <HTTPStatus.MOVED_PERMANENTLY: 301>: 'Moved Permanently', <HTTPStatus.FOUND: 302>: 'Found', <HTTPStatus.SEE_OTHER: 303>: 'See Other', <HTTPStatus.NOT_MODIFIED: 304>: 'Not Modified', <HTTPStatus.USE_PROXY: 305>: 'Use Proxy', <HTTPStatus.TEMPORARY_REDIRECT: 307>: 'Temporary Redirect', <HTTPStatus.PERMANENT_REDIRECT: 308>: 'Permanent Redirect', <HTTPStatus.BAD_REQUEST: 400>: 'Bad Request', <HTTPStatus.UNAUTHORIZED: 401>: 'Unauthorized', <HTTPStatus.PAYMENT_REQUIRED: 402>: 'Payment Required', <HTTPStatus.FORBIDDEN: 403>: 'Forbidden', <HTTPStatus.NOT_FOUND: 404>: 'Not Found', <HTTPStatus.METHOD_NOT_ALLOWED: 405>: 'Method Not Allowed', <HTTPStatus.NOT_ACCEPTABLE: 406>: 'Not Acceptable', <HTTPStatus.PROXY_AUTHENTICATION_REQUIRED: 407>: 'Proxy Authentication Required', <HTTPStatus.REQUEST_TIMEOUT: 408>: 'Request Timeout', <HTTPStatus.CONFLICT: 409>: 'Conflict', <HTTPStatus.GONE: 410>: 'Gone', <HTTPStatus.LENGTH_REQUIRED: 411>: 'Length Required', <HTTPStatus.PRECONDITION_FAILED: 412>: 'Precondition Failed', <HTTPStatus.REQUEST_ENTITY_TOO_LARGE: 413>: 'Request Entity Too Large', <HTTPStatus.REQUEST_URI_TOO_LONG: 414>: 'Request-URI Too Long', <HTTPStatus.UNSUPPORTED_MEDIA_TYPE: 415>: 'Unsupported Media Type', <HTTPStatus.REQUESTED_RANGE_NOT_SATISFIABLE: 416>: 'Requested Range Not Satisfiable', <HTTPStatus.EXPECTATION_FAILED: 417>: 'Expectation Failed', <HTTPStatus.IM_A_TEAPOT: 418>: "I'm a teapot", <HTTPStatus.MISDIRECTED_REQUEST: 421>: 'Misdirected Request', <HTTPStatus.UNPROCESSABLE_ENTITY: 422>: 'Unprocessable Entity', <HTTPStatus.LOCKED: 423>: 'Locked', <HTTPStatus.FAILED_DEPENDENCY: 424>: 'Failed Dependency', <HTTPStatus.TOO_EARLY: 425>: 'Too Early', <HTTPStatus.UPGRADE_REQUIRED: 426>: 'Upgrade Required', <HTTPStatus.PRECONDITION_REQUIRED: 428>: 'Precondition Required', <HTTPStatus.TOO_MANY_REQUESTS: 429>: 'Too Many Requests', <HTTPStatus.REQUEST_HEADER_FIELDS_TOO_LARGE: 431>: 'Request Header Fields Too Large', <HTTPStatus.UNAVAILABLE_FOR_LEGAL_REASONS: 451>: 'Unavailable For Legal Reasons', <HTTPStatus.INTERNAL_SERVER_ERROR: 500>: 'Internal Server Error', <HTTPStatus.NOT_IMPLEMENTED: 501>: 'Not Implemented', <HTTPStatus.BAD_GATEWAY: 502>: 'Bad Gateway', <HTTPStatus.SERVICE_UNAVAILABLE: 503>: 'Service Unavailable', <HTTPStatus.GATEWAY_TIMEOUT: 504>: 'Gateway Timeout', <HTTPStatus.HTTP_VERSION_NOT_SUPPORTED: 505>: 'HTTP Version Not Supported', <HTTPStatus.VARIANT_ALSO_NEGOTIATES: 506>: 'Variant Also Negotiates', <HTTPStatus.INSUFFICIENT_STORAGE: 507>: 'Insufficient Storage', <HTTPStatus.LOOP_DETECTED: 508>: 'Loop Detected', <HTTPStatus.NOT_EXTENDED: 510>: 'Not Extended', <HTTPStatus.NETWORK_AUTHENTICATION_REQUIRED: 511>: 'Network Authentication Required'}

HTTP 상태 코드(예: 404)를 문구(예: ‘Not Found’)로 매핑하는 dict

app()
default_app()

현재 기본 응용을 반환. 실제로 이는 호출 가능한 AppStack 인스턴스이며 스택스러운 API를 구현하고 있다.

라우팅

보틀은 Bottle 인스턴스들의 스택을 유지하며 (app()AppStack 참고) 스택 최상단 인스턴스를 일부 모듈 층위 함수와 데코레이터에서 기본 응용으로 쓴다.

route(path, method='GET', callback=None, **options)
get(...)
post(...)
put(...)
delete(...)

현재 기본 응용에 라우트를 설치하는 데코레이터. 자세한 내용은 Bottle.route() 참고.

error(...)

현재 기본 응용에 오류 핸들러를 설치하는 데코레이터. 자세한 내용은 Bottle.error() 참고.

WSGI 및 HTTP 유틸리티

parse_date(ims)[source]

rfc1123, rfc850, asctime 형식 타임스탬프를 파싱해서 UTC 에포크 시간 반환.

parse_auth(header)[source]

rfc2617 HTTP 인증 헤더 문자열(basic)을 파싱해서 (user,pass) 튜플 또는 None 반환.

cookie_encode(data, key)[source]

pickle 가능 객체를 인코딩 및 서명. (바이트)열 반환.

cookie_decode(data, key)[source]

인코딩된 문자열을 검사 및 디코딩. 객체 또는 None 반환.

cookie_is_encoded(data)[source]

인자가 인코딩된 쿠키처럼 보이면 True 반환.

yieldroutes(func)[source]

func 매개변수의 시그너처(이름, 인자)에 맞는 라우트를 내놓는 제너레이터 반환. 함수가 선택적 키워드 인자를 받는 경우 여러 라우트를 내놓을 수도 있다. 출력 예를 보자.

a()         -> '/a'
b(x, y)     -> '/b/<x>/<y>'
c(x, y=5)   -> '/c/<x>'  '/c/<x>/<y>'
d(x=5, y=6) -> '/d'  '/d/<x>'  '/d/<x>/<y>'
path_shift(script_name, path_info, shift=1)[source]

PATH_INFO에서 SCRIPT_NAME으로 또는 반대로 경로 분절들을 이동.

Returns

수정된 경로들.

Parameters
  • script_name – SCRIPT_NAME 경로.

  • path_info – PATH_INFO 경로.

  • shift – 옮길 경로 분절 수. 음수로 해서 이동 방향을 바꿀 수도 있다. (기본값: 1)

자료 구조

class MultiDict(*a, **k)[source]

이 dict는 키별로 여러 값을 저장한다는 점을 빼면 일반 dict와 똑같이 동작한다. 키를 주면 최신 값만 반환한다. 전체 값 리스트에 접근하는 데 쓸 수 있는 메소드들이 따로 있다.

keys()a set-like object providing a view on D’s keys[source]
values()an object providing a view on D’s values[source]
items()a set-like object providing a view on D’s items[source]
iterkeys()[source]

D.keys() -> a set-like object providing a view on D’s keys

itervalues()[source]

D.values() -> an object providing a view on D’s values

iteritems()[source]

D.items() -> a set-like object providing a view on D’s items

get(key, default=None, index=- 1, type=None)[source]

키에 대한 최신 값을 반환.

Parameters
  • default – 키가 없거나 타입 변환이 실패한 경우 반환할 기본값.

  • index – 값 리스트에 대한 색인.

  • type – 지정돼 있으면 그 콜러블을 이용해 값을 특정 타입으로 캐스트한다. 콜러블에서 예외를 던지면 막고서 기본값을 반환한다.

append(key, value)[source]

이 키에 대한 값 리스트에 새 값을 추가.

replace(key, value)[source]

값 리스트를 값 하나로 교체.

getall(key)[source]

키에 대한 (비어 있을 수 있는) 값 리스트 반환.

getone(key, default=None, index=- 1, type=None)

다른 multi-dict API (Django)를 흉내내기 위한 WTForms 에일리어스.

getlist(key)

키에 대한 (비어 있을 수 있는) 값 리스트 반환.

class HeaderDict(*a, **ka)[source]

MultiDict의 대소문자 구별 없는 버전이며 기본적으로 값을 덧붙이지 않고 이전 값을 교체한다.

append(key, value)[source]

이 키에 대한 값 리스트에 새 값을 추가.

replace(key, value)[source]

값 리스트를 값 하나로 교체.

getall(key)[source]

키에 대한 (비어 있을 수 있는) 값 리스트 반환.

get(key, default=None, index=- 1)[source]

키에 대한 최신 값을 반환.

Parameters
  • default – 키가 없거나 타입 변환이 실패한 경우 반환할 기본값.

  • index – 값 리스트에 대한 색인.

  • type – 지정돼 있으면 그 콜러블을 이용해 값을 특정 타입으로 캐스트한다. 콜러블에서 예외를 던지면 막고서 기본값을 반환한다.

class FormsDict(*a, **k)[source]

요청 양식 데이터를 저장하는 데 쓰는 MultiDict의 서브클래스. 일반 dict스러운 항목 접근 방법(데이터를 그대로 네이티브 문자열로 반환)에 더해서 이 컨테이너는 값에 속성처럼 접근하는 것도 지원한다. 속성은 input_encoding(기본값: ‘utf8’)에 맞도록 자동으로 디코딩 또는 재인코딩된다. 없는 속성은 기본값으로 빈 문자열을 내놓는다.

input_encoding = 'utf8'

속성 값에 쓰는 인코딩.

recode_unicode = True

참(기본값)이면 유니코드열을 먼저 latin1으로 인코딩한 다음 input_encoding에 맞게 디코딩한다.

decode(encoding=None)[source]

input_encoding에 맞게 디코딩 내지 재인코딩된 전체 키와 값의 사본 반환. 어떤 라이브러리(예: WTForms)는 유니코드 딕셔너리를 원한다.

getunicode(name, default=None, encoding=None)[source]

유니코드열로 된 값, 또는 default 반환.

class WSGIHeaderDict(environ)[source]

WSGI environ dict를 포장해서 HTTP_* 필드에 편리하게 접근할 수 있게 하는 dict스러운 클래스. 키와 값은 네이티브 문자열(2.x는 bytes, 3.x는 unicode)이며 키는 대소문자 구별이 없다. WSGI 환경에 네이티브 아닌 문자열 값이 들어 있으면 무손실 ‘latin1’ 문자셋을 이용해 디코딩 또는 인코딩한다.

관련 PEP가 바뀌는 경우에도 API가 안정적으로 유지될 것이다. 현재 PEP 333, 444, 3333을 지원한다. (PEP 444는 네이티브 아닌 문자열을 쓰는 유일한 PEP다.)

cgikeys = ('CONTENT_TYPE', 'CONTENT_LENGTH')

HTTP_로 시작하지 않는 키들의 목록.

raw(key, default=None)[source]

헤더 값을 그대로 (bytes 또는 unicode로) 반환.

keys()a set-like object providing a view on D’s keys[source]
class AppStack(iterable=(), /)[source]

스택스러운 리스트. 호출하면 스택 상단 항목 반환.

pop()

현재 기본 응용을 반환하고 스택에서 제거.

push(value=None)[source]

스택에 새 Bottle 인스턴스 추가.

class ResourceManager(base='./', opener=<built-in function open>, cachemode='all')[source]

탐색 경로 목록을 관리하고 응용 관련 자원(파일)을 찾아서 여는 걸 돕는 클래스.

Parameters
  • baseadd_path() 호출을 위한 기본값.

  • opener – 자원 여는 데 쓰는 콜러블.

  • cachemode – 어떤 탐색 결과를 캐싱할지 제어. ‘all’, ‘found’, ‘none’ 중 하나.

path

탐색 경로 목록. 자세한 건 add_path() 참고.

cache

결정된 경로들의 캐시. res.cache.clear()로 캐시 비울 수 있음.

add_path(path, base=None, index=None, create=False)[source]

탐색 경로 목록에 새 경로 추가. 존재하지 않는 경로면 False 반환.

Parameters
  • path – 새 탐색 경로. 상대 경로는 정규화된 절대 경로로 바뀐다. 경로가 파일처럼 생겼으면 (/로 끝나지 않으면) 파일명 부분을 없앤다.

  • base – 상대 탐색 경로를 절대 경로로 바꾸는 데 쓰는 경로. 기본은 base 속성 값인데, 그 기본값은 os.getcwd().

  • index – 탐색 경로 목록 내 위치. 기본은 마지막 색인 위치 (리스트에 덧붙이기).

base 매개변수는 파이썬 모듈 내지 패키지와 함께 설치된 파일을 쉽게 참조할 수 있게 해 준다.

res.add_path('./resources/', __file__)
lookup(name)[source]

자원을 탐색해서 파일 절대 경로를 반환. 없으면 None 반환.

path 목록을 차례로 탐색한다. 먼저 걸린 경로를 반환한다. 심볼릭 링크를 따라간다. 결과를 캐싱해서 이후 검색 속도를 높인다.

open(name, mode='r', *args, **kwargs)[source]

자원을 찾아서 파일 객체 반환, 또는 IOError 던짐.

class FileUpload(fileobj, name, filename, headers=None)[source]
file

열린 파일(스러운) 객체 (BytesIO 버퍼나 임시 파일)

name

업로드 양식 필드 이름

raw_filename

클라이언트가 보낸 그대로의 파일 이름 (안전하지 않은 문자 있을 수 있음)

headers

추가 헤더들(예: content-type)이 있는 HeaderDict

content_type

‘Content-Type’ 헤더의 현재 값.

content_length

‘Content-Length’ 헤더의 현재 값.

get_header(name, default=None)[source]

멀티파트 부분 안의 헤더 값 반환.

filename[source]

클라이언트 파일 시스템 상의 파일 이름. 단 파일 시스템 호환성이 보장되도록 정규화 돼 있음. 빈 파일 이름은 ‘empty’로 반환.

최종 파일 이름에서는 ASCII 문자, 숫자, 대시, 밑줄, 마침표만 허용한다. 가능한 경우 강세 표시를 없앤다. 공백을 대시 한 개로 바꾼다. 앞이나 뒤의 마침표 및 대시를 제거한다. 파일 이름 길이를 255문자로 제한한다.

save(destination, overwrite=False, chunk_size=65536)[source]

파일을 디스크에 저장하거나 내용물을 열린 파일(스러운) 객체로 복사한다. destination이 디렉터리면 경로에 filename을 덧붙인다. 기본적으로 기존 파일을 덮어 쓰지 않는다 (IOError).

Parameters
  • destination – 파일 경로나 디렉터리, 파일(스러운) 객체.

  • overwrite – 참이면 기본 파일을 교체. (기본값: False)

  • chunk_size – 한 번에 읽을 바이트 수. (기본값: 64kb)

예외

exception BottleException[source]

보틀에서 쓰는 예외들의 베이스 클래스.

Bottle 클래스

class Bottle(catchall=True, autojson=True)[source]

각 Bottle 객체는 하나의 구별된 웹 응용을 나타내며, 라우트와 콜백, 플러그인, 자원, 설정으로 구성된다. 인스턴스는 호출 가능한 WSGI 응용이다.

Parameters

catchall – 참(기본)이면 모든 예외를 처리한다. 디버깅용 미들웨어가 예외를 처리하게 하려면 끄면 된다.

config

앱 설정을 위한 ConfigDict.

resources

응용 파일들을 위한 ResourceManager.

catchall

참이면 대부분의 예외를 잡아서 HTTPError로 반환한다.

add_hook(name, func)[source]

훅에 콜백 붙이기. 현재 세 가지 훅이 구현돼 있다.

before_request

각 요청 전에 한 번 실행. 요청 문맥은 사용할 수 있지만 아직 라우팅은 이뤄지지 않은 상태.

after_request

각 요청 후에 그 결과와 상관없이 한 번 실행.

app_reset

Bottle.reset()이 호출될 때마다 호출.

remove_hook(name, func)[source]

훅에서 콜백 제거.

trigger_hook(_Bottle__name, *args, **kwargs)[source]

훅을 실행하고 결과 리스트 반환.

hook(name)[source]

훅에 콜백을 붙이는 데코레이터 반환. 자세한 내용은 add_hook() 참고.

mount(prefix, app, **options)[source]

응용(Bottle 또는 단순 WSGI)을 특정 URL 프리픽스에 붙이기. 예:

root_app.mount('/admin/', admin_app)
Parameters
  • prefix – 경로 프리픽스 내지 마운트 지점. 슬래시로 끝나면 그 슬래시가 꼭 있어야 한다.

  • appBottle 인스턴스 또는 WSGI 응용.

다른 매개변수들은 모두 하위 route() 호출로 전달된다.

merge(routes)[source]

다른 Bottle 응용의 라우트나 Route 객체 리스트를 이 응용으로 병합. 라우트의 ‘소유자’가 그대로 유지된다. 즉 Route.app 속성이 바뀌지 않는다.

install(plugin)[source]

plugin을 플러그인 목록에 추가하고 이 응용의 모든 라우트에 적용될 수 있게 준비. plugin은 단순 데코레이터일 수도 있고 Plugin API를 구현하는 객체일 수도 있다.

uninstall(plugin)[source]

플러그인 제거. 특정 플러그인을 제거하려면 인스턴스를 주면 되고, 어떤 타입의 모든 플러그인을 제거하려면 그 타입 객체를, name 속성이 일치하는 모든 플러그인을 제거하려면 문자열을, 모든 플러그인을 제거하려면 True를 주면 된다. 제거된 플러그인 목록을 반환한다.

reset(route=None)[source]

모든 라우트를 재설정(플러그인들을 강제로 재적용)하고 캐시 모두 비우기. ID나 라우트 객체를 주면 그 특정 라우트만 영향받는다.

close()[source]

응용과 설치된 모든 플러그인 닫기.

run(**kwargs)[source]

같은 매개변수로 run() 호출.

match(environ)[source]

걸리는 라우트를 검색해서 (Route , urlargs) 튜플을 반환. 두 번째 값은 URL에서 추출한 매개변수들을 담은 딕셔너리다. 불일치 시 HTTPError (404/405)를 던진다.

get_url(routename, **kargs)[source]

지정한 라우트에 걸리는 문자열을 반환.

add_route(route)[source]

라우트 객체 추가. 단 Route.app 속성은 바꾸지 않음.

route(path=None, method='GET', callback=None, name=None, apply=None, skip=None, **config)[source]

요청 URL에 함수를 결속시키는 데코레이터. 예:

@app.route('/hello/:name')
def hello(name):
    return 'Hello %s' % name

:name 부분은 와일드카드다. 자세한 문법은 Router 참고.

Parameters
  • path – 받을 요청 경로 또는 경로 목록. 경로를 지정하지 않으면 함수 시그너처를 가지고 자동으로 생성한다.

  • method – 받을 HTTP 메소드(GET, POST, PUT, …) 또는 메소드들의 목록. (기본값: GET)

  • callback – 데코레이터 문법을 피하기 위한 선택적인 지정 방법. route(..., callback=func)route(...)(func)와 같다.

  • name – 이 라우트의 이름. (기본값: None)

  • apply – 데코레이터, 또는 플러그인, 또는 플러그인 목록. 설치돼 있는 플러그인들에 더해서 라우트 콜백에 적용된다.

  • skip – 플러그인 또는 플러그인 클래스 또는 이름의 목록. 걸리는 플러그인은 이 라우트에 설치하지 않는다. True면 모두 건너뛴다.

추가 키워드 인자가 있으면 라우트별 설정에 저장돼서 플러그인들로 전달된다. (Plugin.apply() 참고.)

get(path=None, method='GET', **options)[source]

route()와 같음.

post(path=None, method='POST', **options)[source]

route()와 같되 method 매개변수가 POST.

put(path=None, method='PUT', **options)[source]

route()와 같되 method 매개변수가 PUT.

delete(path=None, method='DELETE', **options)[source]

route()와 같되 method 매개변수가 DELETE.

error(code=500)[source]

데코레이터: HTTP 오류 코드에 대한 출력 핸들러 등록

wsgi(environ, start_response)[source]

보틀의 WSGI 인터페이스.

class Route(app, rule, method, callback, name=None, plugins=None, skiplist=None, **config)[source]

이 클래스는 라우트 콜백과 라우트별 메타데이터 및 설정을 감싸며 필요시 플러그인들을 적용한다. 또한 URL 경로 규칙을 Router에서 쓸 수 있는 정규 표현식으로 바꾸는 일도 맡는다.

app

이 라우트가 설치된 응용.

rule

경로 규칙 문자열. (예: /wiki/:page)

method

HTTP 메소드 문자열. (예: GET)

callback

어떤 플러그인도 적용되지 않은 원래 콜백. 인트로스펙션에 유용함.

name

라우트의 이름. 지정돼 있지 않으면 None.

plugins

라우트별 플러그인 목록. (Bottle.route() 참고.)

skiplist

이 라우트에 적용하지 않을 플러그인 목록. (Bottle.route() 참고.)

config

Bottle.route() 데코레이터에 추가로 준 키워드 인자들이 이 딕셔너리에 저장된다. 라우트별 플러그인 설정 및 메타데이터에 쓰인다.

call[source]

모든 플러그인이 적용된 라우트 콜백. 이 프로퍼티는 필요시 생성되며 이후 요청 처리 속도를 높이기 위해 캐싱된다.

reset()[source]

캐싱된 값이 있으면 잊어 버리기. 다음 call 접근 때 모든 플러그인이 재적용된다.

prepare()[source]

필요시 이뤄지는 작업 모두를 즉시 하기. (디버깅에 유용)

all_plugins()[source]

이 라우트에 영향 주는 모든 플러그인 내놓기.

get_undecorated_callback()[source]

콜백 반환. 콜백이 데코레이터로 꾸며진 함수면 원래 함수를 복원하려고 시도한다.

get_callback_args()[source]

(아마도) 콜백이 키워드 인자로 받는 인자 이름 목록 반환. 콜백이 데코레이터로 꾸며진 함수면 인트로스펙션 전에 원래 함수 복원을 시도한다.

get_config(key, default=None)[source]

설정 필드를 검색해서 그 값을 반환. 먼저 route.config를 확인하고 다음으로 route.app.config 확인.

Request 객체

Request 클래스는 WSGI 환경을 포장한 것이며 양식 데이터, 쿠키, 파일 업로드, 기타 메타데이터를 파싱하고 접근하기 위한 유용한 메소드들을 제공한다. 대부분 속성이 읽기 전용이다.

Request

alias of bottle.BaseRequest

class BaseRequest(environ=None)[source]

WSGI 환경 딕셔너리들의 래퍼에 여러 편리한 접근 메소드와 프로퍼티를 더한 것. 대부분 읽기 전용이다.

요청에 새 속성을 추가하면 실제로는 환경 딕셔너리에 (‘bottle.request.ext.<name>’으로) 추가된다. 요청별 데이터를 저장하고 접근하려 할 때 권장하는 방식이다.

MEMFILE_MAX = 102400

body를 위한 메모리 버퍼의 바이트 단위 최대 크기.

environ

포장된 WSGI environ 딕셔너리. 유일한 진짜 속성이다. 다른 속성들은 사실 모두 읽기 전용 프로퍼티다.

app[source]

이 요청을 처리 중인 보틀 응용.

route[source]

이 요청에 걸린 보틀 Route 객체.

url_args[source]

URL에서 추출한 인자들.

property path

PATH_INFO 값 앞에 슬래시를 딱 한 개 붙인 것. (이상 동작하는 클라이언트에 대처하고 “빈 경로” 경우를 피하기 위해.)

property method

REQUEST_METHOD 값을 대문자 문자열로.

headers[source]

대소문자 구별 없이 HTTP 요청 헤더에 접근할 수 있게 해 주는 WSGIHeaderDict.

get_header(name, default=None)[source]

요청 헤더의 값을 반환. 없으면 주어진 기본값 반환.

cookies[source]

쿠키들을 파싱해서 담은 FormsDict. 서명된 쿠키가 디코딩되어 있지 않다. 서명된 쿠키에는 get_cookie() 사용.

쿠키 내용물 반환. 서명된 쿠키를 읽으려면 secret이 쿠키 생성 시 사용한 값과 일치해야 한다. (BaseResponse.set_cookie() 참고.) 뭔가 잘못되면 (쿠키가 없거나 서명이 틀리면) 기본값을 반환한다.

query[source]

query_string을 파싱해서 담은 FormsDict. 이 값들을 “URL 인자”나 “GET 매개변수”라고도 하는데, Router에서 제공하는 “URL 와일드카드”와 혼동하지 말아야 한다.

forms[source]

url-encodedmultipart/form-data로 인코딩된 POST 또는 PUT 요청 바디의 양식 값들을 파싱한 것. FormsDict로 결과를 반환한다. 모든 키와 값이 문자열이다. 파일 업로드는 files에 따로 저장된다.

params[source]

queryforms의 값을 합친 FormsDict. 파일 업로드는 files에 저장된다.

files[source]

multipart/form-data로 인코딩된 POST 또는 PUT 요청 바디에서 파싱한 파일 업로드. 값들이 FileUpload의 인스턴스다.

json[source]

Content-Type 헤더가 application/json인 경우 이 프로퍼티는 파싱된 요청 바디 내용물을 담는다. 메모리 고갈을 피하기 위해 MEMFILE_MAX보다 작은 요청만 처리한다.

property body

seek 가능한 파일스러운 객체로 된 HTTP 요청 바디. MEMFILE_MAX에 따라 임시 파일이거나 io.BytesIO 인스턴스다. 이 프로퍼티에 처음 접근할 때 환경 변수 wsgi.input을 읽어서 교체한다. 이후 접근 때는 그 파일 객체에 seek(0)만 한다.

property chunked

chunked 전송 인코딩이었으면 True.

GET

query의 별칭.

POST[source]

formsfiles의 값을 하나로 합친 FormsDict. 값이 문자열(양식 값) 또는 cgi.FieldStorage 인스턴스(파일 업로드)다.

property url

호스트 이름과 스킴을 포함한 전체 요청 URI. 앱이 역방향 프록시나 로드 밸런서 뒤에서 도는데 이상한 결과가 나온다면 X-Forwarded-Host 헤더가 올바로 설정되는지 확인해 보자.

urlparts[source]

url 문자열을 urlparse.SplitResult 튜플로 만든 것. 그 튜플에는 (scheme, host, path, query_string, fragment)가 들어 있는데, fragment는 서버에게 보이지 않으므로 항상 비어 있다.

property fullpath

(존재 시) script_name을 포함한 요청 경로.

property query_string

URL의 query 부분(?# 사이 전부)을 그대로 문자열로 만든 것.

property script_name

응용을 호출하기 전에 상위 단계(서버 또는 라우팅 미들웨어)에서 제거한 URL path 부분 원래 값. 그 스크립트 경로 앞과 뒤에 슬래시를 붙여서 반환한다.

path_shift(shift=1)[source]

path에서 script_name으로 또는 반대로 경로 분절들을 이동.

Parameters

shift – 옮길 경로 분절 수. 음수로 해서 이동 방향을 바꿀 수도 있다. (기본값: 1)

property content_length

정수로 된 요청 바디 길이. 이 헤더를 설정할 책임이 클라이언트에게 있다. 설정하지 않았으면 바디의 실제 길이를 알 수 없으므로 -1을 반환한다. 그 경우 body가 비어 있게 된다.

property content_type

소문자로 된 Content-Type 헤더. (기본값: 빈 문자열)

property is_xhr

XMLHttpRequest로 시작된 요청이면 True. 자바스크립트 라이브러리에서 X-Requested-With 헤더를 지원하는 경우에만 동작한다. (인기 있는 라이브러리들은 대부분 지원한다.)

property is_ajax

is_xhr의 별칭. “Ajax”는 올바른 용어가 아니다.

property auth

(user, password) 튜플로 된 HTTP 인증 데이터. 이 구현체에선 현재 basic 인증만 지원한다. (digest는 지원하지 않는다.) 상위 수준에서 (가령 프론트엔드 웹 서버나 미들웨어에서) 인증이 이뤄지는 경우 password 필드가 None이지만 user 필드는 환경 변수 REMOTE_USER에서 찾아 넣는다. 오류 발생 시 None을 반환한다.

property remote_route

이 요청에 관련된 모든 IP 주소 목록. 클라이언트 IP로 시작해서 0개 이상의 프록시가 따라온다. 모든 프록시에서 X-Forwarded-For 헤더를 지원하는 경우에만 동작한다. 악의적 클라이언트가 이 정보를 위조할 수 있다는 점에 유의하자.

property remote_addr

문자열로 된 클라이언트 IP. 악의적 클라이언트가 이 정보를 위조할 수 있다는 점에 유의하자.

copy()[source]

environ을 얕게 복사한 새 Request 반환.

모듈 층위의 bottle.request는 프록시 객체(LocalRequest에 구현)이며 항상 현재 요청, 즉 현재 스레드에서 현재 요청 핸들러가 처리 중인 요청을 가리킨다. 이 스레드 로컬 덕분에 다중 스레드 환경에서 전역 인스턴스를 안전하게 이용할 수 있다.

class LocalRequest(environ=None)[source]

스레드마다 각기 다른 속성 집합이 있는 BaseRequest의 스레드 로컬 서브클래스. 일반적으로 이 클래스의 전역 인스턴스는 하나만(request) 있다. 요청/응답 처리 사이클 중에 접근 시 그 인스턴스는 (다중 스레드 서버에서도) 항상 현재 요청을 가리킨다.

bind(environ=None)

WSGI environ 딕셔너리 포장.

request = <LocalRequest: GET http://127.0.0.1/>

스레드에 안전한 LocalRequest 인스턴스. 요청 콜백 내에서 접근 시 이 인스턴스는 (다중 스레드 서버에서도) 항상 현재 요청을 가리킨다.

Response 객체

Response 클래스는 클라이언트에게 보낼 HTTP 상태 코드와 헤더 및 쿠키를 담는다. bottle.request와 비슷하게 스레드 로컬인 bottle.response 인스턴스가 있어서 현재 응답을 조정하는 데 쓸 수 있다. 더불어 요청 핸들러 안에서 Response 인스턴스를 만들어 반환할 수도 있다. 그 경우 전역 인스턴스 대신 새로 만든 인스턴스에 정의된 헤더와 쿠키가 쓰인다.

Response

alias of bottle.BaseResponse

class BaseResponse(body='', status=None, headers=None, **more_headers)[source]

응답 바디, 헤더, 쿠키 저장 클래스.

이 클래스는 분명 헤더에 대한 대소문자 구별 없는 dict스러운 항목 접근을 지원하지만 dict가 아니다. 무엇보다 응답에 반복문을 돌리면 헤더가 아니라 바디 조각들을 내놓는다.

Parameters
  • body – 지원 타입들 중 하나로 된 응답 바디.

  • status – HTTP 상태 코드(예: 200) 또는 이유 문구를 포함한 상태 행(예: ‘200 OK’).

  • headers – 이름-값 짝의 딕셔너리 또는 리스트.

추가로 준 키워드 인자들은 헤더 목록에 추가된다. 헤더 이름의 밑줄이 대시로 바뀐다.

copy(cls=None)[source]

자기 사본을 반환.

property status_line

문자열로 된 HTTP 상태 행. (예: 404 Not Found)

property status_code

정수로 된 HTTP 상태 코드. (예: 404)

property status

HTTP 응답 상태를 바꾸기 위한 쓰기 가능 프로퍼티. 숫자 코드 (100-999) 또는 자체 이유 문구(예: “404 Brain not found”)가 있는 문자열을 받는다. 그에 따라 status_linestatus_code가 모두 갱신된다. 반환 값은 항상 상태 행 문자열이다.

property headers

HeaderDict 인스턴스. 응답 헤더들에 대한 대소문자 구별 없는 dict스러운 뷰.

get_header(name, default=None)[source]

앞서 지정했던 헤더 값을 반환. 그 이름의 헤더가 없으면 기본값 반환.

set_header(name, value)[source]

새 응답 헤더 만들기. 앞서 같은 이름으로 지정한 헤더 있으면 교체.

add_header(name, value)[source]

응답 헤더 추가. 중복을 제거하지 않음.

iter_headers()[source]

(헤더, 값) 튜플을 내놓는다. 현재 응답 상태 코드에 허용되지 않는 헤더들은 건너뛴다.

property headerlist

WSGI에 부합하는 (헤더, 값) 튜플 리스트.

content_type

‘Content-Type’ 헤더의 현재 값.

content_length

‘Content-Length’ 헤더의 현재 값.

expires

‘Expires’ 헤더의 현재 값.

property charset

content-type 헤더에 지정된 문자셋 반환. (기본값: utf8)

새 쿠키를 만들거나 기존 쿠키를 교체. secret 매개변수가 설정돼 있으면 서명된 쿠키(아래에서 설명)를 만든다.

Parameters
  • name – 쿠키 이름.

  • value – 쿠키 값.

  • secret – 서명된 쿠키에 필요한 서명 키.

더불어 이 메소드는 cookie.Morsel에서 지원하는 모든 RFC 2109 속성을 받는다. 다음이 포함된다.

Parameters
  • max_age – 초 단위 최대 수명. (기본값: None)

  • expires – datetime 객체 또는 유닉스 타임스탬프. (기본값: None)

  • domain – 쿠키 읽는 게 허용되는 도메인. (기본값: 현재 도메인)

  • path – 쿠키를 지정한 경로로 제한. (기본값: 현재 경로)

  • secure – 쿠키를 HTTPS 연결로 제한. (기본값: 꺼짐)

  • httponly – 클라이언트 측 자바스크립트에서 이 쿠키를 읽지 못하게 하기. (기본값: 꺼짐. 파이썬 2.6 이상 필요.)

expiresmax_age 어느 쪽도 설정하지 않으면 (기본값) 브라우저 세션이 끝날 때 (브라우저 창이 닫히자마자) 쿠키가 만료된다.

서명된 쿠키에는 pickle 가능한 어떤 객체든 저장할 수 있으며 암호학적 서명을 해서 변조를 막는다. 대부분 브라우저에서 쿠키가 4kb로 제한돼 있다는 걸 잊지 말자.

경고: 서명된 쿠키가 암호화되는 건 아니다. (클라이언트가 여전히 내용물을 볼 수 있다.) 그리고 복사 방지가 되는 것도 아니다. (클라이언트가 이전 쿠키를 재사용할 수 있다.) 주된 의도는 pickle 처리를 안전하게 만드는 것이지, 클라이언트 쪽에 비밀 정보를 저장하는 게 아니다.

쿠키 삭제. 쿠키를 만들 때와 같은 domainpath 설정을 쓰도록 하자.

class LocalResponse(body='', status=None, headers=None, **more_headers)[source]

스레드마다 각기 다른 속성 집합이 있는 BaseResponse의 스레드 로컬 서브클래스. 일반적으로 이 클래스의 전역 인스턴스는 하나만(response) 있다. 요청/응답 처리 사이클 마지막에 그 속성들을 사용해 HTTP 응답을 만든다.

bind(body='', status=None, headers=None, **more_headers)

Initialize self. See help(type(self)) for accurate signature.

property body

스레드 로컬 프로퍼티

다음 두 클래스를 예외로 던질 수 있다. 둘의 중요한 차이는 HTTPError에 대해선 보틀이 오류 핸들러를 호출하지만 HTTPResponse나 다른 응답 타입에 대해선 하지 않는다는 점이다.

exception HTTPResponse(body='', status=None, headers=None, **more_headers)[source]
exception HTTPError(status=None, body=None, exception=None, traceback=None, **options)[source]

템플릿

bottle에서 지원하는 모든 템플릿 엔진은 BaseTemplate API를 구현하고 있다. 그래서 응용 코드를 전혀 바꾸지 않고도 템플릿 엔진을 바꾸거나 혼용하는 게 가능하다.

class BaseTemplate(source=None, name=None, lookup=[], encoding='utf8', **settings)[source]

템플릿 어댑터 기반 클래스이자 최소 API

__init__(source=None, name=None, lookup=[], encoding='utf8', **settings)[source]

새 템플릿 만들기. source 매개변수(str 또는 buffer)가 없으면 name 인자를 이용해 템플릿 파일 이름을 추측한다. 서브클래스에선 self.source 및/또는 self.filename이 설정돼 있다고 상정할 수 있다. 둘 모두 문자열이다. lookup, encoding, settings 매개변수는 인스턴스 변수로 저장된다. lookup 매개변수는 디렉터리 경로들을 담은 리스트다. encoding 매개변수는 바이트열이나 파일을 디코딩하는 데 쓰게 된다. settings 매개변수는 엔진별 설정들의 딕셔너리다.

classmethod search(name, lookup=[])[source]

lookup에 지정된 모든 디렉터리에서 이름을 탐색. 일단 확장자 없이, 다음엔 많이 쓰는 확장자들로. 먼저 걸린 것 반환.

classmethod global_config(key, *args)[source]

class.settings에 저장된 전역 설정을 읽거나 설정한다.

prepare(**options)[source]

준비 동작(파싱, 캐싱, …) 수행. 템플릿을 갱신하거나 설정을 바꾸기 위해 다시 호출하는 게 가능해야 한다.

render(*args, **kwargs)[source]

지정한 지역 변수들로 템플릿을 렌더링해서 바이트열 또는 유니코드열 하나를 반환한다. 바이트열인 경우 인코딩이 self.encoding과 일치해야 한다. 이 메소드는 스레드에 안전해야 한다. 지역 변수들이 딕셔너리로(args) 제공될 수도 있고 바로 키워드로(kwargs) 제공될 수도 있다.

view(tpl_name, **defaults)[source]

데코레이터: 핸들러 대신 템플릿을 렌더링. 핸들러에서 다음처럼 동작을 제어할 수 있다.

  • 템플릿 변수들의 dict를 반환하면 그걸로 템플릿을 채운다.

  • dict 아닌 뭔가를 반환하면 view 데코레이터가 템플릿을 처리하지 않고 핸들러 결과를 그대로 반환한다. 예를 들어 HTTPResponse(dict)를 반환해서 autojson이나 기타 castfilter로 JSON을 얻을 수 있다.

template(*args, **kwargs)[source]

렌더링된 템플릿을 문자열 이터레이터로 얻기. 첫 번째 매개변수로 이름이나 파일 이름, 템플릿 문자열을 쓸 수 있다. 템플릿 렌더링 인자를 딕셔너리로 또는 (키워드 인자로) 직접 줄 수 있다.

좋아하는 템플릿 엔진을 위한 어댑터를 작성하거나 기존 어댑터를 이용할 수 있다. 제대로 지원하는 템플릿 엔진이 현재 네 가지 있다.

클래스

URL

데코레이터

렌더링 함수

SimpleTemplate

SimpleTemplate 엔진

view()

template()

MakoTemplate

http://www.makotemplates.org

mako_view()

mako_template()

CheetahTemplate

http://www.cheetahtemplate.org/

cheetah_view()

cheetah_template()

Jinja2Template

http://jinja.pocoo.org/

jinja2_view()

jinja2_template()

MakoTemplate을 기본 템플릿 엔진으로 쓰려면 해당 데코레이터와 렌더링 함수를 임포트하기만 하면 된다.

from bottle import mako_view as view, mako_template as template