Transkribus/TWI-utils

Redundant post requests to /rest/auth/refresh

cziaarm opened this issue · 1 comments

Copied from Transkribus/TranskribusWebUI#5 by @bejohu

Current session is being refreshed unnecessarily:

Prior to any non-cached request to endpoint, here rest/collections/XXXX/XXXX/1/list, the session is refreshed, thereby doubling round-trip time:

### [POST REQUEST] t_refresh will POST: https://transkribus.eu/TrpServer/rest/auth/refresh   
### t_refresh response STATUS_CODE: 200   
### IN t_page: https://transkribus.eu/TrpServer/rest/collections/******/*****/1/list   
### [HAVE CACHE] t_page HAS CACHED page for: https://transkribus.eu/TrpServer/rest/collections/4/6201/1/list

def t_login_required(function, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):
    @wraps(function)
    def wrapper(request, *args, **kw):
        if request.user.is_authenticated():
        if not t_refresh(): # <---------------- 
            return HttpResponseRedirect('/logout?next={!s}'.format(request.get_full_path()))
            [...]
            return function(request, *args, **kw)

Might be possible to improve this doing something like this:

def post_some_data(data):
    r = session.post('https://example.com/', data={'some': 'data'})
    [...]
    r.raise_for_status() # raises exception unless request was successful
    [...]
    return result

The decorator could then look like this:

def t_login_required(function, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):
    @wraps(func)
    def wrapper(request, *args, **kwargs):
        if request.user.is_authenticated():
            [...]
            response = None
            try:
                response = func(request, *args, **kwargs)
            except HTTPError as e:
                if e.status_code not in (401, 403):
                    raise e
                response = HttpResponseRedirect("/logout?next={!s}".format(request.get_full_path()))
        return response

Maybe, the session could be refreshed depending on time elapsed since last request stored in session:

    [...]
    def wrapper(request, *args, **kwargs):
        if request.user.is_authenticated():
            if is_required_refresh(request):
                if not t_refresh(request):
                    [...]
                    return [...]
            [...]
            response = None
            try:
                response = func(request, *args, **kwargs)
            except HTTPError as e:
                [...]

This has been someway implemented, though now have removed the t.refresh calls as they are not needed now that we are keeping the transkribus session with the django user