Skip to content

Commit

Permalink
Don't inject context into flask.request
Browse files Browse the repository at this point in the history
Backward incompatible change!

Instead of connexion.request.user / flask.request.user, use connexion.context['user']
  • Loading branch information
cziebuhr committed Sep 21, 2018
1 parent c6eaf0d commit 450f3a5
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 23 deletions.
2 changes: 1 addition & 1 deletion connexion/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def _required_lib(exec_info, *args, **kwargs):


try:
from .apis.flask_api import FlaskApi
from .apis.flask_api import FlaskApi, context # NOQA
from .apps.flask_app import FlaskApp
from flask import request # NOQA
except ImportError: # pragma: no cover
Expand Down
23 changes: 7 additions & 16 deletions connexion/apis/flask_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import flask
import six
import werkzeug.exceptions
from werkzeug.local import LocalProxy

from connexion.apis import flask_utils
from connexion.apis.abstract import AbstractAPI
Expand Down Expand Up @@ -218,6 +219,8 @@ def get_request(cls, *args, **params):
:rtype: ConnexionRequest
"""
context_dict = {}
setattr(flask._request_ctx_stack.top, 'connexion_context', context_dict)
flask_request = flask.request
request = ConnexionRequest(
flask_request.url,
Expand All @@ -229,7 +232,7 @@ def get_request(cls, *args, **params):
json_getter=lambda: flask_request.get_json(silent=True),
files=flask_request.files,
path_params=params,
context=FlaskRequestContextProxy()
context=context_dict
)
logger.debug('Getting data and status code',
extra={
Expand All @@ -247,23 +250,11 @@ def _set_jsonifier(cls):
cls.jsonifier = Jsonifier(flask.json)


class FlaskRequestContextProxy(object):
""""Proxy assignments from `ConnexionRequest.context`
to `flask.request` instance.
"""

def __init__(self):
self.values = {}
def _get_context():
return getattr(flask._request_ctx_stack.top, 'connexion_context')

def __setitem__(self, key, value):
# type: (str, Any) -> None
logger.debug('Setting "%s" attribute in flask.request', key)
setattr(flask.request, key, value)
self.values[key] = value

def items(self):
# type: () -> list
return self.values.items()
context = LocalProxy(_get_context)


class InternalHandlers(object):
Expand Down
2 changes: 1 addition & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ def schema_app(request):
@pytest.fixture(scope="session", params=SPECS)
def secure_endpoint_app(request):
return build_app_from_fixture('secure_endpoint', request.param,
validate_responses=True)
validate_responses=True, pass_context_arg_name='req_context')


@pytest.fixture(scope="session", params=SPECS)
Expand Down
9 changes: 4 additions & 5 deletions tests/fakeapi/hello.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
import flask
from flask import jsonify, redirect

import connexion
from connexion import NoContent, ProblemException, problem
from connexion import NoContent, ProblemException, context, problem


class DummyClass(object):
Expand Down Expand Up @@ -79,11 +78,11 @@ def get_bye_secure(name, user, token_info):


def get_bye_secure_from_flask():
return 'Goodbye {user} (Secure!)'.format(user=flask.request.user)
return 'Goodbye {user} (Secure!)'.format(user=context['user'])


def get_bye_secure_from_connexion():
return 'Goodbye {user} (Secure!)'.format(user=connexion.request.user)
def get_bye_secure_from_connexion(req_context):
return 'Goodbye {user} (Secure!)'.format(user=req_context['user'])


def get_bye_secure_ignoring_context(name):
Expand Down

0 comments on commit 450f3a5

Please sign in to comment.