{% extends "asyncdocs/base.html" %} {% load static %} {% load asyncdocs_extras %} {% block title %}{{ spec.title|default:slug }} — Async API Docs{% endblock %} {% block topbar_extra %} {% if spec %} v{{ spec.version }} AsyncAPI {{ spec.asyncapi_version }} {% endif %} {% endblock %} {% block topbar_right %} {% if spec %} Raw (YAML) Raw (JSON) {% endif %} {% endblock %} {% block body %} {% if spec_error %}

This spec failed to parse

{{ slug }}: {{ spec_error }}

Run python manage.py asyncdocs_check to validate every registered spec.

{% else %}

{{ spec.description }}

Servers

{% for name, server in spec.servers.items %}
{{ server.protocol }} {{ server.url }} {{ server.description }}
{% endfor %}

1 · Authorize

No token yet.
{% if login_url %}

Posts {identifier, password} to {{ login_url }} and expects {"access": "..."} back. The token is held in a JS variable for this tab only — never written to localStorage/sessionStorage/a URL — and is always shown masked below.

{% else %}

No login_url configured for this spec — paste a token directly.

{% endif %}
{% for channel in spec.channels %}
{% with idx=forloop.counter0|stringformat:"s" %}{% with elem_id="adocs-channel-data-"|add:idx %}{{ channel|json_script:elem_id }}{% endwith %}{% endwith %}

2 · Connect

{{ channel.action }} {{ channel.path }} idle

{{ channel.summary }}

{% if channel.query_params %}
{% for param in channel.query_params %} {% endfor %}

A field named exactly token auto-fills from step 1 once you authorize.

{% endif %} {% if channel.action == "publish" %}

This operation is described as an inbound message to the application (a "publish" channel) — Connect still opens the same socket so you can observe whatever the server sends, if anything; it does not send a frame on your behalf (see "3 · Make a frame arrive" below).

{% endif %}

Message log

0 frames

Nothing yet — authorize, connect, then trigger a test action below.

Query parameters

{% if channel.query_params %}
{% for param in channel.query_params %} {% endfor %}
NameTypeRequiredDescription
{{ param.name }} {{ param.type }} {% if param.required %}REQUIRED{% endif %} {{ param.description }}
{% else %}

This channel declares no connection query parameters.

{% endif %}
{% if channel.close_codes %}

Close codes

{% for cc in channel.close_codes %}
{{ cc.code }} {{ cc.reason }} {% if cc.visible_to_browsers %} visible to browsers {% else %} not visible to browsers {% endif %}

{{ cc.detail }}

{% endfor %}
{% endif %}

Message — {{ channel.message.title }}

{{ channel.message.description }}

Payload

{% for name, prop in channel.message.payload.properties.items %} {% endfor %}
FieldTypeDescription
{{ name }} {{ prop.type }}{% if prop.format %} ({{ prop.format }}){% endif %}{% if prop.nullable %}, nullable{% endif %} {% if prop.required %}REQUIRED{% endif %} {% if prop.readOnly %}read-only{% endif %} {% if prop.enum %}one of: {% for v in prop.enum %}{{ v }}{% if not forloop.last %}, {% endif %}{% endfor %}
{% endif %} {{ prop.description }}
{% if channel.message.examples %}

Examples

{% for example in channel.message.examples %}
{{ example.name }}{{ example.summary }}
{{ example.payload_json }}
{% endfor %}
{% endif %}
{% endfor %}

3 · Make a frame arrive

{% if action_urls %}
{% for name, url in action_urls.items %} {% endfor %}

Each button POSTs to <slug>/actions/<name>/ with a CSRF header. A 429 (rate-limited) or an error from the action itself is logged distinctly, in whichever channel's log is currently visible.

{% else %}

No test actions are registered for this spec (ASYNC_DOCS["SPECS"]["{{ slug }}"]["actions"] is empty).

{% endif %}
{% csrf_token %}
{% endif %} {% endblock %} {% block extra_js %} {% endblock %}