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 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
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)
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