{ "info": { "author": "Thomas Welfley", "author_email": "thomas.welfley+djproxy@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Framework :: Django :: 1.10", "Framework :: Django :: 1.4", "Framework :: Django :: 1.5", "Framework :: Django :: 1.6", "Framework :: Django :: 1.7", "Framework :: Django :: 1.8", "Framework :: Django :: 1.9", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Libraries" ], "description": "djproxy\n=======\n\n|Build Status| |Coverage Status| |Latest Version|\n\n.. |Build Status| image:: https://img.shields.io/travis/thomasw/djproxy.svg\n :target: https://travis-ci.org/thomasw/djproxy\n.. |Coverage Status| image:: https://img.shields.io/coveralls/thomasw/djproxy.svg\n :target: https://coveralls.io/r/thomasw/djproxy\n.. |Latest Version| image:: https://img.shields.io/pypi/v/djproxy.svg\n :target: https://pypi.python.org/pypi/djproxy/\n\ndjproxy is a class-based generic view reverse HTTP proxy for Django.\n\nWhy?\n----\n\nIf an application depends on a proxy (to get around Same Origin Policy\nissues in JavaScript, perhaps), djproxy can be used to provide that\nfunctionality in a web server agnostic way. This allows developers to\nkeep local development environments for proxy dependent applications\nfully functional without needing to run anything other than the django\ndevelopment server.\n\ndjproxy is also suitable for use in production environments and has been\nproven to be performant in large scale deployments. However, a web\nserver's proxy capabilities will be *more* performant in many cases. If\none needs to use this in production, it should be fine as long as\nupstream responses aren't large. Performance can be further increased by\naggressively caching upstream responses.\n\nNote that djproxy doesn't currently support websockets because django\ndoesn't support them. I will investigate adding websocket support as\nsoon as django has it.\n\nInstallation\n------------\n\n::\n\n pip install djproxy\n\ndjproxy requires requests >= 1.0.0, django >= 1.4.0 and python >= 2.6.\n\nIt's currently tested against Django 1.4.x, 1.5.x, 1.6.x, 1.7.x, 1.9.x, and\n1.10.x.\n\nUsage\n-----\n\nStart by defining a new proxy:\n\n.. code:: python\n\n from djproxy.views import HttpProxy\n\n class LocalProxy(HttpProxy):\n base_url = 'https://google.com/'\n\nAdd a url pattern that points at the proxy view. The ``url`` kwarg will\nbe urljoined with base\\_url:\n\n.. code:: python\n\n urlpatterns = [\n url(r'^local_proxy/(?P.*)$', LocalProxy.as_view(), name='proxy')\n ]\n\n``/local_proxy/some/content`` will now proxy\n``https://google.com/some/content/``.\n\nAdditional examples can be found here:\n`views `_,\n`urls `_.\n\nHttpProxy configuration:\n~~~~~~~~~~~~~~~~~~~~~~~~\n\n``HttpProxy`` view's behavior can be further customized by overriding\nthe following class attributes.\n\n- ``base_url``: The proxy url is formed by\n ``urlparse.urljoin(base_url, url_kwarg)``\n- ``ignored_upstream_headers``: A list of headers that shouldn't be\n forwarded to the browser from the proxied endpoint.\n- ``ignored_request_headers``: A list of headers that shouldn't be\n forwarded to the proxied endpoint from the browser.\n- ``proxy_middleware``: A list of proxy middleware to apply to request\n and response data.\n- ``pass_query_string``: A boolean indicating whether the query string\n should be sent to the proxied endpoint.\n- ``reverse_urls``: An iterable of location header replacements to be\n made on the constructed response (similar to Apache's\n ``ProxyPassReverse`` directive).\n- ``verify_ssl``\\*: This attribute corresponds to `requests' verify\n parameter `_.\n It may be either a boolean, which toggles SSL certificate\n verification on or off, or the path to a CA\\_BUNDLE file for private\n certificates.\n- ``cert``\\*: This attribute corresponds to `requests' cert\n parameter `_.\n If a string is specified, it will be treated as a path to an ssl\n client cert file (.pem). If a tuple is specified, it will be treated\n as a ('cert', 'key') pair.\n- ``timeout``\\*: This attribute corresponds to `requests' timeout\n parameter `_.\n It is used to specify how long to wait for the upstream server to\n send data before giving up. The value must be either a float\n representing the total timeout time in seconds, or a (connect timeout\n float, read timeout float) tuple.\n\n\\* The behavior changes that result from configuring ``verify_ssl``,\n``cert``, and ``timeout`` will ultimately be dependent on the specific\nversion of requests that's installed. For example, in older versions of\nrequests, tuple values are not supported for the ``cert`` and\n``timeout`` properties.\n\nAdjusting location headers (ProxyPassReverse)\n---------------------------------------------\n\nApache has a directive called ``ProxyPassReverse`` that makes\nreplacements to three location headers: ``URI``, ``Location``, and\n``Content-Location``. Without this functionality, proxying an endpoint\nthat returns a redirect with a ``Location`` header of\n``http://foo.bar/go/cats/`` would cause a downstream requestor to be\nredirected away from the proxy. djproxy has a similar mechanism which is\nexposed via the ``reverse_urls`` class variable. The following proxies\nare equivalent:\n\nDjproxy:\n\n.. code:: python\n\n\n class ReverseProxy(HttpProxy):\n base_url = 'https://google.com/'\n reverse_urls = [\n ('/google/', 'https://google.com/')\n ]\n\n urlpatterns = patterns[\n url(r'^google/(?P.*)$', ReverseProxy.as_view(), name='gproxy')\n ]\n\nApache:\n\n::\n\n \n Order deny,allow\n Allow from all\n \n ProxyPass /google/ https://google.com/\n ProxyPassReverse /google/ https://google.com/\n\nHttpProxy dynamic configuration and route generation helper:\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo specify the configuration for a set of proxies, without having to\nmaintain specific classes and url routes, one can use\n``djproxy.helpers.generate_routes`` as follows:\n\nIn ``urls.py``, pass ``generate_routes`` a ``configuration`` dict to\nconfigure a set of proxies:\n\n.. code:: python\n\n from djproxy.urls import generate_routes\n\n configuration = {\n 'test_proxy': {\n 'base_url': 'https://google.com/',\n 'prefix': '/test_prefix/',\n },\n 'service_name': {\n 'base_url': 'https://service.com/',\n 'prefix': '/service_prefix/',\n 'verify_ssl': False,\n 'append_middlware': ['myapp.proxy_middleware.add_headers']\n }\n }\n\n urlpatterns += generate_routes(configuration)\n\nUsing the snippet above will enable a Django app to proxy\n``https://google.com/X`` at ``/test_prefix/X`` and\n``https://service.com/Y`` at ``/service_prefix/Y``.\n\nThese correspond to the following production Apache proxy configuration:\n\n::\n\n \n Order deny,allow\n Allow from all\n \n ProxyPass /test_prefix/ https://google.com/\n ProxyPassReverse /test_prefix/ https://google.com/\n\n\n \n Order deny,allow\n Allow from all\n \n ProxyPass /service_prefix/ http://service.com/\n ProxyPassReverse /service_prefix/ http://service.com/\n\nRequired configuration keys:\n\n- ``base_url``\n- ``prefix``\n\nOptional configuration keys:\n\n- ``verify_ssl``: defaults to ``True``.\n- ``csrf_exempt``: defaults to ``True``.\n- ``cert``: defaults to ``None``.\n- ``timeout``: defaults to ``None``.\n- ``middleware``: Defaults to ``None``. Specifying ``None`` causes\n djproxy to use the default middleware set. If a list is passed, the\n default middleware list specified by the HttpProxy definition will be\n replaced with the provided list.\n- ``append_middleware``: Defaults to ``None``. ``None`` results in no\n changes to the default middleware set. If a list is specified, the\n list will be appended to the default middleware list specified in the\n HttpProxy definition or, if provided, the middleware key specified in\n the config dict.\n\nProxy middleware\n----------------\n\nHttpProxys support custom middleware for preprocessing data from\ndownstream to be sent to upstream endpoints and for preprocessing\nresponse data before it is sent back downstream. ``X-Forwarded-Host``,\n``X-Forwarded-For``, ``X-Forwarded-Proto`` and the ``ProxyPassRevere``\nfunctionality area all implemented as middleware.\n\nHttProxy views are configured to execute particular middleware by\nsetting their ``proxy_middleware`` attribute. The following HttpProxy\nwould attach XFF and XFH headers, but not preform the ProxyPassReverse\nheader translation or attach an XFP header:\n\n.. code:: python\n\n class ReverseProxy(HttpProxy):\n base_url = 'https://google.com/'\n reverse_urls = [\n ('/google/', 'https://google.com/')\n ]\n proxy_middleware = [\n 'djproxy.proxy_middleware.AddXFF',\n 'djproxy.proxy_middleware.AddXFH'\n ]\n\nIf a custom middleware is needed to modify content, headers, cookies,\netc before the content is sent upstream of if one needs to make similar\nmodifications before the content is sent back downstream, a custom\nmiddleware can be written and proxy views can be configured to use it.\ndjproxy contains a `middleware\ntemplate `_\nto make this process easier.\n\nTerminology\n-----------\n\nIt is important to understand the meaning of these terms in the context\nof this project:\n\n**upstream**: The destination that is being proxied.\n\n**downstream**: The agent that initiated the request to djproxy.\n\nContributing\n------------\n\nTo run the tests, first install development dependencies:\n\n::\n\n pip install -r requirements.txt\n\nTo test this against a version of Django other than the latest supported\non the test environment's Python version, wipe out the\n``requirements.txt`` installation by pip installing the desired version.\n\nRun ``nosetests`` to execute the test suite.\n\nTo automatically run the test suite, flake8, and pep257 checks whenever python\nfiles change use testtube by executing ``stir`` in the top level djproxy\ndirectory.\n\nTo run a Django dev server that proxies itself, execute the following:\n\n::\n\n django-admin.py runserver --settings=tests.test_settings --pythonpath=\"./\"\n\nSimilarly, to run a configure Django shell, execute the following:\n\n::\n\n django-admin.py shell --settings=tests.test_settings --pythonpath=\"./\"\n\nSee ``tests/test_settings.py`` and ``tests/test_urls.py`` for\nconfiguration information.\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/thomasw/djproxy", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "djproxy", "package_url": "https://pypi.org/project/djproxy/", "platform": "", "project_url": "https://pypi.org/project/djproxy/", "project_urls": { "Homepage": "https://github.com/thomasw/djproxy" }, "release_url": "https://pypi.org/project/djproxy/2.3.4/", "requires_dist": [ "django (>=1.4)", "requests (>=1.0.0)", "six (>=1.9.0)" ], "requires_python": "", "summary": "djproxy is a simple reverse proxy class-based generic view for Django apps.", "version": "2.3.4" }, "last_serial": 2540128, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "ccd149ce6d0466137cf80353e785b302", "sha256": "9ad574bd5ff0cb74b7ce50888047ca4df7d18ae9d0e7feb5c65e1ad1ab2c8cba" }, "downloads": -1, "filename": "djproxy-0.1.0.tar.gz", "has_sig": false, "md5_digest": "ccd149ce6d0466137cf80353e785b302", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5185, "upload_time": "2013-07-26T00:12:02", "url": "https://files.pythonhosted.org/packages/97/6b/e119d86d7142033b281cfb571dd46c9ec9f2cec3cc219413eb95bf7d483c/djproxy-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "28bcf8941e9cac563a73feec7394c621", "sha256": "6155bfac283a06ee12298e45bc3c972ef3b1289b6b8fa745eb02c07d4b2da438" }, "downloads": -1, "filename": "djproxy-0.2.0.tar.gz", "has_sig": false, "md5_digest": "28bcf8941e9cac563a73feec7394c621", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5166, "upload_time": "2013-12-19T23:51:49", "url": "https://files.pythonhosted.org/packages/76/6a/9cf8b75df62209d7ee7d226e096467cb56108a6357bc04be3d2c953c7059/djproxy-0.2.0.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "0225060c3daa64de7fc8662c63ee16c0", "sha256": "33bcde7889eca7483a8ddb1a1c1ce7ce8a0b479d5d585c1f360db146f35109be" }, "downloads": -1, "filename": "djproxy-1.0.0.tar.gz", "has_sig": false, "md5_digest": "0225060c3daa64de7fc8662c63ee16c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5075, "upload_time": "2014-01-28T04:09:52", "url": "https://files.pythonhosted.org/packages/74/8c/0ae110a1d0a24bffdb2649a880d758fc849dd86c6b94ea15724d49d5d9c7/djproxy-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "c5670a528613d331e57ddd2ae27f9fb3", "sha256": "21c777a91d1447e2d88a8452a3aa02e126440b34eab11720359d5162fbd9c127" }, "downloads": -1, "filename": "djproxy-1.1.0.tar.gz", "has_sig": false, "md5_digest": "c5670a528613d331e57ddd2ae27f9fb3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6594, "upload_time": "2014-02-25T22:34:41", "url": "https://files.pythonhosted.org/packages/c1/2c/ca5cbe0efa0d343f12ad5abc3b112dea6fef95206e15715df0f769d6c27e/djproxy-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "2e1c369b12d8507d88a6f78cb3cac064", "sha256": "6d16bca04d20dc23de59e48b091e4151c30f70d9a693c75b2d978e9fb42e2f0d" }, "downloads": -1, "filename": "djproxy-1.2.0.tar.gz", "has_sig": false, "md5_digest": "2e1c369b12d8507d88a6f78cb3cac064", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6608, "upload_time": "2014-04-22T14:48:27", "url": "https://files.pythonhosted.org/packages/0a/41/a72d6c6b8e5468af6286944855b5e5dd85ca5ef737eb09baa743b6a1ef28/djproxy-1.2.0.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "76a7dd624dbb2e5a8e273769931a5032", "sha256": "bd3d6003423073d50b6d576d4a8d2e73571f2f3a58f5876a51c3abddcf3d97a4" }, "downloads": -1, "filename": "djproxy-1.3.0.tar.gz", "has_sig": false, "md5_digest": "76a7dd624dbb2e5a8e273769931a5032", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6849, "upload_time": "2014-04-28T17:51:15", "url": "https://files.pythonhosted.org/packages/38/10/fa55b48be72599b0d0242632fe67d92a8e09aeabff76febcae0e2879cbd4/djproxy-1.3.0.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "dd7895f3ae97843bdd6f3e738890c9d8", "sha256": "5e0990cdaf286cfb3d5ff5e61afddc283b1ef558ca430717bc01886a9bf6973b" }, "downloads": -1, "filename": "djproxy-1.4.0.tar.gz", "has_sig": false, "md5_digest": "dd7895f3ae97843bdd6f3e738890c9d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7017, "upload_time": "2014-09-25T00:47:06", "url": "https://files.pythonhosted.org/packages/95/c2/56d948a13a808c367dcd30dfb4e9aa96407cafe2640fe28668cb687327c8/djproxy-1.4.0.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "7ba7cabbb560e640ba8394045b798b65", "sha256": "0d2cfd0fe40f1643afe62aaae62944ca6ee0322a0ffef39bb47742e4bee48ed7" }, "downloads": -1, "filename": "djproxy-2.0.0.tar.gz", "has_sig": false, "md5_digest": "7ba7cabbb560e640ba8394045b798b65", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9649, "upload_time": "2015-02-03T01:07:59", "url": "https://files.pythonhosted.org/packages/38/f1/37339643eaa50dc3ac1753f3461d6bb80d8b7257c21ec373937871063171/djproxy-2.0.0.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "7fbdf5b6a8e54b9a9b3a5520c7fb04f3", "sha256": "8bbe2de44b78f563e53a3bf965f2c3030745a4b12024c7b7d17e32580d0f4405" }, "downloads": -1, "filename": "djproxy-2.1.0.tar.gz", "has_sig": false, "md5_digest": "7fbdf5b6a8e54b9a9b3a5520c7fb04f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14588, "upload_time": "2015-03-06T23:32:45", "url": "https://files.pythonhosted.org/packages/42/e6/7afc36bc0dbf13032ea654f4e35a3d0f3048919f4308437f41ddfd96afdd/djproxy-2.1.0.tar.gz" } ], "2.2.0": [ { "comment_text": "", "digests": { "md5": "6d1d0199566f8d211a227a16a012a006", "sha256": "375014739dc52f6edbad55602b8614d0b0c3861cede25921bd9ff2b54ecd68fc" }, "downloads": -1, "filename": "djproxy-2.2.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "6d1d0199566f8d211a227a16a012a006", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14977, "upload_time": "2016-03-11T19:22:43", "url": "https://files.pythonhosted.org/packages/28/bd/6a15b0258b7431fbc3dc43423b1da0d175c42609211bb4cdc36672e8bab3/djproxy-2.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "828307a902b6ae5c5f586f97ce864f9e", "sha256": "c022628301a841fe6c13f352e4fb9438b5f48f5f0e8820b2e9d54cd9d925c1c9" }, "downloads": -1, "filename": "djproxy-2.2.0.tar.gz", "has_sig": false, "md5_digest": "828307a902b6ae5c5f586f97ce864f9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15214, "upload_time": "2016-03-11T19:08:20", "url": "https://files.pythonhosted.org/packages/96/d3/335c20ec3b57c3ca87dbc31d61ef6dace3c968779f356551d72237bb556e/djproxy-2.2.0.tar.gz" } ], "2.3.0": [ { "comment_text": "", "digests": { "md5": "7b1d3b468a15966dd3c2e0abf0f169ff", "sha256": "9daa133b055c26db2e4f9cad70a436e74eff982f2511685c1d61b78322334dfc" }, "downloads": -1, "filename": "djproxy-2.3.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "7b1d3b468a15966dd3c2e0abf0f169ff", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16455, "upload_time": "2016-04-04T22:01:22", "url": "https://files.pythonhosted.org/packages/95/47/110d304f2e226caa69f79d63a43ded03c48d0ddeb30e186f5183fb95dea4/djproxy-2.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "656972eff61a3a052222798f1de6e55f", "sha256": "16227655589dde976f9e78b87fecf24b972b1fee2bf577b061820d35c48d8b5f" }, "downloads": -1, "filename": "djproxy-2.3.0.tar.gz", "has_sig": true, "md5_digest": "656972eff61a3a052222798f1de6e55f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16629, "upload_time": "2016-04-04T22:01:32", "url": "https://files.pythonhosted.org/packages/8f/ee/96bae640c4ba5be343c388e4e9f496ccc3a09390183fc648f75b25446ffb/djproxy-2.3.0.tar.gz" } ], "2.3.1": [ { "comment_text": "", "digests": { "md5": "a5be7c9040454eebdf1ff4cbe6a4e877", "sha256": "a16d07b7b660afc23286dab9e4cf72866dc21ac129a9fc3422d444306f790d38" }, "downloads": -1, "filename": "djproxy-2.3.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "a5be7c9040454eebdf1ff4cbe6a4e877", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16421, "upload_time": "2016-04-04T22:51:59", "url": "https://files.pythonhosted.org/packages/bb/ef/c5531483e393498140840fe4aaf713d58e530d193ee4aca29beccc5340f1/djproxy-2.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a0c4f9848d7599277ede0de5e8f2d73a", "sha256": "b06e42aa9d6d99b18f25e0670049c8dac773a07ff9fa2a6ce2a73e8d039a2de8" }, "downloads": -1, "filename": "djproxy-2.3.1.tar.gz", "has_sig": true, "md5_digest": "a0c4f9848d7599277ede0de5e8f2d73a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16658, "upload_time": "2016-04-04T22:52:16", "url": "https://files.pythonhosted.org/packages/df/79/c513595feb6e594c8d834d5241d6740b94edf91a7a48f5d90bfb846f416d/djproxy-2.3.1.tar.gz" } ], "2.3.2": [ { "comment_text": "", "digests": { "md5": "295a44800f485d5ef2a6b424d59ff8eb", "sha256": "7177272dbf85c44ca093abe92943fc4ac3a87a0f173c22c263a58aecacea8fe9" }, "downloads": -1, "filename": "djproxy-2.3.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "295a44800f485d5ef2a6b424d59ff8eb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16599, "upload_time": "2016-08-05T00:29:23", "url": "https://files.pythonhosted.org/packages/c4/02/fe6ac23e5e7e98150eb8c7c3c75dc78247f53e5aaee0a1d44aa83b3417e1/djproxy-2.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f17673b7610271b59f40b5b4b6420103", "sha256": "c6ae2434ffc15b233b7e98aa51d8da5c074f4a4eb8112745e70c5b276cbba32b" }, "downloads": -1, "filename": "djproxy-2.3.2.tar.gz", "has_sig": true, "md5_digest": "f17673b7610271b59f40b5b4b6420103", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16957, "upload_time": "2016-08-05T00:29:26", "url": "https://files.pythonhosted.org/packages/b7/99/c0536f4661bca397cf8f5d7ccb11e4783fd49a2035b02dcf0a9097819eeb/djproxy-2.3.2.tar.gz" } ], "2.3.3": [ { "comment_text": "", "digests": { "md5": "414000be659b141cd163ad43f5b179bd", "sha256": "1554dbf7d95361d077771a835426d67200179ee97db188ee957a07618dac994d" }, "downloads": -1, "filename": "djproxy-2.3.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "414000be659b141cd163ad43f5b179bd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16571, "upload_time": "2016-12-26T22:49:26", "url": "https://files.pythonhosted.org/packages/5f/38/2a1256c961bf0126d0a49ca9826983522b99e0d4deedb6521ed2b0001715/djproxy-2.3.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3bf2aff4daec7de5e80301a44ea8f1e3", "sha256": "3e360239942f76005108d4b61ba75baa4b651626cba89b49ff2d376f971e3ecc" }, "downloads": -1, "filename": "djproxy-2.3.3.tar.gz", "has_sig": true, "md5_digest": "3bf2aff4daec7de5e80301a44ea8f1e3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16905, "upload_time": "2016-12-26T22:49:28", "url": "https://files.pythonhosted.org/packages/dc/d0/4b2779607f1e92f6a82d36d6c367aeef18cd789e8e7fd6ea87410c64d1c9/djproxy-2.3.3.tar.gz" } ], "2.3.4": [ { "comment_text": "", "digests": { "md5": "63474a29b6cabcda1e1dc4171442692d", "sha256": "d3a3fcd65d6f3e5098696e9ac52788bffe46594cf793ad7ba47dc362d5bb4b9b" }, "downloads": -1, "filename": "djproxy-2.3.4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "63474a29b6cabcda1e1dc4171442692d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16126, "upload_time": "2016-12-26T23:30:41", "url": "https://files.pythonhosted.org/packages/2c/5d/55b9cf18c646b64b35915f792c71cc0e2e226066a34406a7802cc243c37d/djproxy-2.3.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a4c16c7677b7bfd82699e6a632385394", "sha256": "129e8fa027fd52dbf7cb77e09e134a7f25c84eae220cea7faee14ea28ef2c441" }, "downloads": -1, "filename": "djproxy-2.3.4.tar.gz", "has_sig": true, "md5_digest": "a4c16c7677b7bfd82699e6a632385394", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17047, "upload_time": "2016-12-26T23:30:43", "url": "https://files.pythonhosted.org/packages/74/30/cb2670179e01ea45d694c245f31ef0bf12bc29cec3bca4f9fb4f68736aef/djproxy-2.3.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "63474a29b6cabcda1e1dc4171442692d", "sha256": "d3a3fcd65d6f3e5098696e9ac52788bffe46594cf793ad7ba47dc362d5bb4b9b" }, "downloads": -1, "filename": "djproxy-2.3.4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "63474a29b6cabcda1e1dc4171442692d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16126, "upload_time": "2016-12-26T23:30:41", "url": "https://files.pythonhosted.org/packages/2c/5d/55b9cf18c646b64b35915f792c71cc0e2e226066a34406a7802cc243c37d/djproxy-2.3.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a4c16c7677b7bfd82699e6a632385394", "sha256": "129e8fa027fd52dbf7cb77e09e134a7f25c84eae220cea7faee14ea28ef2c441" }, "downloads": -1, "filename": "djproxy-2.3.4.tar.gz", "has_sig": true, "md5_digest": "a4c16c7677b7bfd82699e6a632385394", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17047, "upload_time": "2016-12-26T23:30:43", "url": "https://files.pythonhosted.org/packages/74/30/cb2670179e01ea45d694c245f31ef0bf12bc29cec3bca4f9fb4f68736aef/djproxy-2.3.4.tar.gz" } ] }