diff --git a/docs/api.rst b/docs/api.rst
index 4b86c60..c4ff952 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -49,6 +49,10 @@ Datastores
:members:
:inherited-members:
+.. autoclass:: flask_security.datastore.PeeweeUserDatastore
+ :members:
+ :inherited-members:
+
Signals
-------
diff --git a/docs/index.rst b/docs/index.rst
index 97713c1..083de61 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -10,7 +10,7 @@ Flask application. They include:
4. Basic HTTP authentication
5. Token based authentication
6. Token based account activation (optional)
-7. Token based password recovery/resetting (optional)
+7. Token based password recovery / resetting (optional)
8. User registration (optional)
9. Login tracking (optional)
@@ -27,10 +27,11 @@ and libraries. They include:
Additionally, it assumes you'll be using a common library for your database
connections and model definitions. Flask-Security supports the following Flask
-extensions out of the box for data persistance:
+extensions out of the box for data persistence:
-1. `Flask-SQLAlchemy `_
-2. `Flask-MongoEngine `_
+1. `Flask-SQLAlchemy `_
+2. `Flask-MongoEngine `_
+3. `Flask-Peewee `_
-.. include:: contents.rst.inc
\ No newline at end of file
+.. include:: contents.rst.inc
diff --git a/docs/models.rst b/docs/models.rst
index 6ea6b15..6fea2e4 100644
--- a/docs/models.rst
+++ b/docs/models.rst
@@ -1,12 +1,12 @@
Models
======
-Flask-Security assumes you'll be using libraries such as SQLAlchemy or
-MongoEngine to define a data model that includes a `User` and `Role` model. The
-fields on your models must follow a particular convention depending on the
-functionality your app requires. Aside from this, you're free to add any
-additional fields to your model(s) if you want. At the bear minimum your `User`
-and `Role` model should include the following fields:
+Flask-Security assumes you'll be using libraries such as SQLAlchemy,
+MongoEngine or Peewee to define a data model that includes a `User` and
+`Role` model. The fields on your models must follow a particular convention
+depending on the functionality your app requires. Aside from this, you're
+free to add any additional fields to your model(s) if you want. At the bear
+minimum your `User` and `Role` model should include the following fields:
**User**
@@ -48,4 +48,4 @@ additional fields:
* ``current_login_at``
* ``last_login_ip``
* ``current_login_ip``
-* ``login_count``
\ No newline at end of file
+* ``login_count``
diff --git a/docs/quickstart.rst b/docs/quickstart.rst
index 69aff7c..0443a0e 100644
--- a/docs/quickstart.rst
+++ b/docs/quickstart.rst
@@ -3,6 +3,7 @@ Quick Start
- `Basic SQLAlchemy Application <#basic-sqlalchemy-application>`_
- `Basic MongoEngine Application <#basic-mongoengine-application>`_
+- `Basic Peewee Application <#basic-peewee-application>`_
- `Mail Configuration <#mail-configuration>`_
Basic SQLAlchemy Application
@@ -21,7 +22,7 @@ SQLAlchemy Application
~~~~~~~~~~~~~~~~~~~~~~
The following code sample illustrates how to get started as quickly as
-possible using SQLAlchemy.
+possible using SQLAlchemy:
::
@@ -94,7 +95,9 @@ MongoEngine Application
~~~~~~~~~~~~~~~~~~~~~~~
The following code sample illustrates how to get started as quickly as
-possible using MongoEngine::
+possible using MongoEngine:
+
+::
from flask import Flask, render_template
from flask.ext.mongoengine import MongoEngine
@@ -144,6 +147,79 @@ possible using MongoEngine::
app.run()
+Basic Peewee Application
+========================
+
+Peewee Install requirements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+ $ mkvirtualenv
+ $ pip install flask-security flask-peewee
+
+Peewee Application
+~~~~~~~~~~~~~~~~~~
+
+The following code sample illustrates how to get started as quickly as
+possible using Peewee:
+
+::
+
+ from flask import Flask, render_template
+ from flask_peewee.db import Database
+ from peewee import *
+ from flask.ext.security import Security, PeeweeUserDatastore, \
+ UserMixin, RoleMixin, login_required
+
+ # Create app
+ app = Flask(__name__)
+ app.config['DEBUG'] = True
+ app.config['SECRET_KEY'] = 'super-secret'
+ app.config['DATABASE'] = {
+ 'name': 'example.db',
+ 'engine': 'peewee.SqliteDatabase',
+ }
+
+ # Create database connection object
+ db = Database(app)
+
+ class Role(Model, RoleMixin):
+ name = TextField(unique=True)
+ description = TextField(null=True)
+
+ class User(Model, UserMixin):
+ email = TextField()
+ password = TextField()
+ active = BooleanField(default=True)
+ confirmed_at = DateTimeField(null=True)
+
+ class UserRoles(Model):
+ user = ForeignKeyField(User, related_name='roles')
+ role = ForeignKeyField(Role, related_name='users')
+
+ # Setup Flask-Security
+ user_datastore = PeeweeUserDatastore(db, User, Role)
+ security = Security(app, user_datastore)
+
+ # Create a user to test with
+ @app.before_first_request
+ def create_user():
+ for Model in (Role, User, UserRoles):
+ Model.drop_table(fail_silently=True)
+ Model.create_table(fail_silently=True)
+ user_datastore.create_user(email='matt@nobien.net', password='password')
+
+ # Views
+ @app.route('/')
+ @login_required
+ def home():
+ return render_template('index.html')
+
+ if __name__ == '__main__':
+ app.run()
+
+
Mail Configuration
===================
@@ -168,4 +244,4 @@ the basic application code in the previous section::
To learn more about the various Flask-Mail settings to configure it to
work with your particular email server configuration, please see the
-`Flask-Mail documentation `_.
\ No newline at end of file
+`Flask-Mail documentation `_.