{ "info": { "author": "Sander Ferdinand, Daniel Ternyak", "author_email": "sa.ferdinand@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities" ], "description": "# Flask-YoloAPI\n\n![whoop](https://i.imgur.com/xVS3UGq.png)\n\nA simple library for simple JSON endpoints. YOLO!\n\nExample\n-------\n\n#### GET\n\n```python\nfrom flask_yoloapi import endpoint, parameter\n\n@app.route('/api/hello')\n@endpoint.api(\n parameter('name', type=str, required=True)\n)\ndef api_hello(name):\n return \"Hello %s!\" % name\n```\n\n`http://localhost:5000/api/hello?name=Sander`\n\n```javascript\n{\n data: \"Hello Sander!\"\n}\n```\n\n#### POST\n\n```python\nfrom flask_yoloapi import endpoint, parameter\n\n@app.route('/api/hello', methods=['POST'])\n@endpoint.api(\n parameter('name', type=str, required=True),\n parameter('age', type=int, default=18)\n)\ndef api_hello(name, age):\n return \"Hello %s, your age is %d\" % (name, age)\n```\n\n`curl -H \"Content-Type: application/json\" -vvXPOST -d '{\"name\":\"Sander\"}' http://localhost:5000/api/hello`\n\n```javascript\n{\n data: \"Hello Sander, your age is 18\"\n}\n```\n\n\nUse cases\n-------------\n\n- No boilerplate code that involves classes to make API routes.\n- You don't want to fish incoming parameters out of `request.args` / `request.form` / `request.json` :sleeping:\n- You don't need to hook your endpoints directly to SQLa models.\n- You don't care about providing REST compliancy - you just want somewhat consistent JSON endpoints, damnit!\n\n\nInstallation\n------------\n```sh\npip install flask-yoloapi\n```\n\n\n## Return values\nIn the example above, a string was returned. The following types are also supported:\n\n- `str`, `unicode`, `int`, `float`, `dict`, `list`, `datetime`, `bool`, `flask.Response`.\n\n```python\n@app.route('/wishlist')\n@endpoint.api(\n parameter('category', type=str, required=False)\n)\ndef wishlist(category):\n if category == \"cars\":\n return ['volvo xc60', 'mclaren mp4-12c']\n```\n\n```javascript\n{\n \"data\": [\n \"volvo xc60\", \n \"mclaren mp4-12c\"\n ]\n}\n``` \n\n## HTTP status codes\n\nTo return different status codes, return a 2-length `tuple` with the second index being the status code itself.\n\n```python\n@app.route('/create_foo')\n@endpoint.api()\ndef create_foo():\n return 'created', 201\n```\n\n## Route parameters\n\nYou can still use Flask's route parameters in conjunction with endpoint parameters.\n\n```python\n@app.route('/hello/')\n@endpoint.api(\n parameter('age', type=int, required=True)\n)\ndef hello(name, age):\n return {'name': name, 'age': age}\n```\n\n`/hello/sander?age=27`\n\n```javascript\n{\n \"data\": {\n \"age\": 27, \n \"name\": \"sander\"\n }\n}\n```\n\n## Default values\n\nYou can define default values for endpoint parameters via `default`.\n\n```python\n@app.route('/hello/')\n@endpoint.api(\n parameter('age', type=int, required=False, default=10)\n)\ndef hello(name, age):\n return {'name': name, 'age': age}\n```\n`/hello/sander`\n```javascript\n{\n \"data\": {\n \"age\": 10, \n \"name\": \"sander\"\n }\n}\n```\n\n## Type annotations\n\nParameter types are required, except when type annotations are in use.\n\nA Python 3.5 example:\n\n```python\n@app.route('/hello/', methods=['POST'])\n@endpoint.api(\n parameter('age', required=True),\n parameter('name', required=True)\n)\ndef hello(name: str, age: int):\n return {'name': name, 'age': age}\n```\n\nPython 2 equivalent:\n\n```python\n@app.route('/hello/', methods=['POST'])\n@endpoint.api(\n parameter('age', type=int, required=True),\n parameter('name', type=str, required=True)\n)\ndef hello(name, age):\n return {'name': name, 'age': age}\n```\n\nNote that type annotations are only supported from Python 3.5 and upwards (PEP 484).\n\n## Custom validators\n\nAdditional parameter validation can be done by providing a validator function. This function takes 1 parameter; the input. \n\n\n```python\ndef custom_validator(value):\n if value > 120:\n raise Exception(\"you can't possibly be that old!\")\n\n@app.route('/hello/')\n@endpoint.api(\n parameter('age', type=int, required=True, validator=custom_validator)\n)\ndef hello(name, age):\n return {'name': name, 'age': age}\n```\n\n`/hello/sander?age=130`\n\n```javascript\n{\n \"data\": \"parameter 'age' error: you can't possibly be that old!\"\n}\n```\n\nWhen the validation proves to be unsuccessful, you may do 2 things:\n\n- Raise an `Exception`, it will automatically construct a JSON response. This is shown above.\n- Return a `Flask.Response` object, where you may construct your own HTTP response\n\nIf you need more flexibility regarding incoming types use the `flask_yoloapi.types.ANY` type.\n\n## Parameter handling\n\nThis library is rather opportunistic about gathering incoming parameters, as it will check in the following 3 places:\n\n- `request.args`\n- `request.json`\n- `request.form`\n\nAn optional `location` argument can be provided to specify the source of the parameter.\n\n```python\n@app.route('/login')\n@endpoint.api(\n parameter('username', type=str, location='form', required=True),\n parameter('password', type=str, location='form', required=True),\n)\ndef login(username, password):\n return \"Wrong password!\", 403\n```\n\nThe following 3 locations are supported:\n\n- `args` - GET parameters\n- `form` - parameters submitted via HTTP form submission\n- `json` - parameters submitted via a JSON encoded HTTP request\n\n## Datetime format\n\nTo output datetime objects in `ISO 8601` format (which are trivial to parse in Javascript via `Date.parse()`), use a custom JSON encoder.\n\n```python\nfrom datetime import date\nfrom flask.json import JSONEncoder\n\nclass ApiJsonEncoder(JSONEncoder):\n def default(self, obj):\n if isinstance(obj, (date, datetime)):\n return obj.isoformat()\n return super(ApiJsonEncoder, self).default(obj)\n\napp = Flask(__name__)\napp.json_encoder = ApiJsonEncoder\n```\n\n\n## Error handling\n\nWhen the view function itself raises an exception, a JSON response is generated that includes:\n\n- The error message\n- Docstring of the view function\n- HTTP 500\n\nThis error response is also generated when endpoint requirements are not met.\n\n```javascript\n{\n data: \"argument 'password' is required\",\n docstring: {\n help: \"Logs the user in.\",\n return: \"The logged in message!\",\n params: {\n username: {\n help: \"The username of the user\",\n required: true,\n type: \"str\"\n }\n },\n ...\n```\n\nContributors\n-----\n\n- dromer\n- iksteen\n\nTests\n-----\n\n```\n$ pytest --cov=flask_yoloapi tests\n=========================================== test session starts ============================================\nplatform linux -- Python 3.5.3, pytest-3.1.3, py-1.5.2, pluggy-0.4.0\nrootdir: /home/dsc/flask-yoloapi, inifile:\nplugins: flask-0.10.0, cov-2.5.1\ncollected 19 items \n\ntests/test_app.py ...................\n\n----------- coverage: platform linux, python 3.5.3-final-0 -----------\nName Stmts Miss Cover\n-------------------------------------------------\nflask_yoloapi/__init__.py 2 0 100%\nflask_yoloapi/endpoint.py 111 4 96%\nflask_yoloapi/exceptions.py 3 1 67%\nflask_yoloapi/types.py 5 2 60%\nflask_yoloapi/utils.py 52 5 90%\n-------------------------------------------------\nTOTAL 173 12 93%\n\n```\n\nLicense\n-------------\nMIT.", "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/skftn/flask-yoloapi", "keywords": "flask api flapi yoloapi", "license": "", "maintainer": "", "maintainer_email": "", "name": "Flask-Yolo2API", "package_url": "https://pypi.org/project/Flask-Yolo2API/", "platform": "", "project_url": "https://pypi.org/project/Flask-Yolo2API/", "project_urls": { "Homepage": "https://github.com/skftn/flask-yoloapi" }, "release_url": "https://pypi.org/project/Flask-Yolo2API/0.2.6/", "requires_dist": null, "requires_python": "", "summary": "Simply the best Flask API library", "version": "0.2.6" }, "last_serial": 4483671, "releases": { "0.2.0": [ { "comment_text": "", "digests": { "md5": "e485424a378c4f351f74d8aa4f16e668", "sha256": "db8abd37300ba5dc9664b514aaa98592322a4c006723167bcfde847d99162413" }, "downloads": -1, "filename": "Flask-Yolo2API-0.2.0.tar.gz", "has_sig": false, "md5_digest": "e485424a378c4f351f74d8aa4f16e668", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11146, "upload_time": "2018-10-21T18:58:24", "url": "https://files.pythonhosted.org/packages/fc/a5/126660d36379ae963cf22ff659c9a424fceef783164a160b9a6fe68eaaab/Flask-Yolo2API-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "a800f030e71bacbfa62b434709f819ce", "sha256": "cc2c44b7cce4dbab27f4ccb592232c3b839a56f0076b751b0c2724e7300e3925" }, "downloads": -1, "filename": "Flask-Yolo2API-0.2.1.tar.gz", "has_sig": false, "md5_digest": "a800f030e71bacbfa62b434709f819ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11142, "upload_time": "2018-10-21T19:05:36", "url": "https://files.pythonhosted.org/packages/bd/c5/c1dc5f30ee4040382dd24d600ca988ad9b7cfc5c04273da1f6f24759d5ba/Flask-Yolo2API-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "1458135f5001a01d2dfe8b70613d2894", "sha256": "79e02599587552b24049bac7609d06d99e73dfb7539e34cafdc75902de13bc8e" }, "downloads": -1, "filename": "Flask-Yolo2API-0.2.2.tar.gz", "has_sig": false, "md5_digest": "1458135f5001a01d2dfe8b70613d2894", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11150, "upload_time": "2018-11-13T01:05:23", "url": "https://files.pythonhosted.org/packages/84/02/793dd78e573ee1cba2182246f8944f2023cddbb784ffda6dd962cc6a20b3/Flask-Yolo2API-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "0f0e5bdf35a7006ebcd6749e27a3c9d3", "sha256": "07ae12ec003abce66fa8d7fd5b1f554519f5aec1fa9d7c9b40fffc36090de71d" }, "downloads": -1, "filename": "Flask-Yolo2API-0.2.3.tar.gz", "has_sig": false, "md5_digest": "0f0e5bdf35a7006ebcd6749e27a3c9d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11156, "upload_time": "2018-11-13T01:11:45", "url": "https://files.pythonhosted.org/packages/62/8f/6800ee32dc1d0096ad422862138343ee61c4797e969a7bb4b35fce8bc131/Flask-Yolo2API-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "aa145605565bea7ba4b6d9f9c8b560de", "sha256": "e4d1075f7ed8b5a4c8a0d9da65e2dcbf0514bc819ad4e0e07e612c04b7bbdf95" }, "downloads": -1, "filename": "Flask-Yolo2API-0.2.4.tar.gz", "has_sig": false, "md5_digest": "aa145605565bea7ba4b6d9f9c8b560de", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11145, "upload_time": "2018-11-13T01:14:43", "url": "https://files.pythonhosted.org/packages/7e/34/255989fc0974f40be052e118dfdecdbfb0741f094650a09a81c0633971bd/Flask-Yolo2API-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "397e9046ba9c82b8a2fec5605097648a", "sha256": "fa0b31d92f1e41126a3ad11717b4ae7f259e6723a1d72988c16fb44d2a93e4ac" }, "downloads": -1, "filename": "Flask-Yolo2API-0.2.5.tar.gz", "has_sig": false, "md5_digest": "397e9046ba9c82b8a2fec5605097648a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11157, "upload_time": "2018-11-13T23:26:04", "url": "https://files.pythonhosted.org/packages/7f/d5/7a8ee822c4ac38a7c3fa349be3b87f5650640eb3be8dbf38c6beffd13c5a/Flask-Yolo2API-0.2.5.tar.gz" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "8538a91eb2e7bbd40a1c2e8594c2c8ce", "sha256": "ddc01519613d3c88816963fdff18d07add86fe47a0603d16f9fc9e311b2ece12" }, "downloads": -1, "filename": "Flask-Yolo2API-0.2.6.tar.gz", "has_sig": false, "md5_digest": "8538a91eb2e7bbd40a1c2e8594c2c8ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11149, "upload_time": "2018-11-13T23:43:07", "url": "https://files.pythonhosted.org/packages/9c/4d/599094f7343107b0529f21c0ac026074f8090fd8bd971af82edca7d846e3/Flask-Yolo2API-0.2.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8538a91eb2e7bbd40a1c2e8594c2c8ce", "sha256": "ddc01519613d3c88816963fdff18d07add86fe47a0603d16f9fc9e311b2ece12" }, "downloads": -1, "filename": "Flask-Yolo2API-0.2.6.tar.gz", "has_sig": false, "md5_digest": "8538a91eb2e7bbd40a1c2e8594c2c8ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11149, "upload_time": "2018-11-13T23:43:07", "url": "https://files.pythonhosted.org/packages/9c/4d/599094f7343107b0529f21c0ac026074f8090fd8bd971af82edca7d846e3/Flask-Yolo2API-0.2.6.tar.gz" } ] }