{ "info": { "author": "pprolancer", "author_email": "pprolancer@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "========\nflexrest\n========\n\nA Flexible REST Api miniframework for Python.\n\nWorks great with Flask + Sqlalchemy\n\nUsing \"formencode\" library to validate data\n\nFeatures\n========\n\n* Small, fast codebase\n* JSON output by default, but overridable\n* RESTful\n* Flexible to override all rest actions\n* Flexible to add new actions\n* Flexible to add decorators on every actions\n* Python 2.6+\n\n\n\nWhy?\n====\n\nQuite simply, I care about creating flexible & RESTFul APIs. In building\nTastypie, I tried to create something extremely complete & comprehensive.\nThe result was writing a lot of hook methods (for easy extensibility) & a lot\nof (perceived) bloat, as I tried to accommodate for everything people might\nwant/need in a flexible/overridable manner.\n\nBut in reality, all I really ever personally want are the RESTful verbs, JSON\nserialization & the ability of override behavior.\n\nThis one is written for me, but maybe it's useful to you.\n\n\nManifesto\n=========\n\nRather than try to build something that automatically does the typically\ncorrect thing within each of the views, it's up to you to implement the bodies\nof various HTTP methods.\n\nFull flask example code:\n\n.. code:: python\n\n from flask import Flask, Blueprint, redirect, url_for\n from flask_login import LoginManager, current_user, login_user, logout_user, \\\n login_required\n from sqlalchemy import create_engine\n from sqlalchemy.orm import sessionmaker\n from sqlalchemy.ext.declarative import declarative_base\n from sqlalchemy import Column, Integer, String, Unicode\n\n from flexrest import RestApiResource, RestApiHandler, FlexRestManager\n\n Base = declarative_base()\n\n\n class User(Base):\n __tablename__ = 'users'\n\n id = Column(Integer, primary_key=True)\n username = Column(String(64), unique=True)\n password = Column(String(88))\n firstname = Column(Unicode(256))\n lastname = Column(Unicode(256))\n\n def get_id(self):\n return str(self.id)\n\n def is_authenticated(self):\n return True\n\n def is_anonymous(self):\n return False\n\n def is_active(self):\n return True\n\n def __repr__(self):\n return '' % (self.username)\n\n\n class Book(Base):\n __tablename__ = 'books'\n\n id = Column(Integer, primary_key=True)\n name = Column(String(64), unique=True)\n author = Column(String(88))\n\n def __repr__(self):\n return '' % (self.name)\n\n\n engine = create_engine('sqlite:///:memory:', echo=True)\n DBSession = sessionmaker(bind=engine)\n Base.metadata.create_all(engine)\n\n\n def get_session():\n return DBSession()\n\n dbs = get_session()\n u1 = User(username='user1')\n u2 = User(username='user2')\n b1 = Book(name='book1')\n b2 = Book(name='book2')\n dbs.add_all([u1, u2, b1, b2])\n dbs.commit()\n\n\n def load_user(uid):\n dbs = get_session()\n\n user = dbs.query(User).get(uid)\n if not user or not user.is_active():\n return None\n return user\n\n app = Flask(__name__)\n app.secret_key = 'secret'\n lm = LoginManager()\n lm.init_app(app)\n lm.user_loader(load_user)\n lm.session_protection = \"strong\"\n\n flex = FlexRestManager(db_base=Base, db_session_callback=get_session)\n flex.init_app(app)\n\n user_bp = Blueprint('user_rest', __name__)\n\n\n class UserRestApiHandler(RestApiHandler):\n resource_class = User\n\n user_resource = RestApiResource(\n name=\"user\",\n route=\"/user\",\n app=user_bp,\n decorators=[login_required],\n handler=UserRestApiHandler())\n\n\n book_bp = Blueprint('book_rest', __name__)\n\n\n class BookRestApiHandler(RestApiHandler):\n resource_class = Book\n\n book_resource = RestApiResource(\n name=\"book\",\n route=\"/book\",\n app=book_bp,\n decorators={'get': [login_required]},\n handler=BookRestApiHandler())\n\n app.register_blueprint(user_bp, url_prefix='/api/v1')\n app.register_blueprint(book_bp, url_prefix='/api/v1')\n\n\n @app.route('/login')\n def login():\n dbs = get_session()\n user = dbs.query(User).first()\n login_user(user)\n return redirect(url_for('index'))\n\n\n @app.route('/logout')\n def logout():\n logout_user()\n return redirect(url_for('index'))\n\n\n @app.route('/')\n def index():\n username = current_user.username if current_user.is_authenticated() \\\n else 'N/A'\n return '''\n

an example for flexrest

\n login | logout \n

Login by: {username}

\n Books:\n \n Users(Need authorization):\n \n '''.format(username=username)\n\n if __name__ == '__main__':\n app.run(host='localhost', port=5000, debug=False)\n\n\nLicence\n=======\n\nMIT\n\nRequirements\n=================\n* flask\n* flask-principal\n* formencode\n* sqlalchemy\n\n\nInstallation\n=================\n\n.. code:: sh\n\n $ git clone https://github.com/pprolancer/flexrest.git\n $ cd flexrest\n $ python setup.py install\n\n or\n\n $ pip install flexrest\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/pprolancer/flexrest/tarball/0.1.9", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/pprolancer/flexrest", "keywords": "api,rest,restful", "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "flexrest", "package_url": "https://pypi.org/project/flexrest/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/flexrest/", "project_urls": { "Download": "https://github.com/pprolancer/flexrest/tarball/0.1.9", "Homepage": "https://github.com/pprolancer/flexrest" }, "release_url": "https://pypi.org/project/flexrest/0.1.9/", "requires_dist": null, "requires_python": null, "summary": "Flexible Flask Rest Api", "version": "0.1.9" }, "last_serial": 1932196, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "0182c44ada6691ec917c985d9ba1051b", "sha256": "4069d0c89dbebbdde5cfffa15a8c24ae0936b025dc81456991f0e01379b88517" }, "downloads": -1, "filename": "flexrest-0.1.1.tar.gz", "has_sig": false, "md5_digest": "0182c44ada6691ec917c985d9ba1051b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3391, "upload_time": "2015-12-17T19:19:51", "url": "https://files.pythonhosted.org/packages/95/4a/324b0564cdc5f4d49db88f4e4a6e787dc540b9789f068d31030dc32f3a17/flexrest-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "9fd4d75627436854c1a22c03d8d7c9cb", "sha256": "e5f5fbf4cecaf30b0b34695e1da7fcec79b7a96f3e069fa8ac3847288e635616" }, "downloads": -1, "filename": "flexrest-0.1.2.tar.gz", "has_sig": false, "md5_digest": "9fd4d75627436854c1a22c03d8d7c9cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15971, "upload_time": "2015-12-17T19:31:53", "url": "https://files.pythonhosted.org/packages/53/ab/65cfe76e43491af0dd971dcf22c8828aff5e3c67d7bff3c561f03bc31cff/flexrest-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "39066c6945f26758619aa35ba47d9c19", "sha256": "78fd0c83d02b8ccaed7c3532ec4ed77146ff4d9563a0e0bfd5e0a526ef6d5dae" }, "downloads": -1, "filename": "flexrest-0.1.3.tar.gz", "has_sig": false, "md5_digest": "39066c6945f26758619aa35ba47d9c19", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15962, "upload_time": "2015-12-17T19:37:49", "url": "https://files.pythonhosted.org/packages/2e/3a/1bf79f7f858db8500fe8e2a78d970120817386303a326534fb9a1585a285/flexrest-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "d920723b4c03f4872e1ffebc9ebdc9a5", "sha256": "5fde466dba86a677f0714fd6d67ff42fe836b8c5ed46aaa82a03544a04367914" }, "downloads": -1, "filename": "flexrest-0.1.4.tar.gz", "has_sig": false, "md5_digest": "d920723b4c03f4872e1ffebc9ebdc9a5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16003, "upload_time": "2016-01-05T17:35:56", "url": "https://files.pythonhosted.org/packages/19/2f/3c2cd3cf29abd62bcd36cf279f818101a1460b9f66d587a6ed84a191ce3d/flexrest-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "9100fc7fb18c9d6e287ef2d49f049fa9", "sha256": "46cb9ca16149f6ac648286d7e1115fc6ef67a0ea08ee55c9fddd6bbab891e844" }, "downloads": -1, "filename": "flexrest-0.1.5.tar.gz", "has_sig": false, "md5_digest": "9100fc7fb18c9d6e287ef2d49f049fa9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16175, "upload_time": "2016-01-07T17:28:43", "url": "https://files.pythonhosted.org/packages/5a/a0/e01957a88850e4d285f51033302f06c5c54d43e54970aaf5f35d5c7ec581/flexrest-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "9a49ab6d666de599978747b22450bd17", "sha256": "008e3df900171ac9fcd9cbeecc42293007ec4b1a0682fcb9f61a8a2234be0f66" }, "downloads": -1, "filename": "flexrest-0.1.6.tar.gz", "has_sig": false, "md5_digest": "9a49ab6d666de599978747b22450bd17", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16381, "upload_time": "2016-01-10T16:43:28", "url": "https://files.pythonhosted.org/packages/7a/0e/3d2f0e5482bc2f4f6df62a2ee59587db3465d554485b044b39c58382bc0b/flexrest-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "ac8e4732c9c7af34082dc4933f0270ca", "sha256": "b8460d0a73eb4ea6cc7eef993538f613acf0de5f9b892964521c2d573e253379" }, "downloads": -1, "filename": "flexrest-0.1.7.tar.gz", "has_sig": false, "md5_digest": "ac8e4732c9c7af34082dc4933f0270ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16414, "upload_time": "2016-01-11T08:19:42", "url": "https://files.pythonhosted.org/packages/04/09/1538774b8808d417c6ecff27a066f54c654bc571fb182b931928e20b7779/flexrest-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "afade084c9f16205b99accbdcbe09c54", "sha256": "7241284e98f6f314e1f1b3db8a5f67708034f0b4fb1d5a675db5fc5447379503" }, "downloads": -1, "filename": "flexrest-0.1.8.tar.gz", "has_sig": false, "md5_digest": "afade084c9f16205b99accbdcbe09c54", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16470, "upload_time": "2016-01-13T17:22:32", "url": "https://files.pythonhosted.org/packages/79/25/23ed2165085fde3ee5d74b2961da8af6bfed96cfe6167079f6390edda4ad/flexrest-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "bcae6acc143554b3117565582346ca22", "sha256": "70ad9a232dbc7426761e65fadd6b39ebd541148545e11184b8ccb6462391d513" }, "downloads": -1, "filename": "flexrest-0.1.9.tar.gz", "has_sig": false, "md5_digest": "bcae6acc143554b3117565582346ca22", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16474, "upload_time": "2016-01-31T15:55:50", "url": "https://files.pythonhosted.org/packages/e6/40/7ecf0e9b97a3c3f06541b6b1079c73ccf7faa6341ab9515b228c6d71a0a0/flexrest-0.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bcae6acc143554b3117565582346ca22", "sha256": "70ad9a232dbc7426761e65fadd6b39ebd541148545e11184b8ccb6462391d513" }, "downloads": -1, "filename": "flexrest-0.1.9.tar.gz", "has_sig": false, "md5_digest": "bcae6acc143554b3117565582346ca22", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16474, "upload_time": "2016-01-31T15:55:50", "url": "https://files.pythonhosted.org/packages/e6/40/7ecf0e9b97a3c3f06541b6b1079c73ccf7faa6341ab9515b228c6d71a0a0/flexrest-0.1.9.tar.gz" } ] }