Search code examples
pythongoogle-app-enginevirtualenvwebapp2

cannot access webserver resources using virtualenv and webapp2


I wanted to create a simple app using webapp2. Because I have Google App Engine installed, and I want to use it outside of GAE, I followed the instructions on this page: http://webapp-improved.appspot.com/tutorials/quickstart.nogae.html

This all went well, my main.py is running, it is handling requests correctly. However, I can't access resources directly.

http://localhost:8080/myimage.jpg or http://localhost:8080/mydata.json

always returns a 404 resource not found page. It doesn't matter if I put the resources on the WebServer/Documents/ or in the folder where the virtualenv is active.

Please help! :-)

(I am on a Mac 10.6 with Python 2.7)


Solution

  • (Adapted from this question)

    Looks like webapp2 doesn't have a static file handler; you'll have to roll your own. Here's a simple one:

    import mimetypes
    
    class StaticFileHandler(webapp2.RequestHandler):
        def get(self, path):
            # edit the next line to change the static files directory
            abs_path = os.path.join(os.path.dirname(__file__), path)
            try:
                f = open(abs_path, 'r')
                self.response.headers.add_header('Content-Type', mimetypes.guess_type(abs_path)[0])
                self.response.out.write(f.read())
                f.close()
            except IOError: # file doesn't exist
                self.response.set_status(404)
    

    And in your app object, add a route for StaticFileHandler:

    app = webapp2.WSGIApplication([('/', MainHandler), # or whatever it's called
                                   (r'/static/(.+)', StaticFileHandler), # add this
                                   # other routes
                                  ])
    

    Now http://localhost:8080/static/mydata.json (say) will load mydata.json.

    Keep in mind that this code is a potential security risk: It allows any visitors to your website to read everything in your static directory. For this reason, you should keep all your static files to a directory that doesn't contain anything you'd like to restrict access to (e.g. the source code).