파이썬 보틀의 기본 4 특수 라우팅 (자신의 필터) 이야기

정규식 문자열 URL 프래그먼트를 python 값으로 변환하는 역방향 호출 가능 객체 세 요소를 반환하는 함수를 만들고 자체 필터를 라우터에 추가할 수 있습니다.

예제.py
app = Bottle()

def list_filter(config):
    ''' 正規表現文字列'''
    delimiter = config or ','
    regexp = r'\d+(%s\d)*' % re.escape(delimiter)
    def to_python(match): #URLフラグメントをpython値に変換する
        return map(int, match.split(delimiter))
    def to_url(numbers): #その逆の呼び出し可能オブジェクト
        return delimiter.join(map(str, numbers))
    return regexp, to_python, to_url
app.router.add_filter('list', list_filter)
@app.route('/follow/<ids:list>')
def follow_users(ids):
    for id in ids:
        ...

다음 스니펫은 정규식을 사용하는 1,2,3,4와 같은 1자리 숫자를 쉼표로 구분한 라우팅을 가능하게 합니다.
regexp = r'\d+(%s\d)*' % re.escape(delimiter)

ex5.py
# bottleの基本5
from bottle import *
import re
app = Bottle()
def list_filter(config):
    ''' Matches a comma separated list of numbers. '''
    delimiter = config or ','
    regexp = r'\d+(%s\d)*' % re.escape(delimiter)
    def to_python(match):
        return map(int, match.split(delimiter))
    def to_url(numbers):
        return delimiter.join(map(str, numbers))
    return regexp, to_python, to_url
app.router.add_filter('list', list_filter)
@app.route('/follow/<ids:list>')
def follow_users(ids):
    x="\n".join(['<h3>%s</h3>'%x for x in ids])
    for id in ids:
        print(id)
    return x
@app.error(404)
def error404(error):
  return template("<h1>{{error_message}}</h1>", error_message="404 ページが存在しません。")
HOST,PORT='localhost',8080
if __name__ =='__main__':
    app.run(host=HOST,port=PORT)

위의 프로그램을 실행하면 http://localhost:8080/follow/1,2,3


매개 변수는 배열을받을 수 있습니다.

또한 URL을 http://localhost:8080/follow/1,2,3,a로 하면 다음과 같이 됩니다.
regexp = r'\d+(%s\d)*' % re.escape(delimiter) 이 정규화 필터에서 제외되기 때문에

됩니다.

Rest API 등으로 가변 길이 파라미터를 사용하고 싶을 때 등의 예를 어떻게 나타냅니다.
Url http://localhost:8080/follow/도쿄, 지바, 이바라키


ex6.py
# bottleの基本6
from bottle import *
import re
app = Bottle()

def list_filter(config):
    ''' Matches a comma separated list of numbers. '''
    delimiter = config or ','
    regexp = r'.*' #文字だったらなんでも許可する

    def to_python(match):
        return map(str, match.split(delimiter))

    def to_url(numbers):
        return delimiter.join(map(str, numbers))

    return regexp, to_python, to_url

app.router.add_filter('list', list_filter)

@app.route('/follow/<ids:list>')
def follow_users(ids):
    x="\n".join(['<h3>%s</h3>'%x for x in ids])
    for id in ids:
        print(id)
    return x
@app.error(404)
def error404(error):
  return template("<h1>{{error_message}}</h1>", error_message="404 ページが存在しません。")
HOST,PORT='localhost',8080
if __name__ =='__main__':
    app.run(host=HOST,port=PORT)

좋은 웹페이지 즐겨찾기