Пример #1
0
    def rf(url,
           data_or_user=None,
           user=None,
           middleware=None,
           expect=None,
           **kwargs):
        if type(data_or_user) is User and user is None:
            user = data_or_user
        elif 'data' not in kwargs:
            kwargs['data'] = data_or_user
        if 'format' not in kwargs and 'content_type' not in kwargs:
            kwargs['format'] = 'json'

        request = getattr(APIRequestFactory(), verb)(url, **kwargs)
        request_error = None
        try:
            view, view_args, view_kwargs = resolve(
                urllib.parse.urlparse(url)[2])
        except Http404 as e:
            request_error = e
        if isinstance(kwargs.get('cookies', None), dict):
            for key, value in kwargs['cookies'].items():
                request.COOKIES[key] = value
        if middleware:
            middleware.process_request(request)
        if user:
            force_authenticate(request, user=user)

        if not request_error:
            response = view(request, *view_args, **view_kwargs)
        else:
            response = response_for_exception(request, request_error)
        if middleware:
            middleware.process_response(request, response)
        if expect:
            if response.status_code != expect:
                if getattr(response, 'data', None):
                    try:
                        data_copy = response.data.copy()
                        # Make translated strings printable
                        for key, value in response.data.items():
                            if isinstance(value, list):
                                response.data[key] = []
                                for item in value:
                                    response.data[key].append(str(item))
                            else:
                                response.data[key] = str(value)
                    except Exception:
                        response.data = data_copy
            assert response.status_code == expect, 'Response data: {}'.format(
                getattr(response, 'data', None))
        if hasattr(response, 'render'):
            response.render()
        __SWAGGER_REQUESTS__.setdefault(
            request.path, {})[(request.method.lower(),
                               response.status_code)] = (response.get(
                                   'Content-Type',
                                   None), response.content, kwargs.get('data'))
        return response
Пример #2
0
    def get_response(self, request):
        from django.http import Http404

        if self._should_handle(request.path):
            try:
                return self.serve(request)
            except Http404 as e:
                return response_for_exception(request, e)
        return super().get_response(request)
Пример #3
0
    def get_response(self, request):
        from django.http import Http404

        if self._should_handle(request.path):
            try:
                return self.serve(request)
            except Http404 as e:
                if settings.DEBUG:
                    from django.views import debug
                    return debug.technical_404_response(request, e)
                return response_for_exception(request, e)
        return super().get_response(request)
Пример #4
0
 def inner(request):
     try:
         response = get_response(request)
     except TimeoutError as exc:
         log.warning(
             f'Timeout: {request.path}',
             extra={
                 'status_code': 408,
                 'request': request
             },
         )
         resolver = get_resolver(get_urlconf())
         response = get_exception_response(request, resolver, 408, exc)
     except Exception as exc:
         response = response_for_exception(request, exc)
     return response
Пример #5
0
 def get_response(self, request):
     try:
         return self.serve(request)
     except Http404 as e:
         return response_for_exception(request, e)
Пример #6
0
 def dispatch(self, request, *args, **kwargs):
     if settings.DEBUG is False:
         # Only available on DEBUG=True
         return response_for_exception(request, Http404())
     return super().dispatch(request, *args, **kwargs)
Пример #7
0
 async def get_response_async(self, request):
     try:
         return await sync_to_async(self.serve)(request)
     except Http404 as e:
         return response_for_exception(request, e)