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:
+63
-63
@@ -31,18 +31,18 @@
|
||||
<h4>ASGIAppLoader</h4>
|
||||
<p>Loads and manages ASGI/WSGI applications from Python import paths.</p>
|
||||
|
||||
<pre><span class="keyword">from</span> pyserve <span class="keyword">import</span> ASGIAppLoader
|
||||
<pre><code class="language-python">from pyserve import ASGIAppLoader
|
||||
|
||||
loader = ASGIAppLoader()
|
||||
|
||||
<span class="comment"># Load an ASGI app</span>
|
||||
# Load an ASGI app
|
||||
app = loader.load_app(
|
||||
app_path=<span class="value">"mymodule:app"</span>,
|
||||
app_type=<span class="value">"asgi"</span>,
|
||||
module_path=<span class="value">"/path/to/project"</span>,
|
||||
factory=<span class="value">False</span>,
|
||||
factory_args=<span class="value">None</span>
|
||||
)</pre>
|
||||
app_path="mymodule:app",
|
||||
app_type="asgi",
|
||||
module_path="/path/to/project",
|
||||
factory=False,
|
||||
factory_args=None
|
||||
)</code></pre>
|
||||
|
||||
<h5>Methods</h5>
|
||||
<dl>
|
||||
@@ -69,14 +69,14 @@ app = loader.load_app(
|
||||
<h4>MountedApp</h4>
|
||||
<p>Represents an application mounted at a specific path.</p>
|
||||
|
||||
<pre><span class="keyword">from</span> pyserve <span class="keyword">import</span> MountedApp
|
||||
<pre><code class="language-python">from pyserve import MountedApp
|
||||
|
||||
mount = MountedApp(
|
||||
path=<span class="value">"/api"</span>,
|
||||
path="/api",
|
||||
app=my_asgi_app,
|
||||
name=<span class="value">"my-api"</span>,
|
||||
strip_path=<span class="value">True</span>
|
||||
)</pre>
|
||||
name="my-api",
|
||||
strip_path=True
|
||||
)</code></pre>
|
||||
|
||||
<h5>Attributes</h5>
|
||||
<dl>
|
||||
@@ -105,19 +105,19 @@ mount = MountedApp(
|
||||
<h4>ASGIMountManager</h4>
|
||||
<p>Manages multiple mounted applications and routes requests.</p>
|
||||
|
||||
<pre><span class="keyword">from</span> pyserve <span class="keyword">import</span> ASGIMountManager
|
||||
<pre><code class="language-python">from pyserve import ASGIMountManager
|
||||
|
||||
manager = ASGIMountManager()
|
||||
|
||||
<span class="comment"># Mount using app instance</span>
|
||||
manager.mount(path=<span class="value">"/api"</span>, app=my_app)
|
||||
# Mount using app instance
|
||||
manager.mount(path="/api", app=my_app)
|
||||
|
||||
<span class="comment"># Mount using import path</span>
|
||||
# Mount using import path
|
||||
manager.mount(
|
||||
path=<span class="value">"/flask"</span>,
|
||||
app_path=<span class="value">"myapp:flask_app"</span>,
|
||||
app_type=<span class="value">"wsgi"</span>
|
||||
)</pre>
|
||||
path="/flask",
|
||||
app_path="myapp:flask_app",
|
||||
app_type="wsgi"
|
||||
)</code></pre>
|
||||
|
||||
<h5>Methods</h5>
|
||||
<dl>
|
||||
@@ -150,80 +150,80 @@ manager.mount(
|
||||
<p>Convenience functions for loading specific framework applications:</p>
|
||||
|
||||
<h4>create_fastapi_app()</h4>
|
||||
<pre><span class="keyword">from</span> pyserve <span class="keyword">import</span> create_fastapi_app
|
||||
<pre><code class="language-python">from pyserve import create_fastapi_app
|
||||
|
||||
app = create_fastapi_app(
|
||||
app_path=<span class="value">"myapp.api:app"</span>,
|
||||
module_path=<span class="value">None</span>,
|
||||
factory=<span class="value">False</span>,
|
||||
factory_args=<span class="value">None</span>
|
||||
)</pre>
|
||||
app_path="myapp.api:app",
|
||||
module_path=None,
|
||||
factory=False,
|
||||
factory_args=None
|
||||
)</code></pre>
|
||||
|
||||
<h4>create_flask_app()</h4>
|
||||
<pre><span class="keyword">from</span> pyserve <span class="keyword">import</span> create_flask_app
|
||||
<pre><code class="language-python">from pyserve import create_flask_app
|
||||
|
||||
app = create_flask_app(
|
||||
app_path=<span class="value">"myapp.web:app"</span>,
|
||||
module_path=<span class="value">None</span>,
|
||||
factory=<span class="value">False</span>,
|
||||
factory_args=<span class="value">None</span>
|
||||
)</pre>
|
||||
app_path="myapp.web:app",
|
||||
module_path=None,
|
||||
factory=False,
|
||||
factory_args=None
|
||||
)</code></pre>
|
||||
<p>Automatically wraps the WSGI app for ASGI compatibility.</p>
|
||||
|
||||
<h4>create_django_app()</h4>
|
||||
<pre><span class="keyword">from</span> pyserve <span class="keyword">import</span> create_django_app
|
||||
<pre><code class="language-python">from pyserve import create_django_app
|
||||
|
||||
app = create_django_app(
|
||||
settings_module=<span class="value">"myproject.settings"</span>,
|
||||
module_path=<span class="value">"/path/to/project"</span>
|
||||
)</pre>
|
||||
settings_module="myproject.settings",
|
||||
module_path="/path/to/project"
|
||||
)</code></pre>
|
||||
<p>Sets <code>DJANGO_SETTINGS_MODULE</code> and returns Django's ASGI application.</p>
|
||||
|
||||
<h4>create_starlette_app()</h4>
|
||||
<pre><span class="keyword">from</span> pyserve <span class="keyword">import</span> create_starlette_app
|
||||
<pre><code class="language-python">from pyserve import create_starlette_app
|
||||
|
||||
app = create_starlette_app(
|
||||
app_path=<span class="value">"myapp:starlette_app"</span>,
|
||||
module_path=<span class="value">None</span>,
|
||||
factory=<span class="value">False</span>,
|
||||
factory_args=<span class="value">None</span>
|
||||
)</pre>
|
||||
app_path="myapp:starlette_app",
|
||||
module_path=None,
|
||||
factory=False,
|
||||
factory_args=None
|
||||
)</code></pre>
|
||||
|
||||
<h3>Usage Example</h3>
|
||||
<p>Complete example mounting multiple applications:</p>
|
||||
|
||||
<pre><span class="keyword">from</span> pyserve <span class="keyword">import</span> (
|
||||
<pre><code class="language-python">from pyserve import (
|
||||
PyServeServer,
|
||||
ASGIMountManager,
|
||||
create_fastapi_app,
|
||||
create_flask_app
|
||||
)
|
||||
|
||||
<span class="comment"># Create mount manager</span>
|
||||
# Create mount manager
|
||||
mounts = ASGIMountManager()
|
||||
|
||||
<span class="comment"># Mount FastAPI</span>
|
||||
api_app = create_fastapi_app(<span class="value">"myapp.api:app"</span>)
|
||||
<span class="keyword">if</span> api_app:
|
||||
mounts.mount(<span class="value">"/api"</span>, app=api_app, name=<span class="value">"api"</span>)
|
||||
# Mount FastAPI
|
||||
api_app = create_fastapi_app("myapp.api:app")
|
||||
if api_app:
|
||||
mounts.mount("/api", app=api_app, name="api")
|
||||
|
||||
<span class="comment"># Mount Flask</span>
|
||||
admin_app = create_flask_app(<span class="value">"myapp.admin:app"</span>)
|
||||
<span class="keyword">if</span> admin_app:
|
||||
mounts.mount(<span class="value">"/admin"</span>, app=admin_app, name=<span class="value">"admin"</span>)
|
||||
# Mount Flask
|
||||
admin_app = create_flask_app("myapp.admin:app")
|
||||
if admin_app:
|
||||
mounts.mount("/admin", app=admin_app, name="admin")
|
||||
|
||||
<span class="comment"># List mounts</span>
|
||||
<span class="keyword">for</span> mount <span class="keyword">in</span> mounts.list_mounts():
|
||||
print(f<span class="value">"Mounted {mount['name']} at {mount['path']}"</span>)</pre>
|
||||
# List mounts
|
||||
for mount in mounts.list_mounts():
|
||||
print(f"Mounted {mount['name']} at {mount['path']}")</code></pre>
|
||||
|
||||
<h3>Error Handling</h3>
|
||||
<p>All loader functions return <code>None</code> on failure and log errors.
|
||||
Check the return value before using:</p>
|
||||
|
||||
<pre>app = create_fastapi_app(<span class="value">"nonexistent:app"</span>)
|
||||
<span class="keyword">if</span> app <span class="keyword">is None</span>:
|
||||
<span class="comment"># Handle error - check logs for details</span>
|
||||
print(<span class="value">"Failed to load application"</span>)</pre>
|
||||
<pre><code class="language-bash">app = create_fastapi_app("nonexistent:app")
|
||||
if app is None:
|
||||
# Handle error - check logs for details
|
||||
print("Failed to load application")</code></pre>
|
||||
|
||||
<h3>WSGI Compatibility</h3>
|
||||
<p>For WSGI applications, pyserve uses adapters in this priority:</p>
|
||||
@@ -233,9 +233,9 @@ admin_app = create_flask_app(<span class="value">"myapp.admin:app"</span>)
|
||||
</ol>
|
||||
|
||||
<p>Install an adapter:</p>
|
||||
<pre>pip install a2wsgi <span class="comment"># recommended</span>
|
||||
<span class="comment"># or</span>
|
||||
pip install asgiref</pre>
|
||||
<pre><code class="language-bash">pip install a2wsgi # recommended
|
||||
# or
|
||||
pip install asgiref</code></pre>
|
||||
|
||||
<div class="note">
|
||||
<strong>See Also:</strong>
|
||||
|
||||
Reference in New Issue
Block a user