python - understanding functools.wraps -


i using flask-restful , trying have rest endpoints using technique showed here

the main code is

def authenticate(func):     @wraps(func)     def wrapper(*args, **kwargs):         if not getattr(func, 'authenticated', true):             return func(*args, **kwargs)          acct = basic_authentication()  # custom account lookup function          if acct:             return func(*args, **kwargs)          restful.abort(401)     return wrapper   class resource(restful.resource):     method_decorators = [authenticate]   # applies inherited resources 

i same way , seems work, not sure happens @wraps?
seems magic me @ moment , did not understand following

a.) seems function wrapped @wraps passed wrapper, wrapper returning?

possible answer: passed function initially?

if yes, how can pass more information acct object function receives account object , don't have database fetch it?

update based on example, rest endpoint looks

class userresource(restresource):     def get(self, uuid):         return {'method': 'get user -> ' + uuid} 

and call like

curl -x http://127.0.0.1:5000/users/validuuid 

now when every request authenticated, see if valid acct object exists , if exists, delegate control endpoint

question:
since making 1 database call find out acct object, possible pass in endpoint when valid acct located?

this way 2 things happen
a.) know call authenticated
b.) reuse acct object can use further work, rather making db call again , acct object validuuid again

how can achieve ?

authenticate decorator -- takes function , returns modified version of function (which implemented wrapping function , wrapping it).

now, problem wrappers don't act original function in ways -- may missing docstrings, have wrong __name__ (wrapper instead of should called), , other blemishes. might important if other code using information. functools.wraps simple function adds information original function (here, func) wrapper function, behaves more original function. (technically, decorator, confusing part, don't have worry detail. know nice tool copies attributes wrapped function wrapper function).

thus, when write

new_function = authenticate(old_function) 

or more commonly

@authenticate def function(...) 

new_function more old_function.


Comments

Popular posts from this blog

android - getbluetoothservice() called with no bluetoothmanagercallback -

sql - ASP.NET SqlDataSource, like on SelectCommand -

ios - Undefined symbols for architecture armv7: "_OBJC_CLASS_$_SSZipArchive" -