Exemplo n.º 1
0
    def test_deepupdate(self):
        """Test deepupdate function

        Taken from http://stackoverflow.com/questions/38987#8310229
        """
        pluto_original = {
            'name': 'Pluto',
            'details': {
                'tail': True,
                'color': 'orange'
            },
            'age': 1,
        }

        pluto_update = {
            'name': 'Pluutoo',
            'details': {
                'color': 'blue'
            },
            'age': {'category': 'puppy'},
        }

        assert deepupdate(pluto_original, pluto_update) == {
            'name': 'Pluutoo',
            'details': {
                'color': 'blue',
                'tail': True
            },
            'age': {'category': 'puppy'},
        }
Exemplo n.º 2
0
    def test_deepupdate(self):
        """Test deepupdate function

        Taken from http://stackoverflow.com/questions/38987#8310229
        """
        pluto_original = {
            "name": "Pluto",
            "details": {
                "tail": True,
                "color": "orange"
            },
            "age": 1,
        }

        pluto_update = {
            "name": "Pluutoo",
            "details": {
                "color": "blue"
            },
            "age": {
                "category": "puppy"
            },
        }

        assert deepupdate(pluto_original, pluto_update) == {
            "name": "Pluutoo",
            "details": {
                "color": "blue",
                "tail": True
            },
            "age": {
                "category": "puppy"
            },
        }
        def decorator(func):

            @wraps(func)
            def wrapper(*args, **kwargs):

                # If this decorator is used for as an alternative response,
                # return without serializing
                if alt_response:
                    return func(*args, **kwargs)

                # Execute decorated function
                result_raw, status, headers = unpack_tuple_response(
                    func(*args, **kwargs))

                # If return value is a werkzeug BaseResponse, return it
                if isinstance(result_raw, BaseResponse):
                    set_status_and_headers_in_response(
                        result_raw, status, headers)
                    return result_raw

                # Dump result with schema if specified
                if schema is None:
                    result_dump = result_raw
                else:
                    result_dump = schema.dump(result_raw)

                # Store result in appcontext (may be used for ETag computation)
                appcontext = get_appcontext()
                appcontext['result_raw'] = result_raw
                appcontext['result_dump'] = result_dump

                # Build response
                resp = jsonify(self._prepare_response_content(result_dump))
                set_status_and_headers_in_response(resp, status, headers)
                if status is None:
                    resp.status_code = code

                return resp

            # Store doc in wrapper function
            # The deepcopy avoids modifying the wrapped function doc
            wrapper._apidoc = deepcopy(getattr(wrapper, '_apidoc', {}))
            wrapper._apidoc['response'] = deepupdate(
                wrapper._apidoc.get('response', {}),
                doc
            )

            # Document default error response if it's not already there
            if not alt_response:
                wrapper._apidoc['response']['responses']['default'] = \
                    'DEFAULT_ERROR'

                # Indicate which code is the success status code
                # Helps other decorators documenting success response
                wrapper._apidoc['success_status_code'] = code

            return wrapper
Exemplo n.º 4
0
def login_required(func):
    """包装 flask-login 的 login_required 装饰器
    给该函数的 401 响应添加 api doc
    """

    doc = {'responses': {"401": {'description': "未登录,或者 token 已过期"}}}
    func._api_manual_doc = deepupdate(getattr(func, '_api_manual_doc', {}),
                                      doc)

    return login_required_(func)
Exemplo n.º 5
0
        def decorator(func):

            @wraps(func)
            def wrapper(*args, **kwargs):

                # Execute decorated function
                result = func(*args, **kwargs)
                result_raw = result.content

                # Dump result with schema if specified
                if schema is None:
                    result_dump = result_raw
                else:
                    result_dump = schema.dump(result_raw)
                    if MARSHMALLOW_VERSION_MAJOR < 3:
                        result_dump = result_dump.data
                result.content = result_dump
                return result

            # Store doc in wrapper function
            # The deepcopy avoids modifying the wrapped function doc
            wrapper._apidoc = deepupdate(
                deepcopy(getattr(wrapper, '_apidoc', {})), doc)
            return wrapper