{ "info": { "author": "Deniz Dogan", "author_email": "denizdogan@users.noreply.github.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# Django Debug Requests & Responses (DDRR)\n\n[![CircleCI](https://circleci.com/gh/denizdogan/django-debug-requests-responses/tree/master.svg?style=svg)](https://circleci.com/gh/denizdogan/django-debug-requests-responses/tree/master)\n\nGet more out of your `runserver` development output! Print request and response\nheaders, body (with pretty-printing), etc. Highly customizable!\n\n- Full request headers\n- The entire request body\n- Pretty-printing optional\n- Colored output\n- Super easy setup\n- No extra dependencies\n\nDDRR can also be used for general logging with some configuration of your own.\n\n## Installation\n\n1. ```\n $ pip install ddrr\n ```\n\n2. Add `\"ddrr\"` to `INSTALLED_APPS`\n\n3. Insert `\"ddrr.middleware.DebugRequestsResponses\"` first in `MIDDLEWARE`\n\n**Done!** When you run `runserver`, you'll now get the entire HTTP requests and\nresponses, including headers and bodies.\n\nIf you don't like the default output format, read on...\n\n## Customization\n\n```python\nDDRR = {\n \"ENABLE_REQUESTS\": True, # enable request logging\n \"ENABLE_RESPONSES\": True, # enable response logging\n \"LEVEL\": \"DEBUG\", # ddrr log level\n \"PRETTY_PRINT\": False, # pretty-print JSON and XML\n \"REQUEST_TEMPLATE_NAME\": \"ddrr/default-request.html\", # request log template name\n \"REQUEST_TEMPLATE\": None, # request log template string (overrides template name)\n \"RESPONSE_TEMPLATE_NAME\": \"ddrr/default-response.html\", # response log template name\n \"RESPONSE_TEMPLATE\": None, # response log template string (overrides template name)\n \"REQUEST_HANDLER\": logging.StreamHandler(), # request log handler\n \"RESPONSE_HANDLER\": logging.StreamHandler(), # response log handler\n \"ENABLE_COLORS\": True, # enable colors if terminal supports it\n \"LIMIT_BODY\": None, # limit request/response body output to X chars\n \"DISABLE_DJANGO_SERVER_LOG\": False, # disable default django server log\n}\n```\n\n### Template contexts\n\nIf you want to customize request or response templates, you can use the following values:\n\n- **Request template context:**\n - `ddrr.body` - request body\n - `ddrr.content_type` - request content type\n - `ddrr.formatter` - the formatter\n - `ddrr.headers` - mapping of header fields and values\n - `ddrr.method` - request method\n - `ddrr.path` - request path\n - `ddrr.query_params` - query parameters\n - `ddrr.query_string` - query string\n - `ddrr.record` - the actual log record object\n - `ddrr.request` - the actual request object\n- **Response template context:**\n - `ddrr.content` - response content\n - `ddrr.content_type` - response content type\n - `ddrr.formatter` - the formatter\n - `ddrr.headers` - mapping of header fields and values\n - `ddrr.reason_phrase` - response reason phrase\n - `ddrr.record` - the actual log record object\n - `ddrr.response` - the actual response object\n - `ddrr.status_code` - response status code\n\nFor example, this will log the method, path and body of each request, as well\nas the status code, reason phrase and content of each response:\n\n```python\nDDRR = {\n \"REQUEST_TEMPLATE\": \"{{ ddrr.method }} {{ ddrr.path }}\\n\"\n \"{{ ddrr.body }}\",\n \"RESPONSE_TEMPLATE\": \"{{ ddrr.status_code }} {{ ddrr.reason_phrase }}\\n\"\n \"{{ ddrr.content }}\",\n}\n```\n\n### Pretty-printing\n\nBy default, pretty-printing is disabled. Set `DDRR[\"PRETTY_PRINT\"]` to `True`\nto enable it.\n\nPretty-printing of JSON requires no external dependency.\n\nPretty-printing of XML uses `minidom` by default and doesn't require any extra\ndependency. If you want to use `lxml` instead, which is slightly better at\npretty-printing XML, you can install that using `pip install ddrr[xml]`.\n\n## How it works internally\n\nThe middleware `ddrr.middleware.DebugRequestsResponses` sends the entire\nrequest object as the message to `ddrr-request-logger`. This logger has been\nconfigured to use `ddrr.formatters.DjangoTemplateRequestFormatter` which\ninternally uses Django's built-in template engine to format the request into\nhuman-readable form. By default, this is shown in your console output, but you\ncan easily configure it to log it to a file, Logstash, or anything else.\n\n## Similar projects\n\n- [Django Debug Toolbar](https://django-debug-toolbar.readthedocs.io)\n\n## Development and contributions\n\nPR's are always welcome!\n\nFor hacking on DDRR, make sure you are familiar with:\n\n- [Black](https://github.com/ambv/black)\n- [Flake8](http://flake8.pycqa.org/)\n- [Poetry](https://poetry.eustace.io/)\n- [pre-commit](https://github.com/pre-commit/pre-commit)\n- [pytest](https://docs.pytest.org)\n\nInstall dependencies and set up the pre-commit hooks.\n\n```\n$ poetry install\n$ pre-commit install\n```\n\nThe pre-commit hooks will, among other things, run Flake8 on the code base and\nBlack to make sure the code style is consistent across all files. Check out\n[`.pre-commit-config.yaml`](.pre-commit-config.yaml) for details.\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/denizdogan/django-debug-requests-responses", "keywords": "django,debug,requests,responses,logging", "license": "", "maintainer": "Deniz Dogan", "maintainer_email": "denizdogan@users.noreply.github.com", "name": "ddrr", "package_url": "https://pypi.org/project/ddrr/", "platform": "", "project_url": "https://pypi.org/project/ddrr/", "project_urls": { "Homepage": "https://github.com/denizdogan/django-debug-requests-responses", "Repository": "https://github.com/denizdogan/django-debug-requests-responses" }, "release_url": "https://pypi.org/project/ddrr/1.2.0/", "requires_dist": [ "attrs (>=19.1,<20.0)", "Django (>=2.0,<3.0)", "lxml (>=4.3,<5.0); extra == \"xml\"" ], "requires_python": ">=3.5,<4.0", "summary": "", "version": "1.2.0" }, "last_serial": 5866087, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "b94f6c34dd5a9c82db75e12e1f6dc090", "sha256": "e8e6c701574169ff70b9123205df990669469f6892aa155d196c7ddc1f523eff" }, "downloads": -1, "filename": "ddrr-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b94f6c34dd5a9c82db75e12e1f6dc090", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 7351, "upload_time": "2019-05-18T08:26:09", "url": "https://files.pythonhosted.org/packages/66/36/6e9c513833458e9381349ec384517bf5172cd0d021447d1039ffbecb88ba/ddrr-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e064c238c72f844261409ee7ec6d0558", "sha256": "9d70d36e3ffdb134c6ea88a38c0f26817650106465c34629d16949de514488a3" }, "downloads": -1, "filename": "ddrr-0.1.0.tar.gz", "has_sig": false, "md5_digest": "e064c238c72f844261409ee7ec6d0558", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 5864, "upload_time": "2019-05-18T08:26:11", "url": "https://files.pythonhosted.org/packages/5b/18/07d60cec08593891b5a0227678f5aa693a756614e3d67a84a8de7b04740c/ddrr-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "c100f03cc9da0574c65a5b279a9a42d9", "sha256": "d9618ebd2de82a11a7653bf6b30805366a10afd825ce6fd1410a8fc64263aa14" }, "downloads": -1, "filename": "ddrr-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c100f03cc9da0574c65a5b279a9a42d9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 8398, "upload_time": "2019-05-18T08:36:22", "url": "https://files.pythonhosted.org/packages/81/90/05d8f3db9e7deb7a4b60ee7d94a810590e7971190a7794985f555dbafc63/ddrr-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "99e60f0e434e811c98d91b5c6dcdd94e", "sha256": "0e8db821e849641d17152481f9de38d7064f1469dbc4706262c19c8cca14f0dc" }, "downloads": -1, "filename": "ddrr-0.1.1.tar.gz", "has_sig": false, "md5_digest": "99e60f0e434e811c98d91b5c6dcdd94e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 8068, "upload_time": "2019-05-18T08:36:23", "url": "https://files.pythonhosted.org/packages/16/eb/7d190647cbe35fc70dbf8b69a5ec06af74ae84eba3d93e152d788a9e62b3/ddrr-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "d475b7f89f518b0d98a13e101eb06718", "sha256": "b6663338b676bc53119c00eab679c5c20895d3e2f3c945129826222f2c946868" }, "downloads": -1, "filename": "ddrr-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d475b7f89f518b0d98a13e101eb06718", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 8409, "upload_time": "2019-05-18T11:06:22", "url": "https://files.pythonhosted.org/packages/ed/e2/f1f84c6cd17ef21b5a91511fcc5726fe5922a72247c73183933027aba4eb/ddrr-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "82efa1295e23cbd827b3b95696e5f9a8", "sha256": "01000ebb5a481ff5ae49ef640f70aa85581ea0a49d16f96bd4b9d51f36e432c6" }, "downloads": -1, "filename": "ddrr-0.2.0.tar.gz", "has_sig": false, "md5_digest": "82efa1295e23cbd827b3b95696e5f9a8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 8099, "upload_time": "2019-05-18T11:06:24", "url": "https://files.pythonhosted.org/packages/b2/6d/c0a307ec2958c05db0a68f045a9614e145106560ba2581a3bf8f72cba527/ddrr-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "7b37f88b206469650ebee9300b9a7226", "sha256": "1624031cd1ac6cea0bbcd73727c7b6c22bbd026ee9c26d7baf22ba7b6a0ddb41" }, "downloads": -1, "filename": "ddrr-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7b37f88b206469650ebee9300b9a7226", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 10636, "upload_time": "2019-05-24T18:10:03", "url": "https://files.pythonhosted.org/packages/52/4f/6d26824554a437bcba2fa962d96f13bbbb5af7e67ac7c42fa571d1ca79a8/ddrr-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "58ab8f1470308d79de01a85e70d29db1", "sha256": "c1d3703960c195a7ce78b70c98f608737908cdd31be18339c55c1884eecd84fc" }, "downloads": -1, "filename": "ddrr-0.3.0.tar.gz", "has_sig": false, "md5_digest": "58ab8f1470308d79de01a85e70d29db1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 10542, "upload_time": "2019-05-24T18:10:04", "url": "https://files.pythonhosted.org/packages/46/2a/3095fdc23b8b8b6188eddbb628a4293616dcce08229a4bc6a01ce4b41acb/ddrr-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "f48a179657060f316c16ec4980831eff", "sha256": "70dbbb8c702cc7ca3d74b0f245ce78ef4e44a499174a50bb53941c880bdfee6b" }, "downloads": -1, "filename": "ddrr-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f48a179657060f316c16ec4980831eff", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 10881, "upload_time": "2019-05-26T09:33:44", "url": "https://files.pythonhosted.org/packages/60/6f/80662a15f0052a5464cc3abd27142ec1583feb7661c51863ce0e9b7c9aba/ddrr-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "353f472dbb6f8a5fb8949cabaacc9539", "sha256": "fc4e3f2538d788f27881f50ebb6c8fc0d76f9736059727090999e1ad97dfae0f" }, "downloads": -1, "filename": "ddrr-0.3.1.tar.gz", "has_sig": false, "md5_digest": "353f472dbb6f8a5fb8949cabaacc9539", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 10985, "upload_time": "2019-05-26T09:33:46", "url": "https://files.pythonhosted.org/packages/c0/e0/820a4c62ccd0cfbc38def5eda731142d74236e24a7e0678aaeb692e5a4fa/ddrr-0.3.1.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "dde892eb7dd7295202659a2aa264daaf", "sha256": "e58ffd95bb5d8bbadf5f8067e2b257e467857eee6e12f0ab369555f06a27b725" }, "downloads": -1, "filename": "ddrr-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "dde892eb7dd7295202659a2aa264daaf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 10595, "upload_time": "2019-09-16T21:24:06", "url": "https://files.pythonhosted.org/packages/28/85/62413a4d1516cece2b7ac0ec03af3a40974d0ba5c8a2684edd6c438cbdd9/ddrr-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a9fc247291b0d0fd8a8b6fbe34c20f68", "sha256": "64148dc29d573bccd979b317443acd66b2346b588eef0818d81549178d3f75a5" }, "downloads": -1, "filename": "ddrr-1.0.0.tar.gz", "has_sig": false, "md5_digest": "a9fc247291b0d0fd8a8b6fbe34c20f68", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 10612, "upload_time": "2019-09-16T21:24:08", "url": "https://files.pythonhosted.org/packages/93/bd/9bba1fb7512ddb84174d1566f65fb6403ba40ae418d9320522d3541b4765/ddrr-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "4cdb48ebe7973ad57c5cb46760095915", "sha256": "e0388743fe0900b8f235e9112bb0a846f2593d75dd795f45957e81f868d6795c" }, "downloads": -1, "filename": "ddrr-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4cdb48ebe7973ad57c5cb46760095915", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 10773, "upload_time": "2019-09-16T21:59:08", "url": "https://files.pythonhosted.org/packages/28/a0/1e58d0f5c1fe790997821a9affdf1fbe5a623a52e74c9ee0aae776392be9/ddrr-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8074e714076b403e69d0767ea7df67dc", "sha256": "3be4bcc93eca7f82ba463fcd0ed450841372ff7e49695f5b200c0ba63919a560" }, "downloads": -1, "filename": "ddrr-1.1.0.tar.gz", "has_sig": false, "md5_digest": "8074e714076b403e69d0767ea7df67dc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 10874, "upload_time": "2019-09-16T21:59:10", "url": "https://files.pythonhosted.org/packages/91/6a/5cafaf0ab2c197d8cf6e98445efc31a412c8cdf17a78b11b86cb9aa0aa45/ddrr-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "1d2fbf8ac792767974a1feb6257175bc", "sha256": "0bdc476875a65c17a5eb8fe38cc0834f2419dfd2aeea687439a69ac404ec44ab" }, "downloads": -1, "filename": "ddrr-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "1d2fbf8ac792767974a1feb6257175bc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 10879, "upload_time": "2019-09-18T15:25:45", "url": "https://files.pythonhosted.org/packages/ae/e0/ace90ad51afb6b38c6301e622acffe06763a5f9007c9d71afb38ac92b102/ddrr-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "18f4852d266f4701f5d13976df74c89c", "sha256": "5170c926390fc7d7f1830d1927eb2baf18a3fa8c10454783e8d22351db71ef4c" }, "downloads": -1, "filename": "ddrr-1.1.1.tar.gz", "has_sig": false, "md5_digest": "18f4852d266f4701f5d13976df74c89c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 11024, "upload_time": "2019-09-18T15:25:47", "url": "https://files.pythonhosted.org/packages/c2/9b/ac5ce84433a2e33b81fc5ccd1d4328bf6f7bbdc8206628882022ee07dd51/ddrr-1.1.1.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "9e14302c94ec17137bc1aa86dc43557a", "sha256": "5bb97d071db9f4fb0998f4260a30db87aa7701e6569789521ae04dca0b170208" }, "downloads": -1, "filename": "ddrr-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9e14302c94ec17137bc1aa86dc43557a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 10906, "upload_time": "2019-09-21T14:05:34", "url": "https://files.pythonhosted.org/packages/de/9e/814bf42b4173cc92ba28d9691bb2aa15e92c9c105ffa10bc3bd14b655500/ddrr-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ec9f6a08c795c2f1d3e60aae3b248305", "sha256": "a1beea5e3aecd9749c6ff1831118bcc7940d6b21cdc9586491e127d24a0c6f11" }, "downloads": -1, "filename": "ddrr-1.2.0.tar.gz", "has_sig": false, "md5_digest": "ec9f6a08c795c2f1d3e60aae3b248305", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 11049, "upload_time": "2019-09-21T14:05:35", "url": "https://files.pythonhosted.org/packages/ee/f4/975abeb1dc1e61cf1bf41940d8e481c3ec4e4a9f3718a759aca06a015122/ddrr-1.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9e14302c94ec17137bc1aa86dc43557a", "sha256": "5bb97d071db9f4fb0998f4260a30db87aa7701e6569789521ae04dca0b170208" }, "downloads": -1, "filename": "ddrr-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9e14302c94ec17137bc1aa86dc43557a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5,<4.0", "size": 10906, "upload_time": "2019-09-21T14:05:34", "url": "https://files.pythonhosted.org/packages/de/9e/814bf42b4173cc92ba28d9691bb2aa15e92c9c105ffa10bc3bd14b655500/ddrr-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ec9f6a08c795c2f1d3e60aae3b248305", "sha256": "a1beea5e3aecd9749c6ff1831118bcc7940d6b21cdc9586491e127d24a0c6f11" }, "downloads": -1, "filename": "ddrr-1.2.0.tar.gz", "has_sig": false, "md5_digest": "ec9f6a08c795c2f1d3e60aae3b248305", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5,<4.0", "size": 11049, "upload_time": "2019-09-21T14:05:35", "url": "https://files.pythonhosted.org/packages/ee/f4/975abeb1dc1e61cf1bf41940d8e481c3ec4e4a9f3718a759aca06a015122/ddrr-1.2.0.tar.gz" } ] }