Noun docs changes

This commit is contained in:
Andrew Godwin 2016-05-04 09:20:36 -07:00
parent ea66b6560b
commit 2219546a5d
6 changed files with 31 additions and 19 deletions

View File

@ -13,7 +13,7 @@ And, beyond that, there are plenty of non-critical tasks that applications
could easily offload until after a response has been sent - like saving things could easily offload until after a response has been sent - like saving things
into a cache or thumbnailing newly-uploaded images. into a cache or thumbnailing newly-uploaded images.
Channels changes the way Django runs to be "event oriented" - rather than It changes the way Django runs to be "event oriented" - rather than
just responding to requests, instead Django responds to a wide array of events just responding to requests, instead Django responds to a wide array of events
sent on *channels*. There's still no persistent state - each event handler, sent on *channels*. There's still no persistent state - each event handler,
or *consumer* as we call them, is called independently in a way much like a or *consumer* as we call them, is called independently in a way much like a
@ -26,7 +26,7 @@ Let's look at what *channels* are first.
What is a channel? What is a channel?
------------------ ------------------
The core of Channels is, unsurprisingly, a datastructure called a *channel*. The core of the system is, unsurprisingly, a datastructure called a *channel*.
What is a channel? It is an *ordered*, *first-in first-out queue* with What is a channel? It is an *ordered*, *first-in first-out queue* with
*message expiry* and *at-most-once delivery* to *only one listener at a time*. *message expiry* and *at-most-once delivery* to *only one listener at a time*.

View File

@ -4,9 +4,9 @@ Deploying
Deploying applications using Channels requires a few more steps than a normal Deploying applications using Channels requires a few more steps than a normal
Django WSGI application, but it's not very many. Django WSGI application, but it's not very many.
Firstly, remember that even if you have Channels installed, it's an entirely Firstly, remember that it's an entirely optional part of Django.
optional part of Django. If you leave a project with the default settings If you leave a project with the default settings (no ``CHANNEL_LAYERS``),
(no ``CHANNEL_BACKENDS``), it'll just run and work like a normal WSGI app. it'll just run and work like a normal WSGI app.
When you want to enable channels in production, you need to do three things: When you want to enable channels in production, you need to do three things:
@ -112,7 +112,7 @@ cluster on the backend, see :ref:`wsgi-to-asgi`.
If you want to support WebSockets, long-poll HTTP requests and other Channels If you want to support WebSockets, long-poll HTTP requests and other Channels
features, you'll need to run a native ASGI interface server, as the WSGI features, you'll need to run a native ASGI interface server, as the WSGI
specification has no support for running these kinds of requests concurrently. specification has no support for running these kinds of requests concurrently.
Channels ships with an interface server that we recommend you use called We ship with an interface server that we recommend you use called
`Daphne <http://github.com/andrewgodwin/daphne/>`_; it supports WebSockets, `Daphne <http://github.com/andrewgodwin/daphne/>`_; it supports WebSockets,
long-poll HTTP requests, HTTP/2 *(soon)* and performs quite well. long-poll HTTP requests, HTTP/2 *(soon)* and performs quite well.
Of course, any ASGI-compliant server will work! Of course, any ASGI-compliant server will work!
@ -164,7 +164,7 @@ workers. As long as the new code is session-compatible, you can even do staged
rollouts to make sure workers on new code aren't experiencing high error rates. rollouts to make sure workers on new code aren't experiencing high error rates.
There's no need to restart the WSGI or WebSocket interface servers unless There's no need to restart the WSGI or WebSocket interface servers unless
you've upgraded your version of Channels or changed any settings; you've upgraded the interface server itself or changed any Django settings;
none of your code is used by them, and all middleware and code that can none of your code is used by them, and all middleware and code that can
customize requests is run on the consumers. customize requests is run on the consumers.

View File

@ -19,8 +19,8 @@ with a WSGI-based Django, and your views and static file serving (from
As a very basic introduction, let's write a consumer that overrides the built-in As a very basic introduction, let's write a consumer that overrides the built-in
handling and handles every HTTP request directly. This isn't something you'd handling and handles every HTTP request directly. This isn't something you'd
usually do in a project, but it's a good illustration of how Channels usually do in a project, but it's a good illustration of how channels
underlies even core Django - it's less of an addition and more adding a whole underlie even core Django - it's less of an addition and more adding a whole
new layer under the existing view layer. new layer under the existing view layer.
Make a new project, a new app, and put this in a ``consumers.py`` file in the app:: Make a new project, a new app, and put this in a ``consumers.py`` file in the app::
@ -279,7 +279,7 @@ see :doc:`backends` for more.
The second thing, once we have a networked channel backend set up, is to make The second thing, once we have a networked channel backend set up, is to make
sure we're running an interface server that's capable of serving WebSockets. sure we're running an interface server that's capable of serving WebSockets.
Luckily, installing Channels will also install ``daphne``, an interface server To solve this, Channels comes with ``daphne``, an interface server
that can handle both HTTP and WebSockets at the same time, and then ties this that can handle both HTTP and WebSockets at the same time, and then ties this
in to run when you run ``runserver`` - you shouldn't notice any difference in to run when you run ``runserver`` - you shouldn't notice any difference
from the normal Django ``runserver``, though some of the options may be a little from the normal Django ``runserver``, though some of the options may be a little
@ -471,7 +471,7 @@ Django session ID as part of the URL, like this::
socket = new WebSocket("ws://127.0.0.1:9000/?session_key=abcdefg"); socket = new WebSocket("ws://127.0.0.1:9000/?session_key=abcdefg");
You can get the current session key in a template with ``{{ request.session.session_key }}``. You can get the current session key in a template with ``{{ request.session.session_key }}``.
Note that Channels can't work with signed cookie sessions - since only HTTP Note that this can't work with signed cookie sessions - since only HTTP
responses can set cookies, it needs a backend it can write to to separately responses can set cookies, it needs a backend it can write to to separately
store state. store state.
@ -479,7 +479,7 @@ store state.
Routing Routing
------- -------
Channels' ``routing.py`` acts very much like Django's ``urls.py``, including the The ``routing.py`` file acts very much like Django's ``urls.py``, including the
ability to route things to different consumers based on ``path``, or any other ability to route things to different consumers based on ``path``, or any other
message attribute that's a string (for example, ``http.request`` messages have message attribute that's a string (for example, ``http.request`` messages have
a ``method`` key you could route based on). a ``method`` key you could route based on).
@ -508,7 +508,7 @@ routing our chat from above::
include(http_routing), include(http_routing),
] ]
Channels will resolve the routing in order, short-circuiting around the The routing is resolved in order, short-circuiting around the
includes if one or more of their matches fails. You don't have to start with includes if one or more of their matches fails. You don't have to start with
the ``^`` symbol - we use Python's ``re.match`` function, which starts at the the ``^`` symbol - we use Python's ``re.match`` function, which starts at the
start of a line anyway - but it's considered good practice. start of a line anyway - but it's considered good practice.
@ -624,7 +624,7 @@ same effect if someone tried to request a view before the login view had finishe
processing, but there you're not expecting that page to run after the login, processing, but there you're not expecting that page to run after the login,
whereas you'd naturally expect ``receive`` to run after ``connect``. whereas you'd naturally expect ``receive`` to run after ``connect``.
Channels has a solution - the ``enforce_ordering`` decorator. All WebSocket Channels has a solution - the ``enforce_ordering`` decorator. All WebSocket
messages contain an ``order`` key, and this decorator uses that to make sure that messages contain an ``order`` key, and this decorator uses that to make sure that
messages are consumed in the right order, in one of two modes: messages are consumed in the right order, in one of two modes:
@ -695,6 +695,6 @@ to manage logical sets of channels, and how Django's session and authentication
systems easily integrate with WebSockets. systems easily integrate with WebSockets.
We recommend you read through the rest of the reference documentation to see We recommend you read through the rest of the reference documentation to see
all of what Channels has to offer; in particular, you may want to look at more about what you can do with channels; in particular, you may want to look at
our :doc:`deploying` and :doc:`scaling` resources to get an idea of how to our :doc:`deploying` and :doc:`scaling` resources to get an idea of how to
design and run apps in production environments. design and run apps in production environments.

View File

@ -6,9 +6,10 @@ Reference
Consumers Consumers
--------- ---------
When you configure channel routing, Channels expects the object assigned to When you configure channel routing, the object assigned to a channel
a channel to be a callable that takes exactly one positional argument, here should be a callable that takes exactly one positional argument, here
called ``message``. This is a :ref:`message object <ref-message>`. called ``message``, which is a :ref:`message object <ref-message>`. A consumer
is any callable that fits this definition.
Consumers are not expected to return anything, and if they do, it will be Consumers are not expected to return anything, and if they do, it will be
ignored. They may raise ``channels.exceptions.ConsumeLater`` to re-insert ignored. They may raise ``channels.exceptions.ConsumeLater`` to re-insert

View File

@ -6,7 +6,7 @@ realize that you can't use the standard Django test client to submit fake HTTP
requests - instead, you'll need to submit fake Messages to your consumers, requests - instead, you'll need to submit fake Messages to your consumers,
and inspect what Messages they send themselves. and inspect what Messages they send themselves.
Channels comes with a ``TestCase`` subclass that sets all of this up for you, We provide a ``TestCase`` subclass that sets all of this up for you,
however, so you can easily write tests and check what your consumers are sending. however, so you can easily write tests and check what your consumers are sending.

View File

@ -142,6 +142,17 @@ docs_transforms = global_transforms + [
Replacement(r":doc:`([\w\d\s]+) <asgi>`", r"`\1 <http://channels.readthedocs.org/en/latest/asgi.html>`_"), Replacement(r":doc:`([\w\d\s]+) <asgi>`", r"`\1 <http://channels.readthedocs.org/en/latest/asgi.html>`_"),
Replacement(r"\n\(.*installation>`\)\n", r""), Replacement(r"\n\(.*installation>`\)\n", r""),
Replacement(r":doc:`installed Channels correctly <installation>`", r"added the channel layer setting"), Replacement(r":doc:`installed Channels correctly <installation>`", r"added the channel layer setting"),
Replacement(r"Channels", r"channels"),
Replacement(r"Started with channels", r"Started with Channels"),
Replacement(r"Running with channels", r"Running with Channels"),
Replacement(r"channels consumers", r"channel consumers"),
Replacement(r"channels' design", r"The channels design"),
Replacement(r"channels is being released", r"Channels is being released"),
Replacement(r"channels is", r"channels are"),
Replacement(r"channels provides a", r"Channels provides a"),
Replacement(r"channels can use", r"Channels can use"),
Replacement(r"channels Concepts", r"Channels Concepts"),
Replacement(r"channels works", r"channels work"),
] ]