mirror of
				https://github.com/django/daphne.git
				synced 2025-10-31 07:47:25 +03:00 
			
		
		
		
	* Added as_route documentation * Added documentation for client * Improve tests for binding * Changes for client docs * Fix docs indentations at client part * Added missed imports * Small fixes and refs * Fix typos * Fix errors and typos.
		
			
				
	
	
		
			83 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| Routing
 | |
| =======
 | |
| 
 | |
| Routing in Channels is done using a system similar to that in core Django;
 | |
| a list of possible routes is provided, and Channels goes through all routes
 | |
| until a match is found, and then runs the resulting consumer.
 | |
| 
 | |
| The difference comes, however, in the fact that Channels has to route based
 | |
| on more than just URL; channel name is the main thing routed on, and URL
 | |
| path is one of many other optional things you can route on, depending on
 | |
| the protocol (for example, imagine email consumers - they would route on
 | |
| domain or recipient address instead).
 | |
| 
 | |
| The routing Channels takes is just a list of *routing objects* - the three
 | |
| built in ones are ``route``, ``route_class`` and ``include``, but any object
 | |
| that implements the routing interface will work:
 | |
| 
 | |
| * A method called ``match``, taking a single ``message`` as an argument and
 | |
|   returning ``None`` for no match or a tuple of ``(consumer, kwargs)`` if matched.
 | |
| 
 | |
| * A method called ``channel_names``, which returns a set of channel names that
 | |
|   will match, which is fed to the channel layer to listen on them.
 | |
| 
 | |
| The three default routing objects are:
 | |
| 
 | |
| * ``route``: Takes a channel name, a consumer function, and optional filter
 | |
|   keyword arguments.
 | |
| 
 | |
| * ``route_class``: Takes a class-based consumer, and optional filter
 | |
|   keyword arguments. Channel names are taken from the consumer's
 | |
|   ``channel_names()`` method.
 | |
| 
 | |
| * ``include``: Takes either a list or string import path to a routing list,
 | |
|   and optional filter keyword arguments.
 | |
| 
 | |
| .. _filters:
 | |
| 
 | |
| Filters
 | |
| -------
 | |
| 
 | |
| Filtering is how you limit matches based on, for example, URLs; you use regular
 | |
| expressions, like so::
 | |
| 
 | |
|     route("websocket.connect", consumers.ws_connect, path=r"^/chat/$")
 | |
| 
 | |
| .. note::
 | |
|     Unlike Django's URL routing, which strips the first slash of a URL for
 | |
|     neatness, Channels includes the first slash, as the routing system is
 | |
|     generic and not designed just for URLs.
 | |
| 
 | |
| You can have multiple filters::
 | |
| 
 | |
|     route("email.receive", comment_response, to_address=r".*@example.com$", subject="^reply")
 | |
| 
 | |
| Multiple filters are always combined with logical AND; that is, you need to
 | |
| match every filter to have the consumer called.
 | |
| 
 | |
| Filters can capture keyword arguments to be passed to your function or your class based consumer methods as a ``kwarg``::
 | |
|     
 | |
|     route("websocket.connect", connect_blog, path=r'^/liveblog/(?P<slug>[^/]+)/stream/$')
 | |
| 
 | |
| You can also specify filters on an ``include``::
 | |
|     
 | |
|     include("blog_includes", path=r'^/liveblog')
 | |
| 
 | |
| When you specify filters on ``include``, the matched portion of the attribute
 | |
| is removed for matches inside the include; for example, this arrangement
 | |
| matches URLs like ``/liveblog/stream/``, because the outside ``include``
 | |
| strips off the ``/liveblog`` part it matches before passing it inside::
 | |
| 
 | |
|     inner_routes = [
 | |
|         route("websocket.connect", connect_blog, path=r'^/stream/'),
 | |
|     ]
 | |
| 
 | |
|     routing = [
 | |
|         include(inner_routes, path=r'^/liveblog')
 | |
|     ]
 | |
| 
 | |
| You can also include named capture groups in the filters on an include and
 | |
| they'll be passed to the consumer just like those on ``route``; note, though,
 | |
| that if the keyword argument names from the ``include`` and the ``route``
 | |
| clash, the values from ``route`` will take precedence.
 |