{ "info": { "author": "Luciano Ratamero", "author_email": "luciano@ratamero.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Framework :: Django :: 1.8", "Framework :: Django :: 2.0", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Programming Language :: Python :: 3.6" ], "description": "django_apistar\n==============\n\n.. image:: https://travis-ci.org/lucianoratamero/django_apistar.svg?branch=master\n :target: https://travis-ci.org/lucianoratamero/django_apistar\n\nThis project is a `Django`_ App that switches between Django and `API\nStar`_\\ \u2019s routes and views. That way, we have API Star as the API\nfrontend, while leaving Django's toolset available for devs to\nwork with.\n\nBoth API Star\u2019s docs and Django Admin work as intended.\nYou can see a Django + API Star implementation example at the django_apistar_example_ or test it on heroku_.\n\n.. _django_apistar_example: https://github.com/lucianoratamero/django_apistar_example\n.. _heroku: https://django-apistar-example.herokuapp.com/docs/\n\nSuppports:\n\n- django>=1.8\n- apistar>=0.5.40\n- python==3.6\n\nInstallation\n~~~~~~~~~~~~\n.. code:: shell\n\n pip install django_apistar\n\n\nAfter installing, we need to add ``django_apistar`` to your ``INSTALLED_APPS`` in your project\u2019s ``settings.py``:\n\n.. code:: python\n\n INSTALLED_APPS = (\n ...\n 'django_apistar',\n 'your_api_star_app',\n ...\n )\n\n\nThen, we need to set up three settings: a base API Star route module (``APISTAR_ROUTE_CONF``), API Star\u2019s own settings and to change the default WSGI application:\n\n\n.. code:: python\n\n APISTAR_SETTINGS = {\n 'ALLOWED_DJANGO_ROUTES': ('/admin/', '/static/'),\n }\n\n APISTAR_ROUTE_CONF = 'your_api_star_app.routes'\n\n # remember that the following setting already exists in a default django settings file!\n WSGI_APPLICATION = 'django_apistar.wsgi.application'\n\n\nThe ``ALLOWED_DJANGO_ROUTES`` key describes which routes you want API Star to ignore. Only ``'/static/'`` is required, since we want Django to keep managing static files for us.\n\nNow, if you want to run the dev server, run ``python manage.py runserver`` and hack away!\n\n\nAuthentication\n~~~~~~~~~~~~~~\n\nWe support Basic and Token/Bearer authentication.\n\nTo use them, configure your ``APISTAR_SETTINGS`` as you would configure your API Star app:\n\n.. code:: python\n\n from django_apistar.authentication.components import DjangoBasicAuthentication, DjangoTokenAuthentication\n\n ...\n\n APISTAR_SETTINGS['COMPONENTS'] = [DjangoBasicAuthentication(), DjangoTokenAuthentication()],\n\nIf you want to use authentication by token, you need to add the ``django_apistar.authentication`` to your ``INSTALLED_APPS``, then migrate your database.\n\n.. code:: python\n\n INSTALLED_APPS = (\n ...\n 'django_apistar',\n 'django_apistar.authentication',\n 'your_api_star_app',\n ...\n )\n\nToken authentication views\n''''''''''''''''''''''''''\n\nWe provide two helper views for token authentication. To set them up, add the routes into your root ``routes.py`` file:\n\n.. code:: python\n\n from django_apistar.authentication import routes\n\n routes = [\n ...,\n Include('/auth', routes),\n ]\n\nThe views will be added to your ``/docs/``, as usual.\n\nHow it works\n~~~~~~~~~~~~\n\nThis Django app contains a custom WSGI application that smartly changes between API Star's and Django's response handlers. By default, all requests will be responded by API Star, unless the ``ALLOWED_DJANGO_ROUTES`` settings key contains that route.\n\nThis way, we are able to bypass Django completely when responding API requests, while keeping Django ready to respond to more complicated requests, like Django Admin and complex template/form views.\n\nAnother big advantage is that this app enables both Django Admin **and** API Star automatic API docs.\n\nImplementing views\n''''''''''''''''''\n\nThere is no need to think about corner cases when writing views. We only need to keep in mind that we won\u2019t be able to use the ``django_orm`` backend baked into API Star, so we must access models directly to deal with CRUD operations.\n\nFor example, let\u2019s create a view that persists a ``Product``:\n\n.. code:: python\n\n from core import schemas\n from core import models\n\n def create_product(product: schemas.Product) -> schemas.Product:\n db_product = models.Product(**product)\n db_product.save()\n return http.JSONResponse(schemas.Product(db_product.__dict__), status_code=201)\n\nAs intended, all the data validation is at the schemas, and everything is handled gracefully by API Star.\n\nImplementing tests\n''''''''''''''''''\n\nTo test your API Star views, we provide a hybrid ``TestClient`` that is API Star aware and a custom TestCase, leveraging Django's own ``TestCase`` by including the ``reverse_url`` method from API Star's router:\n\n.. code:: python\n\n from django_apistar.test import TestCase # our custom TestCase\n from model_mommy import mommy\n\n from core import models, schemas\n\n\n class TestListProducts(TestCase):\n\n def test_list_products(self):\n '''\n The reverse_url method behaves exactly like Django's reverse,\n but uses the view's defined name as namespace.\n The builtin client is based on the API Star Test Client,\n so it's preferred to use this test case only to test API Star's views.\n '''\n\n url = self.reverse_url('list_products')\n db_product = mommy.make(models.Product, rating=5, size='large')\n\n response = self.client.get(url)\n content = response.json()\n\n expected_product = schemas.Product(db_product.__dict__)\n self.assertEqual(1, len(content))\n self.assertEqual(expected_product, content[0])\n\nPerformance\n~~~~~~~~~~~\n\nSince we capture the request at the WSGI level, you should expect no drops in performance whatsoever.\n\nI've made a few (and completely arbitrary) benchmarks. I've used Siege and set up two views, one Django view, one API Star view, both only responding a json response with ``{\"message\": \"Hello, World!\"}``. These were all run in my computer, so don't expect true results - this is only for you to have an idea.\n\n+---------------------+-----------+-----------+-----------+-----------+----------------+\n| | apistar | django2 | django2-no middlewares| django_apistar |\n+=====================+===========+===========+=======================+================+\n| transactions | 13688 | 6840 | 10507 | 13899 |\n+---------------------+-----------+-----------+-----------------------+----------------+\n| transactions/sec | 1482.99 | 716.23 | 1085.43 |1440.31 |\n+---------------------+-----------+-----------+-----------------------+----------------+\n| longest transaction | 0.08 sec | 3.06 | 3.24 | 0.08 |\n+---------------------+-----------+-----------+-----------------------+----------------+\n\nContributing\n~~~~~~~~~~~~\n\nThere are still a lot of ways we can improve and add more features to this app. If you find any bugs or have significant suggestions, just open an issue or contact me at luciano@ratamero.com. Pull requests will be received with all care and attention as well :)\n\n.. _Django: https://www.djangoproject.com/\n.. _API Star: https://github.com/encode/apistar\n\n\nChangelog\n~~~~~~~~~~~~\n\n0.5.40__0\n'''''''''\n- updates API Star version and code references;\n- refactor classes into components;\n- adds sample event hook for authentication.\n\n0.3.9__0\n''''''''\n- starts using matching versions with API Star to simplify things (0.3.9__x will always work and depend on apistar==0.3.9);\n- locks maximum API Star version to 0.3.9.\n\n0.3.2\n'''''\n- adds authentication app;\n- adds views, models, schemas and authenticators for token authentication.\n\n0.3.1\n'''''\n- fixes default ``DJANGO_SETTINGS_MODULE``;\n- sets up Django before starting the WSGI application, enabling use with Heroku.\n\n0.3.0\n'''''\n- removes the middleware implementation in favor of a custom WSGI app;\n- removes templates folder and ``apps.py``, since they won't be necessary anymore;\n- adds custom TestClient and TestCase to the ``tests`` module;\n- improves performance by ~100% by bypassing Django when answering API Star's requests.\n\n0.2.3\n'''''\n- coupled API Star to Django via middlewares;\n- hijacks Django's WSGI process to respond using API Star's views.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/lucianoratamero/django_apistar", "keywords": "apistar api rest django", "license": "", "maintainer": "", "maintainer_email": "", "name": "django-apistar", "package_url": "https://pypi.org/project/django-apistar/", "platform": "", "project_url": "https://pypi.org/project/django-apistar/", "project_urls": { "Homepage": "https://github.com/lucianoratamero/django_apistar" }, "release_url": "https://pypi.org/project/django-apistar/0.5.40-0/", "requires_dist": [ "apistar (>=0.4.0)", "django (>=1.8)" ], "requires_python": ">=3.6,<3.7", "summary": "Django app for using API Star as frontend.", "version": "0.5.40-0" }, "last_serial": 4114672, "releases": { "0.2.0": [ { "comment_text": "", "digests": { "md5": "765ddba02fb3e38023358d5666111932", "sha256": "c5866beabcc690a0f0e4b4ba09ca62d623be2e4489088f80478daf28badb2bcb" }, "downloads": -1, "filename": "django_apistar-0.2.0-py3.6.egg", "has_sig": false, "md5_digest": "765ddba02fb3e38023358d5666111932", "packagetype": "bdist_egg", "python_version": "3.6", "requires_python": ">=3.6", "size": 9378, "upload_time": "2018-03-21T06:22:38", "url": "https://files.pythonhosted.org/packages/30/11/d4f0ddcb7a8cd99b6629460339fb027a436a1b5b9b0810513ac4c3e2eeb7/django_apistar-0.2.0-py3.6.egg" }, { "comment_text": "", "digests": { "md5": "d03632aeb337123571f625bf71c84507", "sha256": "35353973ac3d0b712d1d1a61ac74ce3699a93a91ee46fe67da44d7a9c8b1b190" }, "downloads": -1, "filename": "django_apistar-0.2.0.tar.gz", "has_sig": false, "md5_digest": "d03632aeb337123571f625bf71c84507", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 558448, "upload_time": "2018-03-21T06:22:41", "url": "https://files.pythonhosted.org/packages/66/24/94b923f669b4462c75cf204d598e098da831752f005aa0a857c77b271630/django_apistar-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "a32c9af69ad475ee1e4dfeaedb0b8f1b", "sha256": "92266e5fdbb4e9ad1c31c68ef1bf8b7f703a98c2113accda620bde26445706e8" }, "downloads": -1, "filename": "django_apistar-0.2.1.tar.gz", "has_sig": false, "md5_digest": "a32c9af69ad475ee1e4dfeaedb0b8f1b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 558459, "upload_time": "2018-03-21T06:37:40", "url": "https://files.pythonhosted.org/packages/a0/8b/05d427031aee6536579effbb2767112787f199c33f35f9732e2e06f43bc5/django_apistar-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "c2ecbcd6ca7846299c982ba0462bfca2", "sha256": "bc91bf52abcb4835189b554827b4a999bcb50d8220015adff6f246371940ffa0" }, "downloads": -1, "filename": "django_apistar-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "c2ecbcd6ca7846299c982ba0462bfca2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 9376, "upload_time": "2018-03-21T06:47:21", "url": "https://files.pythonhosted.org/packages/1e/fd/23bd53fa40ce895f7963b556a3e1906dd6f63d52f2f94aafdeefe5648eb0/django_apistar-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1504ee298c37a8a205541cc3f63fb4ce", "sha256": "7315179de55eef840bf571970fb8f390f9e1040faa7dace3d40c63400084133d" }, "downloads": -1, "filename": "django_apistar-0.2.2.tar.gz", "has_sig": false, "md5_digest": "1504ee298c37a8a205541cc3f63fb4ce", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 6039, "upload_time": "2018-03-21T06:47:23", "url": "https://files.pythonhosted.org/packages/46/c9/7d1175e3d963d395a02174fd9a8d338d54ae3f5468f4f25b8b11b666c25c/django_apistar-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "e29812f579e44ae1e9f877254cae2ebf", "sha256": "e9818f7a6c9ab7d787034b67e855fe4e5da7980cca227d64ca97243f80727ed1" }, "downloads": -1, "filename": "django_apistar-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e29812f579e44ae1e9f877254cae2ebf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 567361, "upload_time": "2018-03-21T06:57:37", "url": "https://files.pythonhosted.org/packages/41/f4/95b3f296af3104ca713e2c834df720b31c912194f4d37ac3ac60daeace29/django_apistar-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f93f30962f4083fdf583fd2336dab2e2", "sha256": "d3e1ec37d56072a5dde2ad6cc9e59b1c7cf0c9b52afd20a6b4c55c73993bb8b4" }, "downloads": -1, "filename": "django_apistar-0.2.3.tar.gz", "has_sig": false, "md5_digest": "f93f30962f4083fdf583fd2336dab2e2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 558476, "upload_time": "2018-03-21T06:57:41", "url": "https://files.pythonhosted.org/packages/2b/e2/dadcbf1f9925fa62601e2c6cf14ad532ea672b8f31ad74dbabc6d7ad9ff1/django_apistar-0.2.3.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "eae7433856300314b50dc4637010cace", "sha256": "7addc651c94392ad52fc03e48b2dffccffe385fe1caceca53d00cc0eec91146f" }, "downloads": -1, "filename": "django_apistar-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "eae7433856300314b50dc4637010cace", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 559260, "upload_time": "2018-03-24T05:05:18", "url": "https://files.pythonhosted.org/packages/89/ba/364284667c3c034a0c622142b64824fae1918bf87fe1d20b19ad5e2e8ed6/django_apistar-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "85620b9f5938f05dded19af412bf2add", "sha256": "8eb2830f014b5cbd09472205fc0d5e28562de8b6469c2a449ffb35bc1205ffea" }, "downloads": -1, "filename": "django_apistar-0.3.0.tar.gz", "has_sig": false, "md5_digest": "85620b9f5938f05dded19af412bf2add", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 554557, "upload_time": "2018-03-24T05:05:21", "url": "https://files.pythonhosted.org/packages/af/d3/7f8de9fba2b2ecba904c7d9fe227f433b14fda96b190b03b63402b8b5bf5/django_apistar-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "6f2b895baea70aceccb41d35f5331920", "sha256": "3c9b4aedf02dc07019787d304dcdc1b682bb14d25274d8646696b0f39bc145fe" }, "downloads": -1, "filename": "django_apistar-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6f2b895baea70aceccb41d35f5331920", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 559328, "upload_time": "2018-03-25T23:02:48", "url": "https://files.pythonhosted.org/packages/16/aa/2f29a6fe0da46df63202b2a657b7de3ef7af77c22a1a631b7a5b1254e513/django_apistar-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dd6ceb4fe9c522ff3c390f2337286055", "sha256": "0810b7261e95854526e10027b4d76198579d5dae011d6cd716ee9cf42b496f84" }, "downloads": -1, "filename": "django_apistar-0.3.1.tar.gz", "has_sig": false, "md5_digest": "dd6ceb4fe9c522ff3c390f2337286055", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 554600, "upload_time": "2018-03-25T23:02:50", "url": "https://files.pythonhosted.org/packages/a8/8b/5581a20184199522c5625d7284caf6bcd09e4efe30a0109734ac8e2a96c6/django_apistar-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "351117525c79baeefe093d6bd5c3eb06", "sha256": "de1c02ab5d741e89927b4cf326a7b16c78b2c7f47c416ffad12abf38f3aa9afe" }, "downloads": -1, "filename": "django_apistar-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "351117525c79baeefe093d6bd5c3eb06", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 564645, "upload_time": "2018-03-28T03:20:19", "url": "https://files.pythonhosted.org/packages/ee/da/130bf7a2595ca6346fa6e722138ec0262e65555327eb130c1da6df04cfdc/django_apistar-0.3.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1d4c694e43993c562afaf450396a1816", "sha256": "fe15d93c822e0b7c618fbec7647d187e92a7595376846e5bef49adc0b749f0b1" }, "downloads": -1, "filename": "django_apistar-0.3.2.tar.gz", "has_sig": false, "md5_digest": "1d4c694e43993c562afaf450396a1816", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 558118, "upload_time": "2018-03-28T03:20:21", "url": "https://files.pythonhosted.org/packages/1b/af/b8c967462ea416b6a0270d54d44d35458dbdeb2a9e01b731b12585408cbb/django_apistar-0.3.2.tar.gz" } ], "0.3.9-0": [ { "comment_text": "", "digests": { "md5": "aecc8c7761bc2cd71b2f06825f556e29", "sha256": "b13264c8dc411db3f1416e861af6ef851f89ba1319748eee3ffd663b0f25d0a0" }, "downloads": -1, "filename": "django_apistar-0.3.9-0.tar.gz", "has_sig": false, "md5_digest": "aecc8c7761bc2cd71b2f06825f556e29", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 559305, "upload_time": "2018-04-19T00:26:18", "url": "https://files.pythonhosted.org/packages/75/7a/1d2a47e24095d9a6409cceb6160fe6e1f30967731b27f80d6eb985d829a4/django_apistar-0.3.9-0.tar.gz" }, { "comment_text": "", "digests": { "md5": "ee4d837a8a0bd76b6578a62e66477658", "sha256": "dd2ac4b5b14d90ea4f3192b98f5625aae33a2a1a16480e3fb1de68d0c09e1c67" }, "downloads": -1, "filename": "django_apistar-0.3.9.post0-py3-none-any.whl", "has_sig": false, "md5_digest": "ee4d837a8a0bd76b6578a62e66477658", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 566445, "upload_time": "2018-04-19T00:26:16", "url": "https://files.pythonhosted.org/packages/f1/06/7a846ef4c47086727174378228fe62b33e567a6e492c1e52976ee684bcad/django_apistar-0.3.9.post0-py3-none-any.whl" } ], "0.5.40-0": [ { "comment_text": "", "digests": { "md5": "76d9530b0f592ecfec0fee38cee6b25d", "sha256": "67a2d74a9f38d6b5af070f5a163ff503e766615b0c31b6e1b7155761739b3511" }, "downloads": -1, "filename": "django_apistar-0.5.40-0.tar.gz", "has_sig": false, "md5_digest": "76d9530b0f592ecfec0fee38cee6b25d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<3.7", "size": 573123, "upload_time": "2018-07-29T23:55:05", "url": "https://files.pythonhosted.org/packages/11/a4/4e8e505d691a060f62c0709738a20ec4473902316fc117ff48b9310d6ca7/django_apistar-0.5.40-0.tar.gz" }, { "comment_text": "", "digests": { "md5": "950158b05132c97d317ae41bafc34613", "sha256": "8e063158ccbc2a7ef70e0052bdd3e4a842586cfce6dc0de45ec35611736e36b8" }, "downloads": -1, "filename": "django_apistar-0.5.40.post0-py3-none-any.whl", "has_sig": false, "md5_digest": "950158b05132c97d317ae41bafc34613", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<3.7", "size": 580888, "upload_time": "2018-07-29T23:55:01", "url": "https://files.pythonhosted.org/packages/f8/c1/3a6d81f17a5c5ac7a04a090c6b1faea6b86f9cc356f54bf08730aaca09c6/django_apistar-0.5.40.post0-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "76d9530b0f592ecfec0fee38cee6b25d", "sha256": "67a2d74a9f38d6b5af070f5a163ff503e766615b0c31b6e1b7155761739b3511" }, "downloads": -1, "filename": "django_apistar-0.5.40-0.tar.gz", "has_sig": false, "md5_digest": "76d9530b0f592ecfec0fee38cee6b25d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<3.7", "size": 573123, "upload_time": "2018-07-29T23:55:05", "url": "https://files.pythonhosted.org/packages/11/a4/4e8e505d691a060f62c0709738a20ec4473902316fc117ff48b9310d6ca7/django_apistar-0.5.40-0.tar.gz" }, { "comment_text": "", "digests": { "md5": "950158b05132c97d317ae41bafc34613", "sha256": "8e063158ccbc2a7ef70e0052bdd3e4a842586cfce6dc0de45ec35611736e36b8" }, "downloads": -1, "filename": "django_apistar-0.5.40.post0-py3-none-any.whl", "has_sig": false, "md5_digest": "950158b05132c97d317ae41bafc34613", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<3.7", "size": 580888, "upload_time": "2018-07-29T23:55:01", "url": "https://files.pythonhosted.org/packages/f8/c1/3a6d81f17a5c5ac7a04a090c6b1faea6b86f9cc356f54bf08730aaca09c6/django_apistar-0.5.40.post0-py3-none-any.whl" } ] }