Flaskでsitemap.xmlの作成

ちょっとつまずいたのでメモしておきます。

今は、mongoの薄い本を見ながらFlaskのサンプルコード作成しておりまっす。
sitemap.xmlの表示について、ここ(http://flask.pocoo.org/snippets/108/)見ながらやってましたが、ちょっと違う…というか、Python初心者なので上のほうのimportとかも書いてくれないとエラーが出ちゃうし、エラーに???ってなるのでメモ。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os, math, datetime
from datetime import timedelta, datetime, tzinfo, date, time
from flask import Flask, render_template, request, make_response
from flask.ext.pymongo import PyMongo

app = Flask(__name__)
app.debug = True

mongo = PyMongo(app)

@app.route("/")
def index():
    return render_template('index.html', message="Hello")

@app.route("/about")
def about():
    return render_template('about.html', message="Hello")

@app.route("/help")
def help():
    return render_template('help.html', message="Hello")

@app.route('/hello/<name>')
def hello(name=''):
    result = mongo.db.unicorns.update({"name": name}, {"name": name, "gender": "m", "home": "Arrakeen", "worm": False}, upsert=True)
    return render_template('hello.html', name=name, id=result)

app.route('/unicorns')
def unicorns():
    page = request.args.get('page', default=1, type=int)
    page_size = request.args.get('page_size', default=5, type=int)
    skip_size = page * page_size - page_size

    unicorns_count = mongo.db.unicorns.count()

    page_volume = int(math.ceil(unicorns_count / page_size))

    unicorns = mongo.db.unicorns.find({}).sort("name", 1).skip(skip_size).limit(page_size)
    return render_template('unicorns.html', unicorns=unicorns, unicorns_count=unicorns_count, page=page, page_size=page_size, page_volume=page_volume)

# a route for generating sitemap.xml
@app.route('/sitemap.xml', methods=['GET'])
def sitemap():
    """Generate sitemap.xml. Makes a list of urls and date modified."""
    pages=[]
    ten_days_ago = datetime.now()
    # static pages
    for rule in app.url_map.iter_rules():
        if "GET" in rule.methods and len(rule.arguments)==0:
            pages.append([rule.rule,ten_days_ago])

    response = make_response(render_template('sitemap.xml', pages=pages))
    response.headers["Content-Type"] = "application/xml"

    return response

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 5000))
    app.run(port=port)

これで、templateにsitemap.xmlを置くと、今ここに定義している全ルートがサイトマップXMLに表示されるよ!

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    {% for page in pages %}
    <url>
        <loc>{{page[0]|safe}}</loc>
        <lastmod>{{page[1]}}</lastmod>
    </url>
    {% endfor %}
</urlset>
スポンサーリンク
hige1
hige1

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
hige1