def get(self, filename): image = Image.get_by_filename(filename) if not image: return self.abort(404) # Gather the information we take from the user. identifier = self.request.get('identifier', '') ip_address = self.request.remote_addr referrer = self.request.referrer user_agent = self.request.headers.get('User-Agent', '') visitor_uuid = self.request.cookies.get('VISITOR_UUID', '') # If they're not in our database, create a new entity to track them. visitor = Visitor.get_by_uuid(visitor_uuid) if visitor is None: visitor = Visitor() visitor.put() visit = Visit(identifier=identifier, ip_address=ip_address, user_agent=user_agent, referrer=referrer, image=image.key, visitor=visitor.key) visit.put() # Dispatch a task to send the visit to keen.io for analysis. visit_key = visit.key.urlsafe() logging.info('Dispatching task to process {visit_key}' .format(visit_key=visit_key)) taskqueue.add(url=self.uri_for('analytics'), params={'visit_key': visit_key}) self.response.content_type = str(image.content_type) self.response.set_cookie(key='VISITOR_UUID', value=visitor.uuid) self.response.out.write(image.data)
def post(self): error = None user = users.get_current_user() if not user: return self.abort(404) filename = self.request.POST.get('filename', '') image_source = self.request.POST.get('image_source', '') if Image.get_by_filename(filename): error = ('File with filename {filename} already exists.' .format(filename=filename)) logging.error(error) try: response = urlfetch.fetch(image_source) except urlfetch.DownloadError as e: error = ('Failed to download file \'{filename}\'' .format(filename=filename)) logging.exception(e.message) if response.status_code == 404: error = '{filename} not found.'.format(filename=filename) if error is not None: self.session.add_flash(value=error, level='error') return self.render_to_response('images.haml') # Store the image in the datastore and ensure the write is fully applied # before redirecting. image_data = response.content content_type = response.headers.get('Content-Type', '') image = Image(data=image_data, filename=filename, user=user, content_type=content_type) image.put().get() return self.redirect_to('image')
def test_get_by_filename(self): image = Image(filename=self.DEFAULT_FILENAME) image.put() self.assertEqual(image.key, Image.get_by_filename(image.filename).key) self.assertIsNone(Image.get_by_filename('not.jpg'))