{ "info": { "author": "Fu Jian", "author_email": "fujian_en@126.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP" ], "description": "# Django Patchy\n\n[![PyPI version](https://badge.fury.io/py/djangopatchy.svg)](https://badge.fury.io/py/djangopatchy)\n\n**Useful django app and utils to develop large-scale web app**\n\n# Requirements\n\n* Python (2.7)\n* Django (1.8, 1.9)\n\n# Installation\n\nInstall using `pip`...\n\n pip install djangopatchy\n\n# Middlewares\n\n## LongRequestMiddleware\n\nLet's add a middleware to calculate the time elapse for each request\n\n1. Add a middleware at the top:\n\n```python\nMIDDLEWARE_CLASSES = (\n 'patchy.middleware.LongRequestMiddleware',\n ...\n)\n```\n\n2. Add logger handler with `pathcy.middleware`:\n\nExample:\n\n```python\n'patchy.middleware': {\n 'handlers': ['sentry'],\n 'level': 'WARNING',\n 'propagate': True\n}\n```\n\n3. Set the timeout threshold in settings(default to 1 second):\n\n```python\nPATCHY_LONG_REQUEST_TIMEOUT = 2 # set the timeout to 2 seconds\n```\n\nResults:\n\n* For each web request, it has a header variable `X-ELAPSED` in seconds to indicate the time elapse. \n\n```bash\nX-ELAPSED: 0.005 # it means the request costs 5 ms\n```\n\n* If it exceeds the `PATCHY_LONG_REQUEST_TIMEOUT` a error log message will be sent.\n\n4. Add some urls to ignore list(optional), regular expression is supported.\n\n```python\nPATCHY_LONG_REQUEST_IGNORE_URLS = [\n r'^/_admin/.*$',\n]\n```\n\n# Utilities\n\n## long_sql_execute_wrapper\n\nLet us rewrite the CursorWrapper.execute to calculate the sql process time\n\n1. Add the python snippets in the `djangoproject/__init__.py`\n```python\n# rewrite the sql operation method\nfrom django.db.backends import utils\nfrom patchy.utils import long_sql_execute_wrapper\nutils.CursorWrapper.execute = long_sql_execute_wrapper\n```\n\n2. Add logger handler with `pathcy.utils`:\n\nExample:\n\n```python\n'patchy.utils': {\n 'handlers': ['sentry'],\n 'level': 'WARNING',\n 'propagate': True\n}\n```\n\n3. Set the timeout threshold in settings(default to 0.05 seond, which is 50 miliseconds):\n\n```python\nPATCHY_LONG_SQL_TIMEOUT = 0.01 # set the timeout to 10 miliseconds\n```\n\nResult:\n\n* If the sql operation exceeds the `PATCHY_LONG_SQL_TIMEOUT` a error log message will be sent.\n\n4. no\\_sql\\_monitoring\n\n`no_sql_monitoring` is a decorator for wrapping code to skip sql monitoring.\n\n```python\nfrom patchy.utils import no_sql_monitoring\n\n@no_sql_monitoring\ndef transaction_status(request, transaction_no):\n transaction = Transaction.objects.get(transaction_no=transaction_no)\n\n return ResponseBuilder.build_success_json_response(\n msg='\u67e5\u8be2\u8ba2\u5355\u6210\u529f',\n data={\n 'transaction_no': transaction_no,\n 'transaction_status': transaction.transaction_status\n })\n```", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "UNKNOWN", "keywords": null, "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "djangopatchy", "package_url": "https://pypi.org/project/djangopatchy/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/djangopatchy/", "project_urls": { "Download": "UNKNOWN", "Homepage": "UNKNOWN" }, "release_url": "https://pypi.org/project/djangopatchy/0.0.9/", "requires_dist": null, "requires_python": null, "summary": "Useful django patch for large project", "version": "0.0.9" }, "last_serial": 2370155, "releases": { "0.0.5": [ { "comment_text": "", "digests": { "md5": "00dda8d93cf7dd5a0840df1fa6a46fcc", "sha256": "0301bd2159e3aa24ace079c08fabed40c778d67263528bcad69cc3d2c0d83204" }, "downloads": -1, "filename": "djangopatchy-0.0.5.tar.gz", "has_sig": false, "md5_digest": "00dda8d93cf7dd5a0840df1fa6a46fcc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3197, "upload_time": "2016-07-21T08:03:10", "url": "https://files.pythonhosted.org/packages/e9/ec/a9144ff8a1b4bc8de130dda0d71b4215a1b8060cc209d9a630d2487083b7/djangopatchy-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "96e1bd7ca925969df4a360ec8a914d50", "sha256": "ac6abd2233c1f7b18382dade3fe419bfb2ffbdf69ada48b60109283026e05dfd" }, "downloads": -1, "filename": "djangopatchy-0.0.6.tar.gz", "has_sig": false, "md5_digest": "96e1bd7ca925969df4a360ec8a914d50", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3192, "upload_time": "2016-07-25T03:48:11", "url": "https://files.pythonhosted.org/packages/76/9d/f95f2be9083f81b5419ba6905021f306e886945787a0acb500a78994d1ef/djangopatchy-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "924df3630c724b31ace44b4e81d35012", "sha256": "886398630a585c8dc4bf744d75ada6e4e365a833561c62ea3dbc444855d9c269" }, "downloads": -1, "filename": "djangopatchy-0.0.7.tar.gz", "has_sig": false, "md5_digest": "924df3630c724b31ace44b4e81d35012", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4033, "upload_time": "2016-08-05T11:45:03", "url": "https://files.pythonhosted.org/packages/3b/7a/928b70257a826e2768e2b19e7c95d81c6c7c77fa29fe3433e15b08b66b42/djangopatchy-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "10e36c28ee6f36ea388f84dff36af862", "sha256": "79bfae0e1c1157405373040dd0140ce6b82ca3e33d130d641695b245a55aa5d3" }, "downloads": -1, "filename": "djangopatchy-0.0.8.tar.gz", "has_sig": false, "md5_digest": "10e36c28ee6f36ea388f84dff36af862", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3823, "upload_time": "2016-09-29T04:08:55", "url": "https://files.pythonhosted.org/packages/c3/db/c70808e87ca85ca49a9f058f907ae3e4659d5a56655fb10fae86bdd10558/djangopatchy-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "081f136408c492455ffeec7cd19ac9af", "sha256": "d9637d1cbfe86b9aa3d3bf5c4f10cf23defa39db1fe3c0e0aa149a0d5a38fd38" }, "downloads": -1, "filename": "djangopatchy-0.0.9.tar.gz", "has_sig": false, "md5_digest": "081f136408c492455ffeec7cd19ac9af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3825, "upload_time": "2016-09-29T04:14:33", "url": "https://files.pythonhosted.org/packages/30/97/04fd7f9883c0693e957ca11a9796b3c3cedff8d7aa3a55455ce47b21dc49/djangopatchy-0.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "081f136408c492455ffeec7cd19ac9af", "sha256": "d9637d1cbfe86b9aa3d3bf5c4f10cf23defa39db1fe3c0e0aa149a0d5a38fd38" }, "downloads": -1, "filename": "djangopatchy-0.0.9.tar.gz", "has_sig": false, "md5_digest": "081f136408c492455ffeec7cd19ac9af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3825, "upload_time": "2016-09-29T04:14:33", "url": "https://files.pythonhosted.org/packages/30/97/04fd7f9883c0693e957ca11a9796b3c3cedff8d7aa3a55455ce47b21dc49/djangopatchy-0.0.9.tar.gz" } ] }