Refactor documentation for reverse proxy and routing guides
Deploy to Production / deploy (push) Successful in 5s
Deploy to Production / deploy (push) Successful in 5s
This commit is contained in:
+89
-89
@@ -45,15 +45,15 @@
|
||||
<h3>Configuration</h3>
|
||||
<p>ASGI applications are mounted via the <code>asgi</code> extension:</p>
|
||||
|
||||
<pre><span class="directive">extensions:</span>
|
||||
- <span class="directive">type:</span> <span class="value">asgi</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">mounts:</span>
|
||||
- <span class="directive">path:</span> <span class="value">"/api"</span>
|
||||
<span class="directive">app_path:</span> <span class="value">"myapp.api:app"</span>
|
||||
<span class="directive">app_type:</span> <span class="value">asgi</span>
|
||||
<span class="directive">name:</span> <span class="value">"api-app"</span>
|
||||
<span class="directive">strip_path:</span> <span class="value">true</span></pre>
|
||||
<pre><code class="language-yaml">extensions:
|
||||
- type: asgi
|
||||
config:
|
||||
mounts:
|
||||
- path: "/api"
|
||||
app_path: "myapp.api:app"
|
||||
app_type: asgi
|
||||
name: "api-app"
|
||||
strip_path: true</code></pre>
|
||||
|
||||
<h3>Mount Configuration Options</h3>
|
||||
<dl>
|
||||
@@ -85,23 +85,23 @@
|
||||
<h3>Mounting FastAPI</h3>
|
||||
<p>FastAPI applications are native ASGI:</p>
|
||||
|
||||
<pre><span class="comment"># myapp/api.py</span>
|
||||
<pre><code class="language-python"># myapp/api.py
|
||||
from fastapi import FastAPI
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
@app.get("/users")
|
||||
async def get_users():
|
||||
return [{"id": 1, "name": "Alice"}]</pre>
|
||||
return [{"id": 1, "name": "Alice"}]</code></pre>
|
||||
|
||||
<pre><span class="directive">extensions:</span>
|
||||
- <span class="directive">type:</span> <span class="value">asgi</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">mounts:</span>
|
||||
- <span class="directive">path:</span> <span class="value">"/api"</span>
|
||||
<span class="directive">app_path:</span> <span class="value">"myapp.api:app"</span>
|
||||
<span class="directive">app_type:</span> <span class="value">asgi</span>
|
||||
<span class="directive">name:</span> <span class="value">"fastapi-app"</span></pre>
|
||||
<pre><code class="language-yaml">extensions:
|
||||
- type: asgi
|
||||
config:
|
||||
mounts:
|
||||
- path: "/api"
|
||||
app_path: "myapp.api:app"
|
||||
app_type: asgi
|
||||
name: "fastapi-app"</code></pre>
|
||||
|
||||
<p>With this configuration:</p>
|
||||
<ul class="indent">
|
||||
@@ -112,23 +112,23 @@ async def get_users():
|
||||
<h3>Mounting Flask</h3>
|
||||
<p>Flask applications are WSGI and will be automatically wrapped:</p>
|
||||
|
||||
<pre><span class="comment"># myapp/flask_api.py</span>
|
||||
<pre><code class="language-python"># myapp/flask_api.py
|
||||
from flask import Flask
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
@app.route("/hello")
|
||||
def hello():
|
||||
return {"message": "Hello from Flask!"}</pre>
|
||||
return {"message": "Hello from Flask!"}</code></pre>
|
||||
|
||||
<pre><span class="directive">extensions:</span>
|
||||
- <span class="directive">type:</span> <span class="value">asgi</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">mounts:</span>
|
||||
- <span class="directive">path:</span> <span class="value">"/flask"</span>
|
||||
<span class="directive">app_path:</span> <span class="value">"myapp.flask_api:app"</span>
|
||||
<span class="directive">app_type:</span> <span class="value">wsgi</span>
|
||||
<span class="directive">name:</span> <span class="value">"flask-app"</span></pre>
|
||||
<pre><code class="language-yaml">extensions:
|
||||
- type: asgi
|
||||
config:
|
||||
mounts:
|
||||
- path: "/flask"
|
||||
app_path: "myapp.flask_api:app"
|
||||
app_type: wsgi
|
||||
name: "flask-app"</code></pre>
|
||||
|
||||
<div class="note">
|
||||
<strong>Note:</strong> WSGI wrapping requires either <code>a2wsgi</code> or <code>asgiref</code>
|
||||
@@ -138,19 +138,19 @@ def hello():
|
||||
<h3>Mounting Django</h3>
|
||||
<p>Django can be mounted using its ASGI application:</p>
|
||||
|
||||
<pre><span class="directive">extensions:</span>
|
||||
- <span class="directive">type:</span> <span class="value">asgi</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">mounts:</span>
|
||||
- <span class="directive">path:</span> <span class="value">"/django"</span>
|
||||
<span class="directive">django_settings:</span> <span class="value">"myproject.settings"</span>
|
||||
<span class="directive">module_path:</span> <span class="value">"/path/to/django/project"</span>
|
||||
<span class="directive">name:</span> <span class="value">"django-app"</span></pre>
|
||||
<pre><code class="language-yaml">extensions:
|
||||
- type: asgi
|
||||
config:
|
||||
mounts:
|
||||
- path: "/django"
|
||||
django_settings: "myproject.settings"
|
||||
module_path: "/path/to/django/project"
|
||||
name: "django-app"</code></pre>
|
||||
|
||||
<h3>Factory Pattern</h3>
|
||||
<p>Use factory functions to create apps with custom configuration:</p>
|
||||
|
||||
<pre><span class="comment"># myapp/api.py</span>
|
||||
<pre><code class="language-python"># myapp/api.py
|
||||
from fastapi import FastAPI
|
||||
|
||||
def create_app(debug: bool = False, prefix: str = "/v1") -> FastAPI:
|
||||
@@ -160,19 +160,19 @@ def create_app(debug: bool = False, prefix: str = "/v1") -> FastAPI:
|
||||
async def status():
|
||||
return {"debug": debug}
|
||||
|
||||
return app</pre>
|
||||
return app</code></pre>
|
||||
|
||||
<pre><span class="directive">extensions:</span>
|
||||
- <span class="directive">type:</span> <span class="value">asgi</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">mounts:</span>
|
||||
- <span class="directive">path:</span> <span class="value">"/api"</span>
|
||||
<span class="directive">app_path:</span> <span class="value">"myapp.api:create_app"</span>
|
||||
<span class="directive">app_type:</span> <span class="value">asgi</span>
|
||||
<span class="directive">factory:</span> <span class="value">true</span>
|
||||
<span class="directive">factory_args:</span>
|
||||
<span class="directive">debug:</span> <span class="value">true</span>
|
||||
<span class="directive">prefix:</span> <span class="value">"/v2"</span></pre>
|
||||
<pre><code class="language-yaml">extensions:
|
||||
- type: asgi
|
||||
config:
|
||||
mounts:
|
||||
- path: "/api"
|
||||
app_path: "myapp.api:create_app"
|
||||
app_type: asgi
|
||||
factory: true
|
||||
factory_args:
|
||||
debug: true
|
||||
prefix: "/v2"</code></pre>
|
||||
|
||||
<h3>Path Stripping</h3>
|
||||
<p>By default, <code>strip_path: true</code> removes the mount prefix from requests:</p>
|
||||
@@ -198,31 +198,31 @@ def create_app(debug: bool = False, prefix: str = "/v1") -> FastAPI:
|
||||
<h3>Multiple Mounts</h3>
|
||||
<p>Mount multiple applications at different paths:</p>
|
||||
|
||||
<pre><span class="directive">extensions:</span>
|
||||
- <span class="directive">type:</span> <span class="value">asgi</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">mounts:</span>
|
||||
<span class="comment"># FastAPI for REST API</span>
|
||||
- <span class="directive">path:</span> <span class="value">"/api"</span>
|
||||
<span class="directive">app_path:</span> <span class="value">"apps.api:app"</span>
|
||||
<span class="directive">app_type:</span> <span class="value">asgi</span>
|
||||
<pre><code class="language-yaml">extensions:
|
||||
- type: asgi
|
||||
config:
|
||||
mounts:
|
||||
# FastAPI for REST API
|
||||
- path: "/api"
|
||||
app_path: "apps.api:app"
|
||||
app_type: asgi
|
||||
|
||||
<span class="comment"># Flask admin panel</span>
|
||||
- <span class="directive">path:</span> <span class="value">"/admin"</span>
|
||||
<span class="directive">app_path:</span> <span class="value">"apps.admin:app"</span>
|
||||
<span class="directive">app_type:</span> <span class="value">wsgi</span>
|
||||
# Flask admin panel
|
||||
- path: "/admin"
|
||||
app_path: "apps.admin:app"
|
||||
app_type: wsgi
|
||||
|
||||
<span class="comment"># Starlette websocket handler</span>
|
||||
- <span class="directive">path:</span> <span class="value">"/ws"</span>
|
||||
<span class="directive">app_path:</span> <span class="value">"apps.websocket:app"</span>
|
||||
<span class="directive">app_type:</span> <span class="value">asgi</span>
|
||||
# Starlette websocket handler
|
||||
- path: "/ws"
|
||||
app_path: "apps.websocket:app"
|
||||
app_type: asgi
|
||||
|
||||
<span class="comment"># Standard routing for static files</span>
|
||||
- <span class="directive">type:</span> <span class="value">routing</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">regex_locations:</span>
|
||||
<span class="value">"__default__"</span>:
|
||||
<span class="directive">root:</span> <span class="value">"./static"</span></pre>
|
||||
# Standard routing for static files
|
||||
- type: routing
|
||||
config:
|
||||
regex_locations:
|
||||
"__default__":
|
||||
root: "./static"</code></pre>
|
||||
|
||||
<h3>Mount Priority</h3>
|
||||
<p>Mounts are matched by path length (longest first). Given mounts at
|
||||
@@ -236,24 +236,24 @@ def create_app(debug: bool = False, prefix: str = "/v1") -> FastAPI:
|
||||
<p>ASGI mounts work alongside the routing extension. The <code>asgi</code> extension
|
||||
should be listed before <code>routing</code> to handle mounted paths first:</p>
|
||||
|
||||
<pre><span class="directive">extensions:</span>
|
||||
<span class="comment"># ASGI apps handle /api/* and /admin/*</span>
|
||||
- <span class="directive">type:</span> <span class="value">asgi</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">mounts:</span>
|
||||
- <span class="directive">path:</span> <span class="value">"/api"</span>
|
||||
<span class="directive">app_path:</span> <span class="value">"myapp:api"</span>
|
||||
<span class="directive">app_type:</span> <span class="value">asgi</span>
|
||||
<pre><code class="language-yaml">extensions:
|
||||
# ASGI apps handle /api/* and /admin/*
|
||||
- type: asgi
|
||||
config:
|
||||
mounts:
|
||||
- path: "/api"
|
||||
app_path: "myapp:api"
|
||||
app_type: asgi
|
||||
|
||||
<span class="comment"># Routing handles everything else</span>
|
||||
- <span class="directive">type:</span> <span class="value">routing</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">regex_locations:</span>
|
||||
<span class="value">"=/health"</span>:
|
||||
<span class="directive">return:</span> <span class="value">"200 OK"</span>
|
||||
<span class="value">"__default__"</span>:
|
||||
<span class="directive">spa_fallback:</span> <span class="value">true</span>
|
||||
<span class="directive">root:</span> <span class="value">"./dist"</span></pre>
|
||||
# Routing handles everything else
|
||||
- type: routing
|
||||
config:
|
||||
regex_locations:
|
||||
"=/health":
|
||||
return: "200 OK"
|
||||
"__default__":
|
||||
spa_fallback: true
|
||||
root: "./dist"</code></pre>
|
||||
|
||||
<h3>Python API</h3>
|
||||
<p>For programmatic mounting, see <a href="../reference/asgi-mount.html">ASGI Mount API Reference</a>.</p>
|
||||
|
||||
Reference in New Issue
Block a user