pngtile/wsgi.py
author Tero Marttila <terom@fixme.fi>
Mon, 25 Jan 2010 04:59:38 +0200
changeset 89 02e5b9b08881
parent 47 201257cbd887
child 90 1c317e0628a7
permissions -rw-r--r--
rework wsgi.py
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Our WSGI web interface, which can serve the JS UI and any .png tiles via HTTP.
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
from werkzeug import Request, Response, responder
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
from werkzeug import exceptions
42
a5bca7b0cd8a get DATA_ROOT from os.environ, fix use of prefix for dir view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
     7
import os.path, os
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
import pypngtile as pt
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    11
## Settings
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    12
# path to images
42
a5bca7b0cd8a get DATA_ROOT from os.environ, fix use of prefix for dir view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    13
DATA_ROOT = os.environ.get("PNGTILE_DATA_PATH") or os.path.abspath('data/')
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    15
# only open each image once
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
IMAGE_CACHE = {}
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    18
# width of a tile
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
TILE_WIDTH = 256
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
TILE_HEIGHT = 256
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
43
fcd818eb5a71 center initial view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    22
# max. output resolution to allow
fcd818eb5a71 center initial view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    23
MAX_PIXELS = 1920 * 1200
fcd818eb5a71 center initial view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    24
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    25
def dir_url (prefix, name, item) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    26
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    27
        Join together an absolute URL prefix, an optional directory name, and a directory item
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    28
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    29
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    30
    url = prefix
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    31
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    32
    if name :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    33
        url = os.path.join(url, name)
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    34
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    35
    url = os.path.join(url, item)
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    36
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    37
    return url
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    38
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    39
def dir_list (dir_path) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    40
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    41
        Yield a series of directory items to show for the given dir
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    42
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    43
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    44
    # link to parent
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    45
    yield '..'
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    46
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    47
    for item in os.listdir(dir_path) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    48
        path = os.path.join(dir_path, item)
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    49
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    50
        # skip dotfiles
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    51
        if item.startswith('.') :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    52
            continue
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    53
        
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    54
        # show dirs
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    55
        if os.path.isdir(path) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    56
            yield item
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    57
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    58
        # examine ext
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    59
        base, ext = os.path.splitext(path)
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    60
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    61
        # show .png files with a .cache file
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    62
        if ext == '.png' and os.path.exists(base + '.cache') :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    63
            yield item
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    64
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    65
### Render HTML data
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    66
def render_dir (req, name, path) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    67
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    68
        Directory index
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    69
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    70
31
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    71
    prefix = os.path.dirname(req.script_root).rstrip('/')
42
a5bca7b0cd8a get DATA_ROOT from os.environ, fix use of prefix for dir view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    72
    script_prefix = req.script_root
31
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    73
    name = name.rstrip('/')
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    74
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    75
    return """\
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    76
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    77
    <head>
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    78
        <title>Index of %(dir)s</title>
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    79
        <link rel="Stylesheet" type="text/css" href="%(prefix)s/static/style.css">
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    80
    </head>
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    81
    <body>
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    82
        <h1>Index of %(dir)s</h1>
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    83
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    84
        <ul>
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    85
%(listing)s
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    86
        </ul>
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    87
    </body>
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    88
</html>""" % dict(
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    89
        prefix          = prefix,
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    90
        dir             = '/' + name,
31
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    91
        
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    92
        listing         = "\n".join(
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    93
            # <li> link
31
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    94
            """<li><a href="%(url)s">%(name)s</a></li>""" % dict(
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    95
                # URL to dir
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    96
                url         = dir_url(script_prefix, name, item),
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    97
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    98
                # item name
31
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    99
                name        = item,
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   100
            ) for item in dir_list(path)
31
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   101
        ),
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   102
    )
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   103
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   104
def render_img_viewport (req, name, image) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   105
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   106
        HTML for image
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   107
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   108
    
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   109
    # a little slow, but not so bad - two stats(), heh
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   110
    info = image.info()
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   111
    img_width, img_height = info['img_width'], info['img_height']
43
fcd818eb5a71 center initial view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   112
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
    return """\
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
    <head>
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
        <title>%(title)s</title>
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
        <script src="%(prefix)s/static/prototype.js" type="text/javascript"></script>
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
        <script src="%(prefix)s/static/dragdrop.js" type="text/javascript"></script>
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
        <script src="%(prefix)s/static/builder.js" type="text/javascript"></script>
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
        <script src="%(prefix)s/static/tiles2.js" type="text/javascript"></script>
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
        <link rel="Stylesheet" type="text/css" href="%(prefix)s/static/style.css">
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
    </head>
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
    <body>
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
        <div id="wrapper">
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
            <div id="viewport" style="width: 100%%; height: 100%%">
39
eeedb6c2f7c0 zoom button UI
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   126
                <div class="overlay">
eeedb6c2f7c0 zoom button UI
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   127
                    <input type="button" id="btn-zoom-in" value="Zoom In" />
eeedb6c2f7c0 zoom button UI
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   128
                    <input type="button" id="btn-zoom-out" value="Zoom Out" />
40
5454d2e2f633 add link-to-image feature
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   129
                    <a class="link" id="lnk-image" href="#"></a>
39
eeedb6c2f7c0 zoom button UI
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   130
                </div>
eeedb6c2f7c0 zoom button UI
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   131
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
                <div class="substrate"></div>
47
201257cbd887 add a simple Loading... background
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   133
201257cbd887 add a simple Loading... background
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   134
                <div class="background">
201257cbd887 add a simple Loading... background
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   135
                    Loading...
201257cbd887 add a simple Loading... background
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   136
                </div>
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
            </div>
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
        </div>
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
        <script type="text/javascript">
43
fcd818eb5a71 center initial view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   141
            var tile_source = new Source("%(tile_url)s", %(tile_width)d, %(tile_height)d, -4, 0, %(img_width)d, %(img_height)d);
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
            var main = new Viewport(tile_source, "viewport");
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
        </script>
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
    </body>
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
</html>""" % dict(
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   146
        title           = name,
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
        prefix          = os.path.dirname(req.script_root).rstrip('/'),
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
        tile_url        = req.url,
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
        tile_width      = TILE_WIDTH,
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
        tile_height     = TILE_HEIGHT,
43
fcd818eb5a71 center initial view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   152
fcd818eb5a71 center initial view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   153
        img_width       = img_width,
fcd818eb5a71 center initial view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   154
        img_height      = img_height,
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
    )
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
34
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   157
def scale_by_zoom (val, zoom) :
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   158
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   159
        Scale coordinates by zoom factor
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   160
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   161
34
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   162
    if zoom > 0 :
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   163
        return val << zoom
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   164
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   165
    elif zoom > 0 :
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   166
        return val >> -zoom
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   167
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   168
    else :
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   169
        return val
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   170
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   171
### Render PNG Data
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   172
def render_img_tile (image, x, y, zoom, width=TILE_WIDTH, height=TILE_HEIGHT) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   173
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   174
        Render given tile, returning PNG data
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   175
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   176
34
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   177
    return image.tile_mem(
40
5454d2e2f633 add link-to-image feature
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   178
        width, height, 
34
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   179
        scale_by_zoom(x, -zoom), scale_by_zoom(y, -zoom), 
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   180
        zoom
a387bc77ad52 implement zoom
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   181
    )
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   183
def render_img_region (image, cx, cy, zoom, width, height) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   184
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   185
        Render arbitrary tile, returning PNG data
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   186
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   187
40
5454d2e2f633 add link-to-image feature
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   188
    x = scale_by_zoom(cx - width / 2, -zoom)
5454d2e2f633 add link-to-image feature
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   189
    y = scale_by_zoom(cy - height / 2, -zoom)
5454d2e2f633 add link-to-image feature
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   190
43
fcd818eb5a71 center initial view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   191
    # safely limit
fcd818eb5a71 center initial view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   192
    if width * height > MAX_PIXELS :
fcd818eb5a71 center initial view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   193
        raise exceptions.Forbidden("Image too large: %d * %d > %d" % (width, height, MAX_PIXELS))
fcd818eb5a71 center initial view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   194
40
5454d2e2f633 add link-to-image feature
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   195
    return image.tile_mem(
5454d2e2f633 add link-to-image feature
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   196
        width, height,
5454d2e2f633 add link-to-image feature
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   197
        x, y,
5454d2e2f633 add link-to-image feature
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   198
        zoom
43
fcd818eb5a71 center initial view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   199
    )
40
5454d2e2f633 add link-to-image feature
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   200
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   201
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   202
### Manipulate request data
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   203
def get_req_path (req) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   204
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   205
        Returns the name and path requested
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   206
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   207
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
    # path to image
31
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   209
    image_name = req.path.lstrip('/')
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
    
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
    # build absolute path
31
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   212
    image_path = os.path.abspath(os.path.join(DATA_ROOT, image_name))
42
a5bca7b0cd8a get DATA_ROOT from os.environ, fix use of prefix for dir view
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   213
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
    # ensure the path points inside the data root
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
    if not image_path.startswith(DATA_ROOT) :
31
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   216
        raise exceptions.NotFound(image_name)
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   217
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   218
    return image_name, image_path
31
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   219
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   220
def get_image (name, path) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   221
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   222
        Gets an Image object from the cache, ensuring that it is cached
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   223
    """
31
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   224
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
    # get Image object
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   226
    if path in IMAGE_CACHE :
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
        # get from cache
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   228
        image = IMAGE_CACHE[path]
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
    else :
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   231
        # open
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   232
        image = pt.Image(path)
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   233
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   234
        # check
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   235
        if image.status() not in (pt.CACHE_FRESH, pt.CACHE_STALE) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   236
            raise exceptions.InternalServerError("Image cache not available: %s" % name)
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   237
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   238
        # load
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   239
        image.open()
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
        # cache
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   242
        IMAGE_CACHE[path] = image
31
7eec7486a0af dir index view, report if image not cached
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   243
    
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   244
    return image
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   245
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   246
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   247
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   248
### Handle request
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   249
def handle_dir (req, name, path) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   250
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   251
        Handle request for a directory
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   252
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   253
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   254
    return Response(render_dir(req, name, path), content_type="text/html")
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   255
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   256
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   257
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   258
def handle_img_viewport (req, image, name) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   259
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   260
        Handle request for image viewport
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   261
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   262
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   263
    # viewport
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   264
    return Response(render_img_viewport(req, name, image), content_type="text/html")
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   265
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   266
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   267
def handle_img_region (req, image) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   268
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   269
        Handle request for an image region
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   270
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   271
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   272
    # specific image
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   273
    width = int(req.args['w'])
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   274
    height = int(req.args['h'])
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   275
    cx = int(req.args['cx'])
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   276
    cy = int(req.args['cy'])
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   277
    zoom = int(req.args.get('zl', "0"))
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   278
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   279
    # yay full render
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   280
    return Response(render_img_region(image, cx, cy, zoom, width, height), content_type="image/png")
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   281
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   282
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   283
def handle_img_tile (req, image) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   284
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   285
        Handle request for image tile
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   286
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   287
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   288
    # tile
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   289
    x = int(req.args['x'])
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   290
    y = int(req.args['y'])
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   291
    zoom = int(req.args.get('zl', "0"))
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   292
        
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   293
    # yay render
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   294
    return Response(render_img_tile(image, x, y, zoom), content_type="image/png")
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   295
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   296
## Dispatch req to handle_img_*
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   297
def handle_img (req, name, path) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   298
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   299
        Handle request for an image
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   300
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   301
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   302
    # get image object
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   303
    image = get_image(name, path)
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   304
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   305
    # what view?
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   306
    if not req.args :
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   307
        return handle_img_viewport(req, image, name)
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   308
40
5454d2e2f633 add link-to-image feature
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   309
    elif 'w' in req.args and 'h' in req.args and 'cx' in req.args and 'cy' in req.args :
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   310
        return handle_img_region(req, image)
40
5454d2e2f633 add link-to-image feature
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   311
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
    elif 'x' in req.args and 'y' in req.args :
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   313
        return handle_img_tile(req, image)
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   314
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   315
    else :
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   316
        raise exceptions.BadRequest("Unknown args")
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   317
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   318
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   319
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   320
## Dispatch request to handle_*
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   321
def handle_req (req) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   322
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   323
        Main request handler
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   324
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   325
    
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   326
    # decode req
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   327
    name, path = get_req_path(req)
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   328
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   329
    # determine dir/image
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   330
    if os.path.isdir(path) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   331
        # directory
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   332
        return handle_dir(req, name, path)
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   333
    
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   334
    elif not os.path.exists(path) :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   335
        # no such file
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   336
        raise exceptions.NotFound(name)
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   337
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   338
    elif not name or not name.endswith('.png') :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   339
        # invalid file
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   340
        raise exceptions.BadRequest("Not a PNG file")
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   341
    
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   342
    else :
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   343
        # image
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   344
        return handle_img(req, name, path)
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   345
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   346
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   347
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   348
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   349
@responder
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   350
def application (env, start_response) :
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   351
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   352
        Main WSGI entry point
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   353
    """
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   354
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   355
    req = Request(env, start_response)
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   356
    
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   357
    try :
89
02e5b9b08881 rework wsgi.py
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   358
        return handle_req(req)
30
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   359
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   360
    except exceptions.HTTPException, e :
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   361
        return e
53e99e552122 move the python/web code in
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   362