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ファイルの表示
CSSやJavaScriptファイルと同様に、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
が今回のファイルです。