mirror of
https://github.com/fastapi-users/fastapi-users.git
synced 2025-08-20 16:42:13 +08:00
Automated deployment: Sun Oct 27 15:36:14 UTC 2019 ab0b187f20133753797ed55cf4b9b11b65c9ec8d
This commit is contained in:
@ -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">¶</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">¶</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">"mongodb://localhost:27017"</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">"database_name"</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">"users"</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">¶</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">"mongodb://localhost:27017"</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">"database_name"</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">"users"</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">¶</a></h2>
|
||||
<p>We will now configure an <a href="../../authentication/">authentication method</a>.</p>
|
||||
|
||||
|
@ -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">"mongodb://localhost:27017"</span>
|
||||
<span class="n">SECRET</span> <span class="o">=</span> <span class="s2">"SECRET"</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">"database_name"</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">"users"</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">"/users"</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s2">"users"</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">"User {user.id} has registered."</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">"User {user.id} has forgot their password. Reset token: {token}"</span><span class="p">)</span>
|
||||
</pre></div></div>
|
||||
</div>
|
||||
<h2 id="what-now">What now?<a class="headerlink" href="#what-now" title="Permanent link">¶</a></h2>
|
||||
|
@ -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">
|
||||
|
@ -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">¶</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">¶</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">¶</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
22
sitemap.xml
22
sitemap.xml
@ -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>
|
BIN
sitemap.xml.gz
BIN
sitemap.xml.gz
Binary file not shown.
14
src/db_mongodb.py
Normal file
14
src/db_mongodb.py
Normal 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
37
src/full_mongodb.py
Normal 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}")
|
Reference in New Issue
Block a user