passed to :func:`urllib.parse.parse_qs` unchanged.
-.. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False)
-
- This function is deprecated in this module. Use :func:`urllib.parse.parse_qs`
- instead. It is maintained here only for backward compatibility.
-
-
-.. function:: parse_qsl(qs, keep_blank_values=False, strict_parsing=False)
-
- This function is deprecated in this module. Use :func:`urllib.parse.parse_qsl`
- instead. It is maintained here only for backward compatibility.
-
-
.. function:: parse_multipart(fp, pdict, encoding="utf-8", errors="replace")
Parse input of type :mimetype:`multipart/form-data` (for file uploads).
Print a list of useful (used by CGI) environment variables in HTML.
-.. function:: escape(s, quote=False)
-
- Convert the characters ``'&'``, ``'<'`` and ``'>'`` in string *s* to HTML-safe
- sequences. Use this if you need to display text that might contain such
- characters in HTML. If the optional flag *quote* is true, the quotation mark
- character (``"``) is also translated; this helps for inclusion in an HTML
- attribute value delimited by double quotes, as in ``<a href="...">``. Note
- that single quotes are never translated.
-
- .. deprecated:: 3.2
- This function is unsafe because *quote* is false by default, and therefore
- deprecated. Use :func:`html.escape` instead.
-
-
.. _cgi-security:
Caring about security
to help eliminate confusion as to what Python interpreter the ``pyvenv``
script is tied to. (Contributed by Brett Cannon in :issue:`25427`.)
+* ``parse_qs``, ``parse_qsl``, and ``escape`` are removed from :mod:`cgi`
+ module. They are deprecated from Python 3.2 or older.
+
+
Porting to Python 3.8
=====================
import urllib.parse
from email.parser import FeedParser
from email.message import Message
-from warnings import warn
import html
import locale
import tempfile
-__all__ = ["MiniFieldStorage", "FieldStorage",
- "parse", "parse_qs", "parse_qsl", "parse_multipart",
+__all__ = ["MiniFieldStorage", "FieldStorage", "parse", "parse_multipart",
"parse_header", "test", "print_exception", "print_environ",
"print_form", "print_directory", "print_arguments",
- "print_environ_usage", "escape"]
+ "print_environ_usage"]
# Logging support
# ===============
encoding=encoding)
-# parse query string function called from urlparse,
-# this is done in order to maintain backward compatibility.
-
-def parse_qs(qs, keep_blank_values=0, strict_parsing=0):
- """Parse a query given as a string argument."""
- warn("cgi.parse_qs is deprecated, use urllib.parse.parse_qs instead",
- DeprecationWarning, 2)
- return urllib.parse.parse_qs(qs, keep_blank_values, strict_parsing)
-
-def parse_qsl(qs, keep_blank_values=0, strict_parsing=0):
- """Parse a query given as a string argument."""
- warn("cgi.parse_qsl is deprecated, use urllib.parse.parse_qsl instead",
- DeprecationWarning, 2)
- return urllib.parse.parse_qsl(qs, keep_blank_values, strict_parsing)
-
def parse_multipart(fp, pdict, encoding="utf-8", errors="replace"):
"""Parse multipart input.
# Utilities
# =========
-def escape(s, quote=None):
- """Deprecated API."""
- warn("cgi.escape is deprecated, use html.escape instead",
- DeprecationWarning, stacklevel=2)
- s = s.replace("&", "&") # Must be done first!
- s = s.replace("<", "<")
- s = s.replace(">", ">")
- if quote:
- s = s.replace('"', """)
- return s
-
-
def valid_boundary(s):
import re
if isinstance(s, bytes):
import sys
import tempfile
import unittest
-import warnings
from collections import namedtuple
from io import StringIO, BytesIO
from test import support
fs = cgi.FieldStorage(headers={'content-type':'text/plain'})
self.assertRaises(TypeError, bool, fs)
- def test_escape(self):
- # cgi.escape() is deprecated.
- with warnings.catch_warnings():
- warnings.filterwarnings('ignore', r'cgi\.escape',
- DeprecationWarning)
- self.assertEqual("test & string", cgi.escape("test & string"))
- self.assertEqual("<test string>", cgi.escape("<test string>"))
- self.assertEqual(""test string"", cgi.escape('"test string"', True))
-
def test_strict(self):
for orig, expect in parse_strict_test_cases:
# Test basic parsing
v = gen_result(data, environ)
self.assertEqual(result, v)
- def test_deprecated_parse_qs(self):
- # this func is moved to urllib.parse, this is just a sanity check
- with check_warnings(('cgi.parse_qs is deprecated, use urllib.parse.'
- 'parse_qs instead', DeprecationWarning)):
- self.assertEqual({'a': ['A1'], 'B': ['B3'], 'b': ['B2']},
- cgi.parse_qs('a=A1&b=B2&B=B3'))
-
- def test_deprecated_parse_qsl(self):
- # this func is moved to urllib.parse, this is just a sanity check
- with check_warnings(('cgi.parse_qsl is deprecated, use urllib.parse.'
- 'parse_qsl instead', DeprecationWarning)):
- self.assertEqual([('a', 'A1'), ('b', 'B2'), ('B', 'B3')],
- cgi.parse_qsl('a=A1&b=B2&B=B3'))
-
def test_parse_header(self):
self.assertEqual(
cgi.parse_header("text/plain"),
--- /dev/null
+Remove deprecated ``cgi.escape``, ``cgi.parse_qs`` and ``cgi.parse_qsl``.