Automated deployment: Sun Oct 27 15:36:14 UTC 2019 ab0b187f20133753797ed55cf4b9b11b65c9ec8d

This commit is contained in:
frankie567
2019-10-27 15:36:14 +00:00
parent 1ff69252cf
commit 746184154c
9 changed files with 240 additions and 19 deletions

View File

@ -340,6 +340,20 @@
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#setup-database-connection-and-collection" class="md-nav__link">
Setup database connection and collection
</a>
</li>
<li class="md-nav__item">
<a href="#create-the-database-adapter" class="md-nav__link">
Create the database adapter
</a>
</li>
<li class="md-nav__item">
<a href="#next-steps" class="md-nav__link">
Next steps
@ -508,6 +522,20 @@
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#setup-database-connection-and-collection" class="md-nav__link">
Setup database connection and collection
</a>
</li>
<li class="md-nav__item">
<a href="#create-the-database-adapter" class="md-nav__link">
Create the database adapter
</a>
</li>
<li class="md-nav__item">
<a href="#next-steps" class="md-nav__link">
Next steps
@ -533,7 +561,52 @@
<h1 id="mongodb">MongoDB<a class="headerlink" href="#mongodb" title="Permanent link">&para;</a></h1>
<p><strong>Coming soon</strong>. Track the progress of this feature in <a href="https://github.com/frankie567/fastapi-users/issues/4">ticket #4</a>.</p>
<p><strong>FastAPI Users</strong> provides the necessary tools to work with MongoDB databases thanks to <a href="https://github.com/mongodb/motor">mongodb/motor</a> package for full async support.</p>
<h2 id="setup-database-connection-and-collection">Setup database connection and collection<a class="headerlink" href="#setup-database-connection-and-collection" title="Permanent link">&para;</a></h2>
<p>Let's create a MongoDB connection and instantiate a collection.</p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">motor.motor_asyncio</span>
<span class="kn">from</span> <span class="nn">fastapi</span> <span class="kn">import</span> <span class="n">FastAPI</span>
<span class="kn">from</span> <span class="nn">fastapi_users.db</span> <span class="kn">import</span> <span class="n">MongoDBUserDatabase</span>
<span class="n">DATABASE_URL</span> <span class="o">=</span> <span class="s2">&quot;mongodb://localhost:27017&quot;</span>
<span class="hll"><span class="n">client</span> <span class="o">=</span> <span class="n">motor</span><span class="o">.</span><span class="n">motor_asyncio</span><span class="o">.</span><span class="n">AsyncIOMotorClient</span><span class="p">(</span><span class="n">DATABASE_URL</span><span class="p">)</span>
</span><span class="hll"><span class="n">db</span> <span class="o">=</span> <span class="n">client</span><span class="p">[</span><span class="s2">&quot;database_name&quot;</span><span class="p">]</span>
</span><span class="hll"><span class="n">collection</span> <span class="o">=</span> <span class="n">db</span><span class="p">[</span><span class="s2">&quot;users&quot;</span><span class="p">]</span>
</span><span class="hll">
</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">FastAPI</span><span class="p">()</span>
<span class="n">user_db</span> <span class="o">=</span> <span class="n">MongoDBUserDatabase</span><span class="p">(</span><span class="n">collection</span><span class="p">)</span>
</pre></div>
<p>You can choose any name for the database and the collection.</p>
<h2 id="create-the-database-adapter">Create the database adapter<a class="headerlink" href="#create-the-database-adapter" title="Permanent link">&para;</a></h2>
<p>The database adapter of <strong>FastAPI Users</strong> makes the link between your database configuration and the users logic. Create it like this.</p>
<div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">motor.motor_asyncio</span>
<span class="kn">from</span> <span class="nn">fastapi</span> <span class="kn">import</span> <span class="n">FastAPI</span>
<span class="kn">from</span> <span class="nn">fastapi_users.db</span> <span class="kn">import</span> <span class="n">MongoDBUserDatabase</span>
<span class="n">DATABASE_URL</span> <span class="o">=</span> <span class="s2">&quot;mongodb://localhost:27017&quot;</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">motor</span><span class="o">.</span><span class="n">motor_asyncio</span><span class="o">.</span><span class="n">AsyncIOMotorClient</span><span class="p">(</span><span class="n">DATABASE_URL</span><span class="p">)</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">client</span><span class="p">[</span><span class="s2">&quot;database_name&quot;</span><span class="p">]</span>
<span class="n">collection</span> <span class="o">=</span> <span class="n">db</span><span class="p">[</span><span class="s2">&quot;users&quot;</span><span class="p">]</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">FastAPI</span><span class="p">()</span>
<span class="n">user_db</span> <span class="o">=</span> <span class="n">MongoDBUserDatabase</span><span class="p">(</span><span class="n">collection</span><span class="p">)</span>
</pre></div>
<div class="admonition info">
<p class="admonition-title">Info</p>
<p>The database adapter will automatically create a <a href="https://docs.mongodb.com/manual/core/index-unique/">unique index</a> on <code>id</code> and <code>email</code>.</p>
</div>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p><strong>FastAPI Users</strong> will use its defined <a href="../../model/"><code>id</code> UUID-string</a> as unique identifier for the user, rather than the builtin MongoDB <code>_id</code>.</p>
</div>
<h2 id="next-steps">Next steps<a class="headerlink" href="#next-steps" title="Permanent link">&para;</a></h2>
<p>We will now configure an <a href="../../authentication/">authentication method</a>.</p>

View File

@ -598,7 +598,43 @@
</pre></div></div>
<input name="__tabs_1" type="radio" id="__tab_1_1" />
<label for="__tab_1_1">MongoDB</label>
<div class="superfences-content"><div class="codehilite"><pre><span></span><span class="c1"># Coming soon</span>
<div class="superfences-content"><div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">motor.motor_asyncio</span>
<span class="kn">from</span> <span class="nn">fastapi</span> <span class="kn">import</span> <span class="n">FastAPI</span>
<span class="kn">from</span> <span class="nn">fastapi_users</span> <span class="kn">import</span> <span class="n">BaseUser</span><span class="p">,</span> <span class="n">FastAPIUsers</span>
<span class="kn">from</span> <span class="nn">fastapi_users.authentication</span> <span class="kn">import</span> <span class="n">JWTAuthentication</span>
<span class="kn">from</span> <span class="nn">fastapi_users.db</span> <span class="kn">import</span> <span class="n">MongoDBUserDatabase</span>
<span class="n">DATABASE_URL</span> <span class="o">=</span> <span class="s2">&quot;mongodb://localhost:27017&quot;</span>
<span class="n">SECRET</span> <span class="o">=</span> <span class="s2">&quot;SECRET&quot;</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">motor</span><span class="o">.</span><span class="n">motor_asyncio</span><span class="o">.</span><span class="n">AsyncIOMotorClient</span><span class="p">(</span><span class="n">DATABASE_URL</span><span class="p">)</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">client</span><span class="p">[</span><span class="s2">&quot;database_name&quot;</span><span class="p">]</span>
<span class="n">collection</span> <span class="o">=</span> <span class="n">db</span><span class="p">[</span><span class="s2">&quot;users&quot;</span><span class="p">]</span>
<span class="n">user_db</span> <span class="o">=</span> <span class="n">MongoDBUserDatabase</span><span class="p">(</span><span class="n">collection</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">User</span><span class="p">(</span><span class="n">BaseUser</span><span class="p">):</span>
<span class="k">pass</span>
<span class="n">auth</span> <span class="o">=</span> <span class="n">JWTAuthentication</span><span class="p">(</span><span class="n">secret</span><span class="o">=</span><span class="n">SECRET</span><span class="p">,</span> <span class="n">lifetime_seconds</span><span class="o">=</span><span class="mi">3600</span><span class="p">)</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">FastAPI</span><span class="p">()</span>
<span class="n">fastapi_users</span> <span class="o">=</span> <span class="n">FastAPIUsers</span><span class="p">(</span><span class="n">user_db</span><span class="p">,</span> <span class="n">auth</span><span class="p">,</span> <span class="n">User</span><span class="p">,</span> <span class="n">SECRET</span><span class="p">)</span>
<span class="n">app</span><span class="o">.</span><span class="n">include_router</span><span class="p">(</span><span class="n">fastapi_users</span><span class="o">.</span><span class="n">router</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="s2">&quot;/users&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;users&quot;</span><span class="p">])</span>
<span class="nd">@fastapi_users.on_after_register</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_after_register</span><span class="p">(</span><span class="n">user</span><span class="p">:</span> <span class="n">User</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;User {user.id} has registered.&quot;</span><span class="p">)</span>
<span class="nd">@fastapi_users.on_after_forgot_password</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_after_forgot_password</span><span class="p">(</span><span class="n">user</span><span class="p">:</span> <span class="n">User</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;User {user.id} has forgot their password. Reset token: {token}&quot;</span><span class="p">)</span>
</pre></div></div>
</div>
<h2 id="what-now">What now?<a class="headerlink" href="#what-now" title="Permanent link">&para;</a></h2>

View File

@ -564,9 +564,10 @@
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" disabled checked/> Extensible base user model</li>
<li class="task-list-item"><input type="checkbox" disabled checked/> Ready-to-use register, login, forgot and reset password routes.</li>
<li class="task-list-item"><input type="checkbox" disabled checked/> Dependency callables to inject current user in route.</li>
<li class="task-list-item"><input type="checkbox" disabled checked/> Customizable database backend<ul class="task-list">
<li class="task-list-item"><input type="checkbox" disabled checked/> SQLAlchemy backend included</li>
<li class="task-list-item"><input type="checkbox" disabled/> MongoDB backend included (<a href="https://github.com/frankie567/fastapi-users/issues/4">#4</a>)</li>
<li class="task-list-item"><input type="checkbox" disabled checked/> SQLAlchemy async backend included thanks to <a href="https://www.encode.io/databases/">encode/databases</a></li>
<li class="task-list-item"><input type="checkbox" disabled checked/> MongoDB async backend included thanks to <a href="https://github.com/mongodb/motor">mongodb/motor</a></li>
</ul>
</li>
<li class="task-list-item"><input type="checkbox" disabled checked/> Customizable authentication backend<ul class="task-list">

View File

@ -244,10 +244,46 @@
<label class="md-nav__link md-nav__link--active" for="__toc">
Installation
</label>
<a href="./" title="Installation" class="md-nav__link md-nav__link--active">
Installation
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#with-sqlalchemy-support" class="md-nav__link">
With SQLAlchemy support
</a>
</li>
<li class="md-nav__item">
<a href="#with-mongodb-support" class="md-nav__link">
With MongoDB support
</a>
</li>
</ul>
</nav>
</li>
@ -472,6 +508,29 @@
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#with-sqlalchemy-support" class="md-nav__link">
With SQLAlchemy support
</a>
</li>
<li class="md-nav__item">
<a href="#with-mongodb-support" class="md-nav__link">
With MongoDB support
</a>
</li>
</ul>
</nav>
</div>
</div>
@ -485,11 +544,12 @@
<h1 id="installation">Installation<a class="headerlink" href="#installation" title="Permanent link">&para;</a></h1>
<p>You can add <strong>FastAPI Users</strong> to your FastAPI project in a few easy steps. First of all, install the dependency:</p>
<div class="codehilite"><pre><span></span>pip install fastapi-users
<h2 id="with-sqlalchemy-support">With SQLAlchemy support<a class="headerlink" href="#with-sqlalchemy-support" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span>pip install fastapi-users<span class="o">[</span>sqlalchemy<span class="o">]</span>
</pre></div>
<p>...or if you're already in the future:</p>
<div class="codehilite"><pre><span></span>pipenv install fastapi-users
<h2 id="with-mongodb-support">With MongoDB support<a class="headerlink" href="#with-mongodb-support" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span>pip install fastapi-users<span class="o">[</span>mongodb<span class="o">]</span>
</pre></div>
<hr />

File diff suppressed because one or more lines are too long

View File

@ -2,57 +2,57 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>None</loc>
<lastmod>2019-10-25</lastmod>
<lastmod>2019-10-27</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-10-25</lastmod>
<lastmod>2019-10-27</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-10-25</lastmod>
<lastmod>2019-10-27</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-10-25</lastmod>
<lastmod>2019-10-27</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-10-25</lastmod>
<lastmod>2019-10-27</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-10-25</lastmod>
<lastmod>2019-10-27</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-10-25</lastmod>
<lastmod>2019-10-27</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-10-25</lastmod>
<lastmod>2019-10-27</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-10-25</lastmod>
<lastmod>2019-10-27</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-10-25</lastmod>
<lastmod>2019-10-27</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2019-10-25</lastmod>
<lastmod>2019-10-27</lastmod>
<changefreq>daily</changefreq>
</url>
</urlset>

Binary file not shown.

14
src/db_mongodb.py Normal file
View File

@ -0,0 +1,14 @@
import motor.motor_asyncio
from fastapi import FastAPI
from fastapi_users.db import MongoDBUserDatabase
DATABASE_URL = "mongodb://localhost:27017"
client = motor.motor_asyncio.AsyncIOMotorClient(DATABASE_URL)
db = client["database_name"]
collection = db["users"]
app = FastAPI()
user_db = MongoDBUserDatabase(collection)

37
src/full_mongodb.py Normal file
View File

@ -0,0 +1,37 @@
import motor.motor_asyncio
from fastapi import FastAPI
from fastapi_users import BaseUser, FastAPIUsers
from fastapi_users.authentication import JWTAuthentication
from fastapi_users.db import MongoDBUserDatabase
DATABASE_URL = "mongodb://localhost:27017"
SECRET = "SECRET"
client = motor.motor_asyncio.AsyncIOMotorClient(DATABASE_URL)
db = client["database_name"]
collection = db["users"]
user_db = MongoDBUserDatabase(collection)
class User(BaseUser):
pass
auth = JWTAuthentication(secret=SECRET, lifetime_seconds=3600)
app = FastAPI()
fastapi_users = FastAPIUsers(user_db, auth, User, SECRET)
app.include_router(fastapi_users.router, prefix="/users", tags=["users"])
@fastapi_users.on_after_register()
def on_after_register(user: User):
print(f"User {user.id} has registered.")
@fastapi_users.on_after_forgot_password()
def on_after_forgot_password(user: User, token: str):
print(f"User {user.id} has forgot their password. Reset token: {token}")