A basic HTTP request.
| 52 | |
| 53 | |
| 54 | class HttpRequest: |
| 55 | """A basic HTTP request.""" |
| 56 | |
| 57 | # The encoding used in GET/POST dicts. None means use default setting. |
| 58 | _encoding = None |
| 59 | _upload_handlers = [] |
| 60 | _multipart_parser_class = MultiPartParser |
| 61 | |
| 62 | def __init__(self): |
| 63 | # WARNING: The `WSGIRequest` subclass doesn't call `super`. |
| 64 | # Any variable assignment made here should also happen in |
| 65 | # `WSGIRequest.__init__()`. |
| 66 | |
| 67 | self.GET = QueryDict(mutable=True) |
| 68 | self.POST = QueryDict(mutable=True) |
| 69 | self.COOKIES = {} |
| 70 | self.META = {} |
| 71 | self.FILES = MultiValueDict() |
| 72 | |
| 73 | self.path = "" |
| 74 | self.path_info = "" |
| 75 | self.method = None |
| 76 | self.resolver_match = None |
| 77 | self.content_type = None |
| 78 | self.content_params = None |
| 79 | |
| 80 | def __repr__(self): |
| 81 | if self.method is None or not self.get_full_path(): |
| 82 | return "<%s>" % self.__class__.__name__ |
| 83 | return "<%s: %s %r>" % ( |
| 84 | self.__class__.__name__, |
| 85 | self.method, |
| 86 | self.get_full_path(), |
| 87 | ) |
| 88 | |
| 89 | @cached_property |
| 90 | def headers(self): |
| 91 | return HttpHeaders(self.META) |
| 92 | |
| 93 | @cached_property |
| 94 | def accepted_types(self): |
| 95 | """ |
| 96 | Return a list of MediaType instances, in order of preference (quality). |
| 97 | """ |
| 98 | header_value = self.headers.get("Accept", "*/*") |
| 99 | return sorted( |
| 100 | ( |
| 101 | media_type |
| 102 | for token in header_value.split(",") |
| 103 | if token.strip() and (media_type := MediaType(token)).quality != 0 |
| 104 | ), |
| 105 | key=operator.attrgetter("quality", "specificity"), |
| 106 | reverse=True, |
| 107 | ) |
| 108 | |
| 109 | @cached_property |
| 110 | def accepted_types_by_precedence(self): |
| 111 | """ |
no outgoing calls