API 참조¶
대부분 자동 생성된 API 문서다. 보틀이 처음이라면 서술식으로 된 따라하기가 더 유용할 수 있다.
모듈들¶
모듈에는 여러 함수, 상수, 예외가 정의돼 있다.
- 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
라우팅¶
보틀은 Bottle
인스턴스들의 스택을 유지하며 (app()
및 AppStack
참고) 스택 최상단 인스턴스를 일부 모듈 층위 함수와 데코레이터에서 기본 응용으로 쓴다.
- route(path, method='GET', callback=None, **options)¶
- get(...)¶
- post(...)¶
- put(...)¶
- delete(...)¶
현재 기본 응용에 라우트를 설치하는 데코레이터. 자세한 내용은
Bottle.route()
참고.
- error(...)¶
현재 기본 응용에 오류 핸들러를 설치하는 데코레이터. 자세한 내용은
Bottle.error()
참고.
WSGI 및 HTTP 유틸리티¶
자료 구조¶
- class MultiDict(*a, **k)[source]¶
이 dict는 키별로 여러 값을 저장한다는 점을 빼면 일반 dict와 똑같이 동작한다. 키를 주면 최신 값만 반환한다. 전체 값 리스트에 접근하는 데 쓸 수 있는 메소드들이 따로 있다.
- get(key, default=None, index=- 1, type=None)[source]¶
키에 대한 최신 값을 반환.
- Parameters
default – 키가 없거나 타입 변환이 실패한 경우 반환할 기본값.
index – 값 리스트에 대한 색인.
type – 지정돼 있으면 그 콜러블을 이용해 값을 특정 타입으로 캐스트한다. 콜러블에서 예외를 던지면 막고서 기본값을 반환한다.
- getone(key, default=None, index=- 1, type=None)¶
다른 multi-dict API (Django)를 흉내내기 위한 WTForms 에일리어스.
- getlist(key)¶
키에 대한 (비어 있을 수 있는) 값 리스트 반환.
- 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)는 유니코드 딕셔너리를 원한다.
- 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_
로 시작하지 않는 키들의 목록.
- class ResourceManager(base='./', opener=<built-in function open>, cachemode='all')[source]¶
탐색 경로 목록을 관리하고 응용 관련 자원(파일)을 찾아서 여는 걸 돕는 클래스.
- Parameters
base –
add_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__)
- 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’ 헤더의 현재 값.
- filename[source]¶
클라이언트 파일 시스템 상의 파일 이름. 단 파일 시스템 호환성이 보장되도록 정규화 돼 있음. 빈 파일 이름은 ‘empty’로 반환.
최종 파일 이름에서는 ASCII 문자, 숫자, 대시, 밑줄, 마침표만 허용한다. 가능한 경우 강세 표시를 없앤다. 공백을 대시 한 개로 바꾼다. 앞이나 뒤의 마침표 및 대시를 제거한다. 파일 이름 길이를 255문자로 제한한다.
- save(destination, overwrite=False, chunk_size=65536)[source]¶
파일을 디스크에 저장하거나 내용물을 열린 파일(스러운) 객체로 복사한다. destination이 디렉터리면 경로에
filename
을 덧붙인다. 기본적으로 기존 파일을 덮어 쓰지 않는다 (IOError).- Parameters
destination – 파일 경로나 디렉터리, 파일(스러운) 객체.
overwrite – 참이면 기본 파일을 교체. (기본값: False)
chunk_size – 한 번에 읽을 바이트 수. (기본값: 64kb)
예외¶
Bottle
클래스¶
- class Bottle(catchall=True, autojson=True)[source]¶
각 Bottle 객체는 하나의 구별된 웹 응용을 나타내며, 라우트와 콜백, 플러그인, 자원, 설정으로 구성된다. 인스턴스는 호출 가능한 WSGI 응용이다.
- Parameters
catchall – 참(기본)이면 모든 예외를 처리한다. 디버깅용 미들웨어가 예외를 처리하게 하려면 끄면 된다.
- config¶
앱 설정을 위한
ConfigDict
.
- resources¶
응용 파일들을 위한
ResourceManager
.
- add_hook(name, func)[source]¶
훅에 콜백 붙이기. 현재 세 가지 훅이 구현돼 있다.
- before_request
각 요청 전에 한 번 실행. 요청 문맥은 사용할 수 있지만 아직 라우팅은 이뤄지지 않은 상태.
- after_request
각 요청 후에 그 결과와 상관없이 한 번 실행.
- app_reset
Bottle.reset()
이 호출될 때마다 호출.
- hook(name)[source]¶
훅에 콜백을 붙이는 데코레이터 반환. 자세한 내용은
add_hook()
참고.
- mount(prefix, app, **options)[source]¶
응용(
Bottle
또는 단순 WSGI)을 특정 URL 프리픽스에 붙이기. 예:root_app.mount('/admin/', admin_app)
- Parameters
prefix – 경로 프리픽스 내지 마운트 지점. 슬래시로 끝나면 그 슬래시가 꼭 있어야 한다.
app –
Bottle
인스턴스 또는 WSGI 응용.
다른 매개변수들은 모두 하위
route()
호출로 전달된다.
- merge(routes)[source]¶
다른
Bottle
응용의 라우트나Route
객체 리스트를 이 응용으로 병합. 라우트의 ‘소유자’가 그대로 유지된다. 즉Route.app
속성이 바뀌지 않는다.
- install(plugin)[source]¶
plugin을 플러그인 목록에 추가하고 이 응용의 모든 라우트에 적용될 수 있게 준비. plugin은 단순 데코레이터일 수도 있고
Plugin
API를 구현하는 객체일 수도 있다.
- uninstall(plugin)[source]¶
플러그인 제거. 특정 플러그인을 제거하려면 인스턴스를 주면 되고, 어떤 타입의 모든 플러그인을 제거하려면 그 타입 객체를,
name
속성이 일치하는 모든 플러그인을 제거하려면 문자열을, 모든 플러그인을 제거하려면True
를 주면 된다. 제거된 플러그인 목록을 반환한다.
- match(environ)[source]¶
걸리는 라우트를 검색해서 (
Route
, urlargs) 튜플을 반환. 두 번째 값은 URL에서 추출한 매개변수들을 담은 딕셔너리다. 불일치 시HTTPError
(404/405)를 던진다.
- 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()
참고.)
- 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()
데코레이터에 추가로 준 키워드 인자들이 이 딕셔너리에 저장된다. 라우트별 플러그인 설정 및 메타데이터에 쓰인다.
Request
객체¶
Request
클래스는 WSGI 환경을 포장한 것이며 양식 데이터, 쿠키, 파일 업로드, 기타 메타데이터를 파싱하고 접근하기 위한 유용한 메소드들을 제공한다. 대부분 속성이 읽기 전용이다.
- Request¶
alias of
bottle.BaseRequest
- class BaseRequest(environ=None)[source]¶
WSGI 환경 딕셔너리들의 래퍼에 여러 편리한 접근 메소드와 프로퍼티를 더한 것. 대부분 읽기 전용이다.
요청에 새 속성을 추가하면 실제로는 환경 딕셔너리에 (‘bottle.request.ext.<name>’으로) 추가된다. 요청별 데이터를 저장하고 접근하려 할 때 권장하는 방식이다.
- environ¶
포장된 WSGI environ 딕셔너리. 유일한 진짜 속성이다. 다른 속성들은 사실 모두 읽기 전용 프로퍼티다.
- property path¶
PATH_INFO
값 앞에 슬래시를 딱 한 개 붙인 것. (이상 동작하는 클라이언트에 대처하고 “빈 경로” 경우를 피하기 위해.)
- property method¶
REQUEST_METHOD
값을 대문자 문자열로.
- headers[source]¶
대소문자 구별 없이 HTTP 요청 헤더에 접근할 수 있게 해 주는
WSGIHeaderDict
.
- cookies[source]¶
쿠키들을 파싱해서 담은
FormsDict
. 서명된 쿠키가 디코딩되어 있지 않다. 서명된 쿠키에는get_cookie()
사용.
- get_cookie(key, default=None, secret=None)[source]¶
쿠키 내용물 반환. 서명된 쿠키를 읽으려면 secret이 쿠키 생성 시 사용한 값과 일치해야 한다. (
BaseResponse.set_cookie()
참고.) 뭔가 잘못되면 (쿠키가 없거나 서명이 틀리면) 기본값을 반환한다.
- query[source]¶
query_string
을 파싱해서 담은FormsDict
. 이 값들을 “URL 인자”나 “GET 매개변수”라고도 하는데,Router
에서 제공하는 “URL 와일드카드”와 혼동하지 말아야 한다.
- forms[source]¶
url-encoded나 multipart/form-data로 인코딩된 POST 또는 PUT 요청 바디의 양식 값들을 파싱한 것.
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.
- property url¶
호스트 이름과 스킴을 포함한 전체 요청 URI. 앱이 역방향 프록시나 로드 밸런서 뒤에서 도는데 이상한 결과가 나온다면
X-Forwarded-Host
헤더가 올바로 설정되는지 확인해 보자.
- urlparts[source]¶
url
문자열을urlparse.SplitResult
튜플로 만든 것. 그 튜플에는 (scheme, host, path, query_string, fragment)가 들어 있는데, fragment는 서버에게 보이지 않으므로 항상 비어 있다.
- property fullpath¶
(존재 시)
script_name
을 포함한 요청 경로.
- 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 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. 악의적 클라이언트가 이 정보를 위조할 수 있다는 점에 유의하자.
모듈 층위의 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 – 이름-값 짝의 딕셔너리 또는 리스트.
추가로 준 키워드 인자들은 헤더 목록에 추가된다. 헤더 이름의 밑줄이 대시로 바뀐다.
- property status_line¶
문자열로 된 HTTP 상태 행. (예:
404 Not Found
)
- property status_code¶
정수로 된 HTTP 상태 코드. (예: 404)
- property status¶
HTTP 응답 상태를 바꾸기 위한 쓰기 가능 프로퍼티. 숫자 코드 (100-999) 또는 자체 이유 문구(예: “404 Brain not found”)가 있는 문자열을 받는다. 그에 따라
status_line
과status_code
가 모두 갱신된다. 반환 값은 항상 상태 행 문자열이다.
- property headers¶
HeaderDict
인스턴스. 응답 헤더들에 대한 대소문자 구별 없는 dict스러운 뷰.
- property headerlist¶
WSGI에 부합하는 (헤더, 값) 튜플 리스트.
- content_type¶
‘Content-Type’ 헤더의 현재 값.
- content_length¶
‘Content-Length’ 헤더의 현재 값.
- expires¶
‘Expires’ 헤더의 현재 값.
- property charset¶
content-type 헤더에 지정된 문자셋 반환. (기본값: utf8)
- set_cookie(name, value, secret=None, **options)[source]¶
새 쿠키를 만들거나 기존 쿠키를 교체. secret 매개변수가 설정돼 있으면 서명된 쿠키(아래에서 설명)를 만든다.
- Parameters
name – 쿠키 이름.
value – 쿠키 값.
secret – 서명된 쿠키에 필요한 서명 키.
더불어 이 메소드는
cookie.Morsel
에서 지원하는 모든 RFC 2109 속성을 받는다. 다음이 포함된다.- Parameters
max_age – 초 단위 최대 수명. (기본값: None)
expires – datetime 객체 또는 유닉스 타임스탬프. (기본값: None)
domain – 쿠키 읽는 게 허용되는 도메인. (기본값: 현재 도메인)
path – 쿠키를 지정한 경로로 제한. (기본값: 현재 경로)
secure – 쿠키를 HTTPS 연결로 제한. (기본값: 꺼짐)
httponly – 클라이언트 측 자바스크립트에서 이 쿠키를 읽지 못하게 하기. (기본값: 꺼짐. 파이썬 2.6 이상 필요.)
expires와 max_age 어느 쪽도 설정하지 않으면 (기본값) 브라우저 세션이 끝날 때 (브라우저 창이 닫히자마자) 쿠키가 만료된다.
서명된 쿠키에는 pickle 가능한 어떤 객체든 저장할 수 있으며 암호학적 서명을 해서 변조를 막는다. 대부분 브라우저에서 쿠키가 4kb로 제한돼 있다는 걸 잊지 말자.
경고: 서명된 쿠키가 암호화되는 건 아니다. (클라이언트가 여전히 내용물을 볼 수 있다.) 그리고 복사 방지가 되는 것도 아니다. (클라이언트가 이전 쿠키를 재사용할 수 있다.) 주된 의도는 pickle 처리를 안전하게 만드는 것이지, 클라이언트 쪽에 비밀 정보를 저장하는 게 아니다.
- 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
나 다른 응답 타입에 대해선 하지 않는다는 점이다.
템플릿¶
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 매개변수는 엔진별 설정들의 딕셔너리다.
- view(tpl_name, **defaults)[source]¶
데코레이터: 핸들러 대신 템플릿을 렌더링. 핸들러에서 다음처럼 동작을 제어할 수 있다.
템플릿 변수들의 dict를 반환하면 그걸로 템플릿을 채운다.
dict 아닌 뭔가를 반환하면 view 데코레이터가 템플릿을 처리하지 않고 핸들러 결과를 그대로 반환한다. 예를 들어 HTTPResponse(dict)를 반환해서 autojson이나 기타 castfilter로 JSON을 얻을 수 있다.
- template(*args, **kwargs)[source]¶
렌더링된 템플릿을 문자열 이터레이터로 얻기. 첫 번째 매개변수로 이름이나 파일 이름, 템플릿 문자열을 쓸 수 있다. 템플릿 렌더링 인자를 딕셔너리로 또는 (키워드 인자로) 직접 줄 수 있다.
좋아하는 템플릿 엔진을 위한 어댑터를 작성하거나 기존 어댑터를 이용할 수 있다. 제대로 지원하는 템플릿 엔진이 현재 네 가지 있다.
클래스 |
URL |
데코레이터 |
렌더링 함수 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
MakoTemplate
을 기본 템플릿 엔진으로 쓰려면 해당 데코레이터와 렌더링 함수를 임포트하기만 하면 된다.
from bottle import mako_view as view, mako_template as template