当一个请求连接进来时,django会创建一个HttpRequest对象来封装和保存所有请求相关的信息,并且会根据请求路由载入匹配的视图函数。每个请求的视图函数都会返回一个HttpResponse。

  HttpRequest和HttpResponse可以从django.http中导入。

  1、HttpRequest类

 函数  功能描述
HttpRequest.scheme 请求协议(http或者https)
HttpRequest.body 以字节的方式返回请求体内容;可以通过HttpRequest.POST获取处理后的key和value,也可以通过HttpRequest.read()格式化
HttpRequest.path 返回请求的完整路径,不包括协议和域名
HttpRequest.GET  GET请求参数,返回一个queryDict对象
HttpRequest.POST 获取表单提交的数据,如果是通过POST请求提交的其它非表单数据,可以使用HttpRequest.Body获取;使用时可以通过if request.method == "PSOT"来进行预判断
HttpRequest.method 返回请求方式
HttpRequest.environ 返回一个字典,包含所有django运行的环境信息
HttpRequest.content_type 文件格式
HttpRequest.content_params 参数
HttpRequest.COOKIES 返回一个字典,包含浏览器存储的所有cookie
HttpRequest.FILES 返回一个MultiValueDict,包含上传的文件
HttpRequest.META 返回一个包含所有请求相关信息的字典(包含Headers),同environ
HttpRequest.resolver_match 返回请求处理的url及相关参数
HttpRequest.session 中间件,设置session,一个可读可写的字典对象
HttpRequest.get_host() 获取请求的主机和端口
HttpRequest.get_port() 获取端口
HttpRequest.get_full_path() 返回完整路径,同path
HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None 获取以一个cookie
HttpRequest.is_ajax() 判断是否为ajax请求
HttpRequest.is_secure() 判断是否为https请求

  示例:

  1. class HttpRequest:
  2. """A basic HTTP request."""
  3.  
  4. # The encoding used in GET/POST dicts. None means use default setting.
  5. _encoding = None
  6. _upload_handlers = []
  7.  
  8. def __init__(self):
  9. # WARNING: The `WSGIRequest` subclass doesn't call `super`.
  10. # Any variable assignment made here should also happen in
  11. # `WSGIRequest.__init__()`.
  12.  
  13. self.GET = QueryDict(mutable=True)
  14. self.POST = QueryDict(mutable=True)
  15. self.COOKIES = {}
  16. self.META = {}
  17. self.FILES = MultiValueDict()
  18.  
  19. self.path = ''
  20. self.path_info = ''
  21. self.method = None
  22. self.resolver_match = None
  23. self._post_parse_error = False
  24. self.content_type = None
  25. self.content_params = None
  26.  
  27. def __repr__(self):
  28. if self.method is None or not self.get_full_path():
  29. return '<%s>' % self.__class__.__name__
  30. return '<%s: %s %r>' % (self.__class__.__name__, self.method, self.get_full_path())
  31.  
  32. def _get_raw_host(self):
  33. """
  34. Return the HTTP host using the environment or request headers. Skip
  35. allowed hosts protection, so may return an insecure host.
  36. """
  37. # We try three options, in order of decreasing preference.
  38. if settings.USE_X_FORWARDED_HOST and (
  39. 'HTTP_X_FORWARDED_HOST' in self.META):
  40. host = self.META['HTTP_X_FORWARDED_HOST']
  41. elif 'HTTP_HOST' in self.META:
  42. host = self.META['HTTP_HOST']
  43. else:
  44. # Reconstruct the host using the algorithm from PEP 333.
  45. host = self.META['SERVER_NAME']
  46. server_port = self.get_port()
  47. if server_port != ('' if self.is_secure() else ''):
  48. host = '%s:%s' % (host, server_port)
  49. return host
  50.  
  51. def get_host(self):
  52. """Return the HTTP host using the environment or request headers."""
  53. host = self._get_raw_host()
  54.  
  55. # Allow variants of localhost if ALLOWED_HOSTS is empty and DEBUG=True.
  56. allowed_hosts = settings.ALLOWED_HOSTS
  57. if settings.DEBUG and not allowed_hosts:
  58. allowed_hosts = ['localhost', '127.0.0.1', '[::1]']
  59.  
  60. domain, port = split_domain_port(host)
  61. if domain and validate_host(domain, allowed_hosts):
  62. return host
  63. else:
  64. msg = "Invalid HTTP_HOST header: %r." % host
  65. if domain:
  66. msg += " You may need to add %r to ALLOWED_HOSTS." % domain
  67. else:
  68. msg += " The domain name provided is not valid according to RFC 1034/1035."
  69. raise DisallowedHost(msg)
  70.  
  71. def get_port(self):
  72. """Return the port number for the request as a string."""
  73. if settings.USE_X_FORWARDED_PORT and 'HTTP_X_FORWARDED_PORT' in self.META:
  74. port = self.META['HTTP_X_FORWARDED_PORT']
  75. else:
  76. port = self.META['SERVER_PORT']
  77. return str(port)
  78.  
  79. def get_full_path(self, force_append_slash=False):
  80. # RFC 3986 requires query string arguments to be in the ASCII range.
  81. # Rather than crash if this doesn't happen, we encode defensively.
  82. return '%s%s%s' % (
  83. escape_uri_path(self.path),
  84. '/' if force_append_slash and not self.path.endswith('/') else '',
  85. ('?' + iri_to_uri(self.META.get('QUERY_STRING', ''))) if self.META.get('QUERY_STRING', '') else ''
  86. )
  87.  
  88. def get_signed_cookie(self, key, default=RAISE_ERROR, salt='', max_age=None):
  89. """
  90. Attempt to return a signed cookie. If the signature fails or the
  91. cookie has expired, raise an exception, unless the `default` argument
  92. is provided, in which case return that value.
  93. """
  94. try:
  95. cookie_value = self.COOKIES[key]
  96. except KeyError:
  97. if default is not RAISE_ERROR:
  98. return default
  99. else:
  100. raise
  101. try:
  102. value = signing.get_cookie_signer(salt=key + salt).unsign(
  103. cookie_value, max_age=max_age)
  104. except signing.BadSignature:
  105. if default is not RAISE_ERROR:
  106. return default
  107. else:
  108. raise
  109. return value
  110.  
  111. def get_raw_uri(self):
  112. """
  113. Return an absolute URI from variables available in this request. Skip
  114. allowed hosts protection, so may return insecure URI.
  115. """
  116. return '{scheme}://{host}{path}'.format(
  117. scheme=self.scheme,
  118. host=self._get_raw_host(),
  119. path=self.get_full_path(),
  120. )
  121.  
  122. def build_absolute_uri(self, location=None):
  123. """
  124. Build an absolute URI from the location and the variables available in
  125. this request. If no ``location`` is specified, bulid the absolute URI
  126. using request.get_full_path(). If the location is absolute, convert it
  127. to an RFC 3987 compliant URI and return it. If location is relative or
  128. is scheme-relative (i.e., ``//example.com/``), urljoin() it to a base
  129. URL constructed from the request variables.
  130. """
  131. if location is None:
  132. # Make it an absolute url (but schemeless and domainless) for the
  133. # edge case that the path starts with '//'.
  134. location = '//%s' % self.get_full_path()
  135. bits = urlsplit(location)
  136. if not (bits.scheme and bits.netloc):
  137. current_uri = '{scheme}://{host}{path}'.format(scheme=self.scheme,
  138. host=self.get_host(),
  139. path=self.path)
  140. # Join the constructed URL with the provided location, which will
  141. # allow the provided ``location`` to apply query strings to the
  142. # base path as well as override the host, if it begins with //
  143. location = urljoin(current_uri, location)
  144. return iri_to_uri(location)
  145.  
  146. def _get_scheme(self):
  147. """
  148. Hook for subclasses like WSGIRequest to implement. Return 'http' by
  149. default.
  150. """
  151. return 'http'
  152.  
  153. @property
  154. def scheme(self):
  155. if settings.SECURE_PROXY_SSL_HEADER:
  156. try:
  157. header, value = settings.SECURE_PROXY_SSL_HEADER
  158. except ValueError:
  159. raise ImproperlyConfigured(
  160. 'The SECURE_PROXY_SSL_HEADER setting must be a tuple containing two values.'
  161. )
  162. if self.META.get(header) == value:
  163. return 'https'
  164. return self._get_scheme()
  165.  
  166. def is_secure(self):
  167. return self.scheme == 'https'
  168.  
  169. def is_ajax(self):
  170. return self.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
  171.  
  172. @property
  173. def encoding(self):
  174. return self._encoding
  175.  
  176. @encoding.setter
  177. def encoding(self, val):
  178. """
  179. Set the encoding used for GET/POST accesses. If the GET or POST
  180. dictionary has already been created, remove and recreate it on the
  181. next access (so that it is decoded correctly).
  182. """
  183. self._encoding = val
  184. if hasattr(self, 'GET'):
  185. del self.GET
  186. if hasattr(self, '_post'):
  187. del self._post
  188.  
  189. def _initialize_handlers(self):
  190. self._upload_handlers = [uploadhandler.load_handler(handler, self)
  191. for handler in settings.FILE_UPLOAD_HANDLERS]
  192.  
  193. @property
  194. def upload_handlers(self):
  195. if not self._upload_handlers:
  196. # If there are no upload handlers defined, initialize them from settings.
  197. self._initialize_handlers()
  198. return self._upload_handlers
  199.  
  200. @upload_handlers.setter
  201. def upload_handlers(self, upload_handlers):
  202. if hasattr(self, '_files'):
  203. raise AttributeError("You cannot set the upload handlers after the upload has been processed.")
  204. self._upload_handlers = upload_handlers
  205.  
  206. def parse_file_upload(self, META, post_data):
  207. """Return a tuple of (POST QueryDict, FILES MultiValueDict)."""
  208. self.upload_handlers = ImmutableList(
  209. self.upload_handlers,
  210. warning="You cannot alter upload handlers after the upload has been processed."
  211. )
  212. parser = MultiPartParser(META, post_data, self.upload_handlers, self.encoding)
  213. return parser.parse()
  214.  
  215. @property
  216. def body(self):
  217. if not hasattr(self, '_body'):
  218. if self._read_started:
  219. raise RawPostDataException("You cannot access body after reading from request's data stream")
  220.  
  221. # Limit the maximum request data size that will be handled in-memory.
  222. if (settings.DATA_UPLOAD_MAX_MEMORY_SIZE is not None and
  223. int(self.META.get('CONTENT_LENGTH') or 0) > settings.DATA_UPLOAD_MAX_MEMORY_SIZE):
  224. raise RequestDataTooBig('Request body exceeded settings.DATA_UPLOAD_MAX_MEMORY_SIZE.')
  225.  
  226. try:
  227. self._body = self.read()
  228. except IOError as e:
  229. raise UnreadablePostError(*e.args) from e
  230. self._stream = BytesIO(self._body)
  231. return self._body
  232.  
  233. def _mark_post_parse_error(self):
  234. self._post = QueryDict()
  235. self._files = MultiValueDict()
  236. self._post_parse_error = True
  237.  
  238. def _load_post_and_files(self):
  239. """Populate self._post and self._files if the content-type is a form type"""
  240. if self.method != 'POST':
  241. self._post, self._files = QueryDict(encoding=self._encoding), MultiValueDict()
  242. return
  243. if self._read_started and not hasattr(self, '_body'):
  244. self._mark_post_parse_error()
  245. return
  246.  
  247. if self.content_type == 'multipart/form-data':
  248. if hasattr(self, '_body'):
  249. # Use already read data
  250. data = BytesIO(self._body)
  251. else:
  252. data = self
  253. try:
  254. self._post, self._files = self.parse_file_upload(self.META, data)
  255. except MultiPartParserError:
  256. # An error occurred while parsing POST data. Since when
  257. # formatting the error the request handler might access
  258. # self.POST, set self._post and self._file to prevent
  259. # attempts to parse POST data again.
  260. # Mark that an error occurred. This allows self.__repr__ to
  261. # be explicit about it instead of simply representing an
  262. # empty POST
  263. self._mark_post_parse_error()
  264. raise
  265. elif self.content_type == 'application/x-www-form-urlencoded':
  266. self._post, self._files = QueryDict(self.body, encoding=self._encoding), MultiValueDict()
  267. else:
  268. self._post, self._files = QueryDict(encoding=self._encoding), MultiValueDict()
  269.  
  270. def close(self):
  271. if hasattr(self, '_files'):
  272. for f in chain.from_iterable(l[1] for l in self._files.lists()):
  273. f.close()
  274.  
  275. # File-like and iterator interface.
  276. #
  277. # Expects self._stream to be set to an appropriate source of bytes by
  278. # a corresponding request subclass (e.g. WSGIRequest).
  279. # Also when request data has already been read by request.POST or
  280. # request.body, self._stream points to a BytesIO instance
  281. # containing that data.
  282.  
  283. def read(self, *args, **kwargs):
  284. self._read_started = True
  285. try:
  286. return self._stream.read(*args, **kwargs)
  287. except IOError as e:
  288. raise UnreadablePostError(*e.args) from e
  289.  
  290. def readline(self, *args, **kwargs):
  291. self._read_started = True
  292. try:
  293. return self._stream.readline(*args, **kwargs)
  294. except IOError as e:
  295. raise UnreadablePostError(*e.args) from e
  296.  
  297. def __iter__(self):
  298. while True:
  299. buf = self.readline()
  300. if not buf:
  301. break
  302. yield buf
  303.  
  304. def xreadlines(self):
  305. warnings.warn(
  306. 'HttpRequest.xreadlines() is deprecated in favor of iterating the '
  307. 'request.', RemovedInDjango30Warning, stacklevel=2,
  308. )
  309. yield from self
  310.  
  311. def readlines(self):
  312. return list(self)

HttpRequest源码

  1. from django.http import HttpResponse
  2. from django.views.decorators.csrf import csrf_exempt
  3.  
  4. # views.py
  5. @csrf_exempt
  6. def page(request):
  7. # print(request.scheme)
  8. # print(request.GET)
  9. # print(request.POST)
  10. # print(request.method)
  11. # # print(request.encoding)
  12. # print(request.environ)
  13. # print(request.content_type)
  14. # print(request.content_params)
  15. # request.COOKIES["host"] = "whatever"
  16. # print(request.COOKIES)
  17. # print(request.FILES)
  18. # print(request.FILES.get("dog"))
  19. # print(request.META)
  20. # print(request.resolver_match)
  21. # request.session["username"] = "Jan"
  22. # print(request.session["username"])
  23. # print(request.get_signed_cookie("host"))
  24. # print(request.is_secure())
  25. # print(request.is_ajax())
  26.  
  27. # print(request.POST.get("age", None))
  28. # print(request.get_port())
  29. # print(request.get_full_path())
  30. # print(request.path)
  31. # print(request.path_info)
  32. # print(request.get_host())
  33. # print(request.GET.get("name", None))
  34. return HttpResponse("OK!")

  使用httpie测试:

  1. # GET请求带参数
  2. http http://127.0.0.1:8000/page/ -- name=Jan
  3. # PSOT请求
  4. http -f POST 127.0.0.1:/page/ age=
  5. # POST上传文件
  6. http -f POST http://127.0.0.1:8000/page/ dog@Desktop/dog.png

  2、queryDict对象

  queryDict类是python字典的子类,具有字典的所有方法,它放在django.http.QueryDict中。它用“&”分割字符传,用“=”生成键值对,从而将一个类似GET请求参数的字符串解析成一个类似字典的对象。源码如下:

  1. class QueryDict(MultiValueDict):
  2. """
  3. A specialized MultiValueDict which represents a query string.
  4.  
  5. A QueryDict can be used to represent GET or POST data. It subclasses
  6. MultiValueDict since keys in such data can be repeated, for instance
  7. in the data from a form with a <select multiple> field.
  8.  
  9. By default QueryDicts are immutable, though the copy() method
  10. will always return a mutable copy.
  11.  
  12. Both keys and values set on this class are converted from the given encoding
  13. (DEFAULT_CHARSET by default) to str.
  14. """
  15.  
  16. # These are both reset in __init__, but is specified here at the class
  17. # level so that unpickling will have valid values
  18. _mutable = True
  19. _encoding = None
  20.  
  21. def __init__(self, query_string=None, mutable=False, encoding=None):
  22. super().__init__()
  23. if not encoding:
  24. encoding = settings.DEFAULT_CHARSET
  25. self.encoding = encoding
  26. query_string = query_string or ''
  27. parse_qsl_kwargs = {
  28. 'keep_blank_values': True,
  29. 'fields_limit': settings.DATA_UPLOAD_MAX_NUMBER_FIELDS,
  30. 'encoding': encoding,
  31. }
  32. if isinstance(query_string, bytes):
  33. # query_string normally contains URL-encoded data, a subset of ASCII.
  34. try:
  35. query_string = query_string.decode(encoding)
  36. except UnicodeDecodeError:
  37. # ... but some user agents are misbehaving :-(
  38. query_string = query_string.decode('iso-8859-1')
  39. for key, value in limited_parse_qsl(query_string, **parse_qsl_kwargs):
  40. self.appendlist(key, value)
  41. self._mutable = mutable
  42.  
  43. @classmethod
  44. def fromkeys(cls, iterable, value='', mutable=False, encoding=None):
  45. """
  46. Return a new QueryDict with keys (may be repeated) from an iterable and
  47. values from value.
  48. """
  49. q = cls('', mutable=True, encoding=encoding)
  50. for key in iterable:
  51. q.appendlist(key, value)
  52. if not mutable:
  53. q._mutable = False
  54. return q
  55.  
  56. @property
  57. def encoding(self):
  58. if self._encoding is None:
  59. self._encoding = settings.DEFAULT_CHARSET
  60. return self._encoding
  61.  
  62. @encoding.setter
  63. def encoding(self, value):
  64. self._encoding = value
  65.  
  66. def _assert_mutable(self):
  67. if not self._mutable:
  68. raise AttributeError("This QueryDict instance is immutable")
  69.  
  70. def __setitem__(self, key, value):
  71. self._assert_mutable()
  72. key = bytes_to_text(key, self.encoding)
  73. value = bytes_to_text(value, self.encoding)
  74. super().__setitem__(key, value)
  75.  
  76. def __delitem__(self, key):
  77. self._assert_mutable()
  78. super().__delitem__(key)
  79.  
  80. def __copy__(self):
  81. result = self.__class__('', mutable=True, encoding=self.encoding)
  82. for key, value in self.lists():
  83. result.setlist(key, value)
  84. return result
  85.  
  86. def __deepcopy__(self, memo):
  87. result = self.__class__('', mutable=True, encoding=self.encoding)
  88. memo[id(self)] = result
  89. for key, value in self.lists():
  90. result.setlist(copy.deepcopy(key, memo), copy.deepcopy(value, memo))
  91. return result
  92.  
  93. def setlist(self, key, list_):
  94. self._assert_mutable()
  95. key = bytes_to_text(key, self.encoding)
  96. list_ = [bytes_to_text(elt, self.encoding) for elt in list_]
  97. super().setlist(key, list_)
  98.  
  99. def setlistdefault(self, key, default_list=None):
  100. self._assert_mutable()
  101. return super().setlistdefault(key, default_list)
  102.  
  103. def appendlist(self, key, value):
  104. self._assert_mutable()
  105. key = bytes_to_text(key, self.encoding)
  106. value = bytes_to_text(value, self.encoding)
  107. super().appendlist(key, value)
  108.  
  109. def pop(self, key, *args):
  110. self._assert_mutable()
  111. return super().pop(key, *args)
  112.  
  113. def popitem(self):
  114. self._assert_mutable()
  115. return super().popitem()
  116.  
  117. def clear(self):
  118. self._assert_mutable()
  119. super().clear()
  120.  
  121. def setdefault(self, key, default=None):
  122. self._assert_mutable()
  123. key = bytes_to_text(key, self.encoding)
  124. default = bytes_to_text(default, self.encoding)
  125. return super().setdefault(key, default)
  126.  
  127. def copy(self):
  128. """Return a mutable copy of this object."""
  129. return self.__deepcopy__({})
  130.  
  131. def urlencode(self, safe=None):
  132. """
  133. Return an encoded string of all query string arguments.
  134.  
  135. `safe` specifies characters which don't require quoting, for example::
  136.  
  137. >>> q = QueryDict(mutable=True)
  138. >>> q['next'] = '/a&b/'
  139. >>> q.urlencode()
  140. 'next=%2Fa%26b%2F'
  141. >>> q.urlencode(safe='/')
  142. 'next=/a%26b/'
  143. """
  144. output = []
  145. if safe:
  146. safe = force_bytes(safe, self.encoding)
  147.  
  148. def encode(k, v):
  149. return '%s=%s' % ((quote(k, safe), quote(v, safe)))
  150. else:
  151. def encode(k, v):
  152. return urlencode({k: v})
  153. for k, list_ in self.lists():
  154. k = force_bytes(k, self.encoding)
  155. output.extend(encode(k, force_bytes(v, self.encoding))
  156. for v in list_)
  157. return '&'.join(output)

  示例:

  1. from django.http import QueryDict
  2.  
  3. # 添加django的环境配置
  4. import os, django
  5. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "restful.settings")
  6. django.setup()
  7.  
  8. get_vactors = "a=1&a=2&a=3&b=Jan&b=Li&c=20"
  9. query = QueryDict(get_vactors, mutable=True)
  10. # print(query)
  11.  
  12. # 根据键生成新的QueryDict
  13. query_new = QueryDict.fromkeys(query, value="这个大傻子")
  14. # print(query_new)
  15.  
  16. # 获取键列表、值列表、键值对列表(值列表中的最后一个元素)
  17. print(list(query.items())) # 生成器,获取包含键和最后一个值元素的元组的列表
  18. print(list(query.keys())) # dict_keys,获取键
  19. print(list(query.values())) # 生成器,获取每个键的最后一个元素值
  20. # 键值对
  21. print(list(query.lists())) # 获取键键值对列表
  22. print(dict(query)) # 转成字典,相当于query.dict()
  23.  
  24. # 获取单个元素及列表
  25. alist = query.get("a")
  26. print(alist) # 获取最后一个元素值
  27. alist = query.getlist("a")
  28. print(alist) # 获取键对应的value,返回元素列表
  29.  
  30. # 添加/修改键值对,必须将mutable设置为True
  31. query.setlist("a", [4, 5, 6])
  32. query.setlistdefault("d", [4,5,6])
  33. query.appendlist("e", ["this", "is", "append"])
  34. print(query)
  35.  
  36. # 删除键值对
  37. query.pop("e") # 删除指定键值对
  38. print(query)
  39. query.popitem() # 删除最后一个键值对
  40. print(query)

  3、HttpResponse

  HttpResponse类用于设置响应头和响应内容,同样封装在django.http模块中。它分为实例化对象、填充设置以及返回三个部分。它同时也是其它请求响应类的父类。

  1. from django.http import HttpResponse
  2.  
  3. # 添加django的环境配置
  4. import os, django
  5. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "restful.settings")
  6. django.setup()
  7.  
  8. # 实例化一:
  9. responseOne = HttpResponse("this is a http response")
  10. # 实例化二:
  11. responseTwo = HttpResponse()
  12. responseTwo.write("this is another http response")
  13. responseTwo.writelines(["this is second line", "this is third line"])
  14. # 设置响应头
  15. responseOne["Age"] = 20
  16. responseOne["app"] = "sample"
  17. del responseOne["app"]
  18.  
  19. # 设置响应头
  20. responseOne["content_type"] = 'application/vnd.ms-excel'
  21. responseOne['Content-Disposition'] = 'attachment; filename="foo.xls"'
  22.  
  23. responseOne.set_cookie("date", "2018-08-21", path="/page", ) # 设置cookie
  24. responseOne.delete_cookie("date") # 删除cookie
  25. # 有关对象
  26. print(responseOne) # HttpResponse
  27. print(responseOne.items()) # dict_values
  28. print(responseOne.cookies) # cookie
  29. print(responseOne.content) # 内容(字节)
  30. print(responseOne.charset) # 编码
  31. print(responseOne.status_code) # 状态码
  32. print(responseOne.streaming) # 是否为流
  33. print(responseOne.closed) # 是否已发送response
  34. print(responseOne.serialize()) # 序列化响应头和相应内容
  35. print(responseOne.serialize_headers()) # 序列化响应头
  36. print(responseOne.get("Age")) # 获取响应头中的某个键值对
  37. print(responseTwo.getvalue()) # 获取相应的内容
  38.  
  39. # 将response设置为流数据处理
  40. responseTwo.readable()
  41. responseTwo.seekable()
  42. responseTwo.write("...")

  其它继承HttpResponse的子类包括:

  1. HttpResponseRedirect # 重定向
  2. HttpResponsePermanentRedirect # 永久重定向
  3. HttpResponseNotModified #
  4. HttpResponseBadRequest #
  5. HttpResponseNotFound #
  6. HttpResponseForbidden #
  7. HttpResponseNotAllowed #
  8. HttpResponseGone #
  9. HttpResponseServerError #

  4、JsonResponse

  返回一个序列化的JSON对象。对于列表、字符串等,它会自动生成索引-元素JSON;对于字典,会直接生成相应的JSON。

  1. class JsonResponse(HttpResponse):
  2. """
  3. An HTTP response class that consumes data to be serialized to JSON.
  4.  
  5. :param data: Data to be dumped into json. By default only ``dict`` objects
  6. are allowed to be passed due to a security flaw before EcmaScript 5. See
  7. the ``safe`` parameter for more information.
  8. :param encoder: Should be a json encoder class. Defaults to
  9. ``django.core.serializers.json.DjangoJSONEncoder``.
  10. :param safe: Controls if only ``dict`` objects may be serialized. Defaults
  11. to ``True``.
  12. :param json_dumps_params: A dictionary of kwargs passed to json.dumps().
  13. """
  14.  
  15. def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
  16. json_dumps_params=None, **kwargs):
  17. if safe and not isinstance(data, dict):
  18. raise TypeError(
  19. 'In order to allow non-dict objects to be serialized set the '
  20. 'safe parameter to False.'
  21. )
  22. if json_dumps_params is None:
  23. json_dumps_params = {}
  24. kwargs.setdefault('content_type', 'application/json')
  25. data = json.dumps(data, cls=encoder, **json_dumps_params)
  26. super().__init__(content=data, **kwargs)

  DjangoJSONEncoder是内置的JSON编码方式,也支持传入自己写的编码方式对数据进行序列化。

  1. # python manage.py shell
  2. from django.http import JsonResponse
  3. response = JsonResponse({'foo': 'bar'})
  4. response.content
  1. from django.http import JsonResponse
  2. from django.views.decorators.csrf import csrf_exempt
  3.  
  4. @csrf_exempt
  5. def page(request):
  6. # lis = list(range(10))
  7. # return JsonResponse(lis, safe=False)
  8. # dic = {"name": "Jan", "age": 20}
  9. # return JsonResponse(dic)
  10. string = "this is json response"
  11. return JsonResponse(string, safe=False)

  5、FileResponse

  1. from django.http import FileResponse
  2. response = FileResponse(open('myfile.png', 'rb'))

  

Django(三):HttpRequest和HttpResponse的更多相关文章

  1. Django中HttpRequest和HttpResponse

    请求和响应对象 Django中通过使用请求和响应对象来传递系统的状态. 当请求一个页面的时候,Django就创建一个HttpRequest对象,它包含了关于请求的元数据对象,然后Django加载适当的 ...

  2. Django的httprequest对象和httpresponse对象

    请求一张页面时,Django把请求的metadata数据包装成一个HttpRequest对象,然后Django加载合适的view方法,把这个HttpRequest 对象作为第一个参数传给view方法. ...

  3. Python Django 前后端数据交互 之 HttpRequest、HttpResponse、render、redirect

    在使用三神装的时候,首先当然是得要导入它们: from django.shortcuts import HttpResponse, render, redirect   一.HttpRequest捕获 ...

  4. Django框架(五)-- 视图层:HttpRequest、HTTPResponse、JsonResponse、CBV和FBV、文件上传

    一.视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. ...

  5. Django框架(六)—— 视图层:HttpRequest、HTTPResponse、JsonResponse、CBV和FBV、文件上传

    目录 视图层 一.视图函数 二.视图层之HttpRequest对象 三.视图层之HttpResponse对象 四.视图层之JsonResponse对象 五.CBV和FBV 六.文件上传 视图层 一.视 ...

  6. [R]django的HTTPREQUEST对象

    django的HTTPREQUEST对象 via Django使用request和response对象 当请求一张页面时,Django把请求的metadata数据包装成一个HttpRequest对象, ...

  7. django的HTTPREQUEST对象

    Django使用request和response对象 当请求一张页面时,Django把请求的metadata数据包装成一个HttpRequest对象,然后Django加载合适的view方法,把这个Ht ...

  8. 冰冻三尺非一日之寒--web框架Django(三)

      第二十章: django(三,多对多)   1.Django请求的生命周期         路由系统 -> 视图函数(获取模板+数据-->渲染) -> 字符串返回给用户   2. ...

  9. Web框架之Django_01初识(三大主流web框架、Django安装、Django项目创建方式及其相关配置、Django基础三件套:HttpResponse、render、redirect)

    摘要: Web框架概述 Django简介 Django项目创建 Django基础必备三件套(HttpResponse.render.redirect) 一.Web框架概述: Python三大主流Web ...

随机推荐

  1. Yes,I know the way to learn Ens !

    In recent years, translation has gone out of fashion as a way to learn a new language. A lot of peop ...

  2. IAP远程在线升级

    IAP远程在线升级 在上一篇中实现了LWIP网口通讯,那么肯定要加个在线升级功能,这个功能所占用的资源很少,但在物联网中很重要也很实用.在线升级就是像手机一样,先下载好系统,然后点击升级~然后就没然后 ...

  3. 微信小程序 Unexpected end of JSON input/Unexpected token o in JSON at position 1

    原因JSON.parse无法识别某些url中的特殊字符,所以报错 mistakes.js中 nextBtn:function(){ var nextData = this.data.dataNextI ...

  4. 一次对webshell的后门的查看

    本文作者i春秋作家——非主流 昨天晚上突发奇想的想去看看github上面tennc的webshell收集项目中的shell有没有漏洞,比如未授权啊啥的,结果找半天都没找到...但是机缘巧合下,居然给我 ...

  5. Volley源码解析

    说点题外话,将近三个半月没有写博客了,年初换工作,在新的公司,上班第三天开始干活,花了二十来天弄了一个项目,上线后,接着又迭代了几个版本,不知不觉,试用期过完,才稍微有几天闲时.在年初的时候,就一直在 ...

  6. [bug]小程序弹出层滚动穿透问题修复

    如题,解决方案有两种: 1.如果弹出层没有滚动事件,就直接在蒙板和弹出层上加 catchtouchmove;(方便快捷) <template name="popup-modal&quo ...

  7. 浅析js中取绝对值的2种方法

    1.abs()   var aaa=-20;   var bbb=Math.abs(aaa); 2.加减法   var aaa=-20;   var bbb=-aaa

  8. php5数组与php7数组区别

    http://ju.outofmemory.cn/entry/197064 http://www.fzb.me/2015-9-16-php7-implementation-hashtable.html ...

  9. JS: 数组扁平化

    数组扁平化 什么是数组扁平化? 数组扁平化就是将一个多层嵌套的数组 (Arrary) 转化为只有一层. // 多层嵌套 [1, 2, [3, 4]] // 一层 [1, 2, 3, 4] 递归实现 思 ...

  10. 【BZOJ4916】神犇和蒟蒻 杜教筛

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4916 第一个询问即求出$\sum_{i=1}^{n} { \mu (i^2)} $,考虑 ...