Python2 + Bottleで、XMLファイルそのものをレスポンスとして返す

Bottleでは、

@route("/xml")
def xml_response():
    response.content_type = 'xml/application'
    xml = '<?xml version="1.0" encoding="UTF-8"?><foo>Hello xml!</foo>'
    return xml

とすれば、XMLのレスポンスを返すことができます。
How to send xml/application format in bottle? - Stack Overflow

 
ただ、XMLファイルそのものをレスポンスとして返す方法で悩んだため、メモを残しておきます。

 

環境

  • Windows10 x64
  • Python 2.x
  • Bottle 0.12.9

 
なお、表示するXMLファイルは、

<?xml version="1.0" encoding="UTF-8"?>
<foo>Hello root dir xml!</foo>

のようなものとします。

 

XMLファイルの表示

CSSJavaScriptファイルと同様に、static_file()を使います。

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_DIR = os.path.join(BASE_DIR, "static")

@route("/root")
def xml_at_root():
    # ルート直下にxmlがある場合
    return static_file("root_dir.xml", root="")
    
@route("/static")
def xml_at_static_dir():
    # staticフォルダの下にxmlがある場合
    return static_file("static_dir.xml", root=os.path.join(STATIC_DIR, "xml"))

 
これで、ブラウザでアクセスした時に、上記のXMLファイルの内容が表示されます。

 

XMLファイルのダウンロード

XMLファイルを強制的にダウンロードしたい場合は、static_file()download引数を使います。

引数の値については、ソースコードのコメントにもありますが、

  • True : 元々のファイル名で、ダウンロード
  • 任意の値 : ファイル名を任意の値にして、ダウンロード

となります。
static_file() | bottle/bottle.py at 0.12.9 · bottlepy/bottle

@route("/download-original")
def download_xml():
    # 元ファイルの名前で、強制的にファイルをダウンロード
    return static_file("static_dir.xml", root=os.path.join(STATIC_DIR, "xml"), download=True)

@route("/download-rename")
def xml_dialog():
    # downloadに指定したファイル名で、強制的にファイルをダウンロード
    return static_file("static_dir.xml", root=os.path.join(STATIC_DIR, "xml"), download="rename.xml")

 

ソースコード

GitHubに上げました。
thinkAmi-sandbox/Bottle-sample: Bottle (python web framework) : sample codes

  • serve_xml.py
  • root_dir.xml
  • static/xml/static_dir.xml

が今回のファイルです。

 

参考