Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

""" 

This module implements the Response class which is used to represent HTTP 

responses in Scrapy. 

 

See documentation in docs/topics/request-response.rst 

""" 

 

import copy 

 

from scrapy.http.headers import Headers 

from scrapy.utils.trackref import object_ref 

from scrapy.http.common import deprecated_setter 

 

class Response(object_ref): 

 

    def __init__(self, url, status=200, headers=None, body='', flags=None, request=None): 

        self.headers = Headers(headers or {}) 

        self.status = int(status) 

        self._set_body(body) 

        self._set_url(url) 

        self.request = request 

        self.flags = [] if flags is None else list(flags) 

 

    @property 

    def meta(self): 

        try: 

            return self.request.meta 

        except AttributeError: 

            raise AttributeError("Response.meta not available, this response " \ 

                "is not tied to any request") 

 

    def _get_url(self): 

        return self._url 

 

    def _set_url(self, url): 

        if isinstance(url, str): 

            self._url = url 

        else: 

            raise TypeError('%s url must be str, got %s:' % (type(self).__name__, \ 

                type(url).__name__)) 

 

    url = property(_get_url, deprecated_setter(_set_url, 'url')) 

 

    def _get_body(self): 

        return self._body 

 

    def _set_body(self, body): 

50        if isinstance(body, str): 

            self._body = body 

        elif isinstance(body, unicode): 

            raise TypeError("Cannot assign a unicode body to a raw Response. " \ 

                "Use TextResponse, HtmlResponse, etc") 

        elif body is None: 

            self._body = '' 

        else: 

            raise TypeError("Response body must either str or unicode. Got: '%s'" \ 

                % type(body).__name__) 

 

    body = property(_get_body, deprecated_setter(_set_body, 'body')) 

 

    def __str__(self): 

        return "<%d %s>" % (self.status, self.url) 

 

    __repr__ = __str__ 

 

    def copy(self): 

        """Return a copy of this Response""" 

        return self.replace() 

 

    def replace(self, *args, **kwargs): 

        """Create a new Response with the same attributes except for those 

        given new values. 

        """ 

        for x in ['url', 'status', 'headers', 'body', 'request', 'flags']: 

            kwargs.setdefault(x, getattr(self, x)) 

        cls = kwargs.pop('cls', self.__class__) 

        return cls(*args, **kwargs)