mirror of
https://github.com/fastapi-admin/fastapi-admin.git
synced 2026-03-13 10:32:25 +08:00
update docs
This commit is contained in:
@@ -54,3 +54,11 @@ You can enable site search by add `SearchProvider` to `admin_app.configure(...)`
|
||||
```python
|
||||
await admin_app.configure(providers=[SearchProvider()])
|
||||
```
|
||||
|
||||
## Notification
|
||||
|
||||
You can use notification by adding `NotificationProvider` to `admin_app.configure(...) implement by websocket.
|
||||
|
||||
```python
|
||||
await admin_app.configure(providers=[NotificationProvider()])
|
||||
```
|
||||
|
||||
47
docs/en/docs/reference/notification.md
Normal file
47
docs/en/docs/reference/notification.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# Notification (💗 Pro only)
|
||||
|
||||
`FastAPI-Admin` provide a notification center implement by websocket.
|
||||
|
||||

|
||||
|
||||
## Usage
|
||||
|
||||
You should add it to providers to enable it.
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from fastapi_admin.providers.notification import NotificationProvider
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
provider = NotificationProvider()
|
||||
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup():
|
||||
await admin_app.configure(
|
||||
providers=[provider]
|
||||
)
|
||||
```
|
||||
|
||||
There are two ways to send notifications.
|
||||
|
||||
One is call `await provider.broadcast()` directly.
|
||||
|
||||
```python
|
||||
data = {
|
||||
"title": "test",
|
||||
"content": "//avatars.githubusercontent.com/u/13377178?v=4",
|
||||
"image": "https://avatars.githubusercontent.com/u/13377178?v=4"
|
||||
}
|
||||
await provider.broadcast(data)
|
||||
```
|
||||
|
||||
If you want to send notifications out of application, another way is use http api.
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
requests.post('http://localhost:8000/admin/notification', json=data)
|
||||
```
|
||||
@@ -52,6 +52,7 @@ nav:
|
||||
- reference/admin_log.md
|
||||
- reference/global_search.md
|
||||
- reference/errors.md
|
||||
- reference/notification.md
|
||||
- Customization:
|
||||
- custom/page.md
|
||||
- custom/overwrite.md
|
||||
|
||||
@@ -32,7 +32,7 @@ class UsernamePasswordProvider(Provider):
|
||||
admin_model: Type[AbstractAdmin],
|
||||
login_path="/login",
|
||||
logout_path="/logout",
|
||||
template="login.html",
|
||||
template="providers/login/login.html",
|
||||
login_title="Login to your account",
|
||||
login_logo_url: str = None,
|
||||
):
|
||||
@@ -179,7 +179,7 @@ class UsernamePasswordProvider(Provider):
|
||||
resources=Depends(get_resources),
|
||||
):
|
||||
return templates.TemplateResponse(
|
||||
"password.html",
|
||||
"providers/login/password.html",
|
||||
context={
|
||||
"request": request,
|
||||
"resources": resources,
|
||||
|
||||
26
fastapi_admin/templates/components/language.html
Normal file
26
fastapi_admin/templates/components/language.html
Normal file
@@ -0,0 +1,26 @@
|
||||
<div class="nav-item me-3 dropdown d-none d-md-flex">
|
||||
<a href="#" class="nav-link px-0" data-bs-toggle="dropdown" tabindex="-1"
|
||||
aria-label="Show notifications">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-language"
|
||||
width="24" height="24"
|
||||
viewBox="0 0 24 24" stroke-width="2"
|
||||
stroke="currentColor" fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M5 7h7m-2 -2v2a5 8 0 0 1 -5 8m1 -4a7 4 0 0 0 6.7 4"></path>
|
||||
<path d="M11 19l4 -9l4 9m-.9 -2h-6.2"></path>
|
||||
</svg>
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-arrow">
|
||||
<a class="dropdown-item"
|
||||
href="{{ {'language':'zh_CN'}|current_page_with_params }}">
|
||||
<span class="me-2">🇨🇳</span>简体中文
|
||||
</a>
|
||||
<a class="dropdown-item"
|
||||
href="{{ {'language':'en_US'}|current_page_with_params }}">
|
||||
<span class="me-2">🇺🇸</span>English
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,219 +1,151 @@
|
||||
{% extends "base.html" %} {% block body %}
|
||||
<div class="wrapper min-vh-100">
|
||||
<aside class="navbar navbar-vertical navbar-expand-lg navbar-dark">
|
||||
<div class="container-fluid">
|
||||
<h1 class="navbar-brand navbar-brand-autodark">
|
||||
<a href="{{ request.app.admin_path }}">
|
||||
<img
|
||||
src="{{ request.app.logo_url }}"
|
||||
width="110"
|
||||
height="32"
|
||||
alt="Tabler"
|
||||
class="navbar-brand-image"
|
||||
/>
|
||||
</a>
|
||||
</h1>
|
||||
<div class="collapse navbar-collapse" id="navbar-menu">
|
||||
<ul class="navbar-nav pt-lg-3">
|
||||
{% for resource in resources %} {% if resource.type == 'link' %} {%
|
||||
include 'components/link.html' %} {% elif resource.type == 'model' %}
|
||||
{% include 'components/model.html' %} {% elif resource.type ==
|
||||
'dropdown' %} {% include 'components/dropdown.html' %} {% endif %} {%
|
||||
endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
<div class="page-wrapper min-vh-100">
|
||||
<header
|
||||
class="navbar navbar-expand-md navbar-light d-none d-lg-flex d-print-none"
|
||||
>
|
||||
<div class="container-fluid">
|
||||
<button
|
||||
class="navbar-toggler"
|
||||
type="button"
|
||||
data-bs-toggle="collapse"
|
||||
data-bs-target="#navbar-menu"
|
||||
>
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="navbar-nav flex-row order-md-last">
|
||||
{% if request.app.language_switch %}
|
||||
|
||||
<div class="nav-item dropdown d-none d-md-flex me-3">
|
||||
<a
|
||||
href="#"
|
||||
class="nav-link px-0"
|
||||
data-bs-toggle="dropdown"
|
||||
tabindex="-1"
|
||||
aria-label="Show notifications"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-language"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path
|
||||
d="M5 7h7m-2 -2v2a5 8 0 0 1 -5 8m1 -4a7 4 0 0 0 6.7 4"
|
||||
></path>
|
||||
<path d="M11 19l4 -9l4 9m-.9 -2h-6.2"></path>
|
||||
</svg>
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-arrow">
|
||||
<a
|
||||
class="dropdown-item"
|
||||
href="{{ {'language':'zh_CN'}|current_page_with_params }}"
|
||||
>
|
||||
<span class="me-2">🇨🇳</span>简体中文
|
||||
</a>
|
||||
<a
|
||||
class="dropdown-item"
|
||||
href="{{ {'language':'en_US'}|current_page_with_params }}"
|
||||
>
|
||||
<span class="me-2">🇺🇸</span>English
|
||||
</a>
|
||||
<div class="wrapper min-vh-100">
|
||||
<aside class="navbar navbar-vertical navbar-expand-lg navbar-dark">
|
||||
<div class="container-fluid">
|
||||
<h1 class="navbar-brand navbar-brand-autodark">
|
||||
<a href="{{ request.app.admin_path }}">
|
||||
<img
|
||||
src="{{ request.app.logo_url }}"
|
||||
width="110"
|
||||
height="32"
|
||||
alt="Tabler"
|
||||
class="navbar-brand-image"
|
||||
/>
|
||||
</a>
|
||||
</h1>
|
||||
<div class="collapse navbar-collapse" id="navbar-menu">
|
||||
<ul class="navbar-nav pt-lg-3">
|
||||
{% for resource in resources %} {% if resource.type == 'link' %}
|
||||
{% include 'components/link.html' %} {% elif resource.type == 'model' %}
|
||||
{% include 'components/model.html' %} {% elif resource.type ==
|
||||
'dropdown' %} {% include 'components/dropdown.html' %} {% endif %} {% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="nav-item dropdown">
|
||||
<a
|
||||
href="#"
|
||||
class="nav-link d-flex lh-1 text-reset p-0"
|
||||
data-bs-toggle="dropdown"
|
||||
</aside>
|
||||
<div class="page-wrapper min-vh-100">
|
||||
<header
|
||||
class="navbar navbar-expand-md navbar-light d-none d-lg-flex d-print-none"
|
||||
>
|
||||
<span class="avatar avatar-sm">
|
||||
<img src="{{ request.state.admin.avatar }}" alt="" />
|
||||
</span>
|
||||
<div class="d-none d-xl-block ps-2">
|
||||
<div>{{ request.state.admin.username }}</div>
|
||||
<div class="mt-1 small text-muted">{{ _('welcome') }}</div>
|
||||
</div>
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-end dropdown-menu-arrow">
|
||||
<a
|
||||
href="{{ request.app.admin_path }}/password"
|
||||
class="dropdown-item"
|
||||
>{{ _('update_password') }}</a
|
||||
>
|
||||
<div class="dropdown-divider"></div>
|
||||
<a
|
||||
href="{{ request.app.admin_path }}{{ request.app.login_provider.logout_path }}"
|
||||
class="dropdown-item"
|
||||
>{{ _('logout') }}</a
|
||||
>
|
||||
<div class="container-fluid">
|
||||
<button
|
||||
class="navbar-toggler"
|
||||
type="button"
|
||||
data-bs-toggle="collapse"
|
||||
data-bs-target="#navbar-menu"
|
||||
>
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="navbar-nav flex-row order-md-last">
|
||||
{% if request.app.language_switch %}
|
||||
{% include "components/language.html" %}
|
||||
{% endif %}
|
||||
{% if request.app.login_provider %}
|
||||
{% include "providers/login/avatar.html" %}
|
||||
{% endif %}
|
||||
</div>
|
||||
<div></div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container-fluid">
|
||||
<div class="page-header d-print-none">
|
||||
{% block page_header %}
|
||||
<div class="row align-items-center">
|
||||
<div class="col">
|
||||
<div class="page-pretitle">{{ page_pre_title or '' }}</div>
|
||||
<h2 class="page-title">{{ page_title or '' }}</h2>
|
||||
</div>
|
||||
</div>
|
||||
{% block page_title_actions %} {% endblock %} {% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="page-body flex-grow-1">
|
||||
<div class="container-fluid">
|
||||
<div class="row row-deck row-cards">
|
||||
{% block page_body %} {% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% block footer %}
|
||||
<footer class="footer footer-transparent d-print-none">
|
||||
<div class="container">
|
||||
<div class="row text-center align-items-center flex-row-reverse">
|
||||
<div class="col-lg-auto ms-lg-auto">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
<a
|
||||
href="https://fastapi-admin.github.io/fastapi-admin"
|
||||
class="link-secondary"
|
||||
>Documentation</a
|
||||
>
|
||||
</li>
|
||||
<li class="list-inline-item">
|
||||
<a
|
||||
href="https://github.com/fastapi-admin/fastapi-admin/blob/dev/LICENSE"
|
||||
class="link-secondary"
|
||||
>License</a
|
||||
>
|
||||
</li>
|
||||
<li class="list-inline-item">
|
||||
<a
|
||||
href="https://github.com/fastapi-admin/fastapi-admin"
|
||||
target="_blank"
|
||||
class="link-secondary"
|
||||
rel="noopener"
|
||||
>Source code</a
|
||||
>
|
||||
</li>
|
||||
<li class="list-inline-item">
|
||||
<a
|
||||
href="https://sponsor.long2ice.cn"
|
||||
target="_blank"
|
||||
class="link-secondary"
|
||||
rel="noopener"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon text-pink icon-filled icon-inline"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path
|
||||
d="M19.5 13.572l-7.5 7.428l-7.5 -7.428m0 0a5 5 0 1 1 7.5 -6.566a5 5 0 1 1 7.5 6.572"
|
||||
></path>
|
||||
</svg>
|
||||
Sponsor
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-12 col-lg-auto mt-3 mt-lg-0">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © {{ 2021 }} - {{ NOW_YEAR }}
|
||||
<a href="http://github.com/long2ice" class="link-secondary"
|
||||
>long2ice</a
|
||||
>. All rights reserved.
|
||||
</li>
|
||||
<li class="list-inline-item">
|
||||
<a
|
||||
href="https://github.com/fastapi-admin/fastapi-admin/releases/tag/v{{ VERSION }}"
|
||||
class="link-secondary"
|
||||
rel="noopener"
|
||||
>v{{ VERSION }}</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% endblock %}
|
||||
</div>
|
||||
<div></div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container-fluid">
|
||||
<div class="page-header d-print-none">
|
||||
{% block page_header %}
|
||||
<div class="row align-items-center">
|
||||
<div class="col">
|
||||
<div class="page-pretitle">{{ page_pre_title or '' }}</div>
|
||||
<h2 class="page-title">{{ page_title or '' }}</h2>
|
||||
</div>
|
||||
</div>
|
||||
{% block page_title_actions %} {% endblock %} {% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="page-body flex-grow-1">
|
||||
<div class="container-fluid">
|
||||
<div class="row row-deck row-cards">
|
||||
{% block page_body %} {% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% block footer %}
|
||||
<footer class="footer footer-transparent d-print-none">
|
||||
<div class="container">
|
||||
<div class="row text-center align-items-center flex-row-reverse">
|
||||
<div class="col-lg-auto ms-lg-auto">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
<a
|
||||
href="https://fastapi-admin.github.io/fastapi-admin"
|
||||
class="link-secondary"
|
||||
>Documentation</a
|
||||
>
|
||||
</li>
|
||||
<li class="list-inline-item">
|
||||
<a
|
||||
href="https://github.com/fastapi-admin/fastapi-admin/blob/dev/LICENSE"
|
||||
class="link-secondary"
|
||||
>License</a
|
||||
>
|
||||
</li>
|
||||
<li class="list-inline-item">
|
||||
<a
|
||||
href="https://github.com/fastapi-admin/fastapi-admin"
|
||||
target="_blank"
|
||||
class="link-secondary"
|
||||
rel="noopener"
|
||||
>Source code</a
|
||||
>
|
||||
</li>
|
||||
<li class="list-inline-item">
|
||||
<a
|
||||
href="https://sponsor.long2ice.cn"
|
||||
target="_blank"
|
||||
class="link-secondary"
|
||||
rel="noopener"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon text-pink icon-filled icon-inline"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path
|
||||
d="M19.5 13.572l-7.5 7.428l-7.5 -7.428m0 0a5 5 0 1 1 7.5 -6.566a5 5 0 1 1 7.5 6.572"
|
||||
></path>
|
||||
</svg>
|
||||
Sponsor
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-12 col-lg-auto mt-3 mt-lg-0">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © {{ 2021 }} - {{ NOW_YEAR }}
|
||||
<a href="http://github.com/long2ice" class="link-secondary"
|
||||
>long2ice</a
|
||||
>. All rights reserved.
|
||||
</li>
|
||||
<li class="list-inline-item">
|
||||
<a
|
||||
href="https://github.com/fastapi-admin/fastapi-admin/releases/tag/v{{ VERSION }}"
|
||||
class="link-secondary"
|
||||
rel="noopener"
|
||||
>v{{ VERSION }}</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
28
fastapi_admin/templates/providers/login/avatar.html
Normal file
28
fastapi_admin/templates/providers/login/avatar.html
Normal file
@@ -0,0 +1,28 @@
|
||||
<div class="nav-item dropdown">
|
||||
<a
|
||||
href="#"
|
||||
class="nav-link d-flex lh-1 text-reset p-0"
|
||||
data-bs-toggle="dropdown"
|
||||
>
|
||||
<span class="avatar avatar-sm">
|
||||
<img src="{{ request.state.admin.avatar }}" alt=""/>
|
||||
</span>
|
||||
<div class="d-none d-xl-block ps-2">
|
||||
<div>{{ request.state.admin.username }}</div>
|
||||
<div class="mt-1 small text-muted">{{ _('welcome') }}</div>
|
||||
</div>
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-end dropdown-menu-arrow">
|
||||
<a
|
||||
href="{{ request.app.admin_path }}/password"
|
||||
class="dropdown-item"
|
||||
>{{ _('update_password') }}</a
|
||||
>
|
||||
<div class="dropdown-divider"></div>
|
||||
<a
|
||||
href="{{ request.app.admin_path }}{{ request.app.login_provider.logout_path }}"
|
||||
class="dropdown-item"
|
||||
>{{ _('logout') }}</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
@@ -3,7 +3,7 @@
|
||||
<div class="page page-center">
|
||||
<div class="container-tight py-4">
|
||||
<div class="text-center mb-4">
|
||||
<a href="."
|
||||
<a href="../.."
|
||||
><img
|
||||
src="{{ login_logo_url }}"
|
||||
height="36"
|
||||
Reference in New Issue
Block a user