def make_request(scope, url, method, params, body, headers, **kwargs): path, query = urlparse(url).path, urlparse(url).query request = HttpRequest() request.path = path request.session = scope.get('session', None) content = json.dumps(body) request.META['HTTP_CONTENT_TYPE'] = 'application/json' request.META['HTTP_ACCEPT'] = 'application/json' request.META['HTTP_CONTENT_LENGTH'] = len(content) request.META['QUERY_STRING'] = query or '' request._read_started = False request._stream = BytesIO(content.encode('utf-8')) for (header_name, value) in scope.get('headers', []): request.META[header_name.decode('utf-8')] = value.decode('utf-8') query_s, data = QueryDict(query, mutable=True), QueryDict(mutable=True) print(params, query_s) query_s.update(params) data.update(body) request.method = method request.POST = data request.GET = query_s if scope.get('cookies'): request.COOKIES = scope.get('cookies') for k, v in headers.items(): header = f'HTTP_{k.upper()}' request.META[header] = v.encode() if "server" in scope: request.META["SERVER_NAME"] = scope["server"][0] request.META["SERVER_PORT"] = scope["server"][1] else: request.META["SERVER_NAME"] = "localhost" request.META["SERVER_PORT"] = 80 for k, v in kwargs.items(): setattr(request, k, v) return request
def convert_request(request): """ Converts an aiohttp Request to a Django HttpRequest This does not convert the async body to a sync body for POST requests """ djr = HttpRequest() djr.method = request.method upper_keys = {k.upper() for k in request.headers.keys()} # These two headers are specially set by Django without the HTTP prefix h = {"CONTENT_LENGTH", "CONTENT_TYPE"} djr.META = { f"HTTP_{k}" if k not in h else k: request.headers[k] for k in upper_keys } djr.COOKIES = request.cookies djr.path = request.path djr.path_info = request.match_info.get("path", "") djr.encoding = request.charset djr.GET = request.query djr._get_scheme = lambda: request.scheme return djr