Beispiel #1
0
    def dispatch_request(self, *args, **kwargs):
        if request.method.lower() == "POST":
            method_override = request.headers.get("X-HTTP-Method-Override", None)
            if method_override is not None:
                request.method = method_override

        mime_type, serializer = self.negotiate_serializer(*args, **kwargs)

        # Deserialize the incoming request data (if any)
        deserializers = getattr(self, "DESERIALIZERS",
                                current_app.config["TOYBOX_DESERIALIZERS"])

        decoded_data = None
        has_data = request.data is not None and len(request.data) > 0
        if len(deserializers) > 0 and has_data:
            acceptable = False
            for deserializer in deserializers:
                if request.mimetype in deserializer.mime_types:
                    decoded_data = deserializer.deserialize(request.data)
                    acceptable = True
                    break
            if not acceptable:
                raise werkzeug.exceptions.UnsupportedMediaType()
        else:
            decoded_data = None

        # TODO: Document hydration/dehydration process.
        request.dehydrated_decoded_data = decoded_data
        if hasattr(self, "hydrate"):
            decoded_data = self.hydrate(decoded_data)
        request.decoded_data = decoded_data

        # Provide g.etag_object for ETags
        g.etagger = etagger = etags.ETagger(request, serializer)

        # Call parent.
        result = super(NegotiatingMethodView, self)\
                 .dispatch_request(*args, **kwargs)

        # Handle view's result (response)
        if isinstance(result, Response):
            response = result
        else:
            if type(result) is tuple:
                result, status, headers = result
            else:
                status = None
                headers = None

            if hasattr(self, "dehydrate"):
                result = self.dehydrate(result)

            response = Response(serializer.serialize(result),
                                status, headers, mimetype=mime_type)
            response.serialized_with = serializer

        append_vary(response, ["Accept", "Accept-Encoding"])
        # TODO: Move etagging to mixin injecting header using handle_response
        if etagger.etag is not None:
            response.set_etag(etagger.etag) 
        if hasattr(self, "handle_response"):
            response = self.handle_response(response)
        return response