blob: 232c0616d925dc00a6632a847b024a1127e0c8f7 [file] [log] [blame]
Alexandre Vassalottice261952008-05-12 02:31:37 +00001:mod:`socketserver` --- A framework for network servers
Georg Brandl116aa622007-08-15 14:28:22 +00002=======================================================
3
Alexandre Vassalottice261952008-05-12 02:31:37 +00004.. module:: socketserver
Georg Brandl116aa622007-08-15 14:28:22 +00005 :synopsis: A framework for network servers.
6
Raymond Hettinger469271d2011-01-27 20:38:46 +00007**Source code:** :source:`Lib/socketserver.py`
8
9--------------
10
Alexandre Vassalottice261952008-05-12 02:31:37 +000011The :mod:`socketserver` module simplifies the task of writing network servers.
Georg Brandl116aa622007-08-15 14:28:22 +000012
Martin Pantereac17b82016-02-19 03:27:46 +000013There are four basic concrete server classes:
14
15
16.. class:: TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
17
18 This uses the Internet TCP protocol, which provides for
19 continuous streams of data between the client and server.
20 If *bind_and_activate* is true, the constructor automatically attempts to
21 invoke :meth:`~BaseServer.server_bind` and
22 :meth:`~BaseServer.server_activate`. The other parameters are passed to
23 the :class:`BaseServer` base class.
24
25
26.. class:: UDPServer(server_address, RequestHandlerClass, bind_and_activate=True)
27
28 This uses datagrams, which are discrete packets of information that may
29 arrive out of order or be lost while in transit. The parameters are
30 the same as for :class:`TCPServer`.
31
32
33.. class:: UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
34 UnixDatagramServer(server_address, RequestHandlerClass, bind_and_activate=True)
35
36 These more infrequently used classes are similar to the TCP and
37 UDP classes, but use Unix domain sockets; they're not available on
38 non-Unix platforms. The parameters are the same as for
39 :class:`TCPServer`.
40
Georg Brandl116aa622007-08-15 14:28:22 +000041
42These four classes process requests :dfn:`synchronously`; each request must be
43completed before the next request can be started. This isn't suitable if each
44request takes a long time to complete, because it requires a lot of computation,
45or because it returns a lot of data which the client is slow to process. The
46solution is to create a separate process or thread to handle each request; the
47:class:`ForkingMixIn` and :class:`ThreadingMixIn` mix-in classes can be used to
48support asynchronous behaviour.
49
50Creating a server requires several steps. First, you must create a request
51handler class by subclassing the :class:`BaseRequestHandler` class and
Martin Pantereac17b82016-02-19 03:27:46 +000052overriding its :meth:`~BaseRequestHandler.handle` method;
53this method will process incoming
Georg Brandl116aa622007-08-15 14:28:22 +000054requests. Second, you must instantiate one of the server classes, passing it
Martin Panter0cab9c12016-04-13 00:36:52 +000055the server's address and the request handler class. It is recommended to use
56the server in a :keyword:`with` statement. Then call the
Martin Pantereac17b82016-02-19 03:27:46 +000057:meth:`~BaseServer.handle_request` or
58:meth:`~BaseServer.serve_forever` method of the server object to
Robert Collins1ee92832015-07-29 12:52:40 +120059process one or many requests. Finally, call :meth:`~BaseServer.server_close`
Serhiy Storchaka2b57c432018-12-19 08:09:46 +020060to close the socket (unless you used a :keyword:`!with` statement).
Georg Brandl116aa622007-08-15 14:28:22 +000061
62When inheriting from :class:`ThreadingMixIn` for threaded connection behavior,
63you should explicitly declare how you want your threads to behave on an abrupt
Florent Xicluna599d76b2011-11-11 19:56:26 +010064shutdown. The :class:`ThreadingMixIn` class defines an attribute
Georg Brandl116aa622007-08-15 14:28:22 +000065*daemon_threads*, which indicates whether or not the server should wait for
Florent Xicluna599d76b2011-11-11 19:56:26 +010066thread termination. You should set the flag explicitly if you would like
67threads to behave autonomously; the default is :const:`False`, meaning that
68Python will not exit until all threads created by :class:`ThreadingMixIn` have
69exited.
Georg Brandl116aa622007-08-15 14:28:22 +000070
71Server classes have the same external methods and attributes, no matter what
Georg Brandlfceab5a2008-01-19 20:08:23 +000072network protocol they use.
Georg Brandl116aa622007-08-15 14:28:22 +000073
74
75Server Creation Notes
76---------------------
77
78There are five classes in an inheritance diagram, four of which represent
79synchronous servers of four types::
80
81 +------------+
82 | BaseServer |
83 +------------+
84 |
85 v
86 +-----------+ +------------------+
87 | TCPServer |------->| UnixStreamServer |
88 +-----------+ +------------------+
89 |
90 v
91 +-----------+ +--------------------+
92 | UDPServer |------->| UnixDatagramServer |
93 +-----------+ +--------------------+
94
95Note that :class:`UnixDatagramServer` derives from :class:`UDPServer`, not from
96:class:`UnixStreamServer` --- the only difference between an IP and a Unix
97stream server is the address family, which is simply repeated in both Unix
98server classes.
99
Georg Brandl116aa622007-08-15 14:28:22 +0000100
Martin Pantereac17b82016-02-19 03:27:46 +0000101.. class:: ForkingMixIn
102 ThreadingMixIn
Georg Brandl116aa622007-08-15 14:28:22 +0000103
Martin Pantereac17b82016-02-19 03:27:46 +0000104 Forking and threading versions of each type of server can be created
105 using these mix-in classes. For instance, :class:`ThreadingUDPServer`
106 is created as follows::
107
108 class ThreadingUDPServer(ThreadingMixIn, UDPServer):
109 pass
110
111 The mix-in class comes first, since it overrides a method defined in
112 :class:`UDPServer`. Setting the various attributes also changes the
113 behavior of the underlying server mechanism.
114
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)287e6872016-06-03 05:44:47 +0000115 :class:`ForkingMixIn` and the Forking classes mentioned below are
116 only available on POSIX platforms that support :func:`~os.fork`.
Martin Pantereac17b82016-02-19 03:27:46 +0000117
Victor Stinnerdb8189b2018-01-29 12:10:22 +0100118 :meth:`socketserver.ForkingMixIn.server_close` waits until all child
Victor Stinner453bd0b2018-05-24 03:14:44 +0200119 processes complete, except if
120 :attr:`socketserver.ForkingMixIn.block_on_close` attribute is false.
Victor Stinnerdb8189b2018-01-29 12:10:22 +0100121
122 :meth:`socketserver.ThreadingMixIn.server_close` waits until all non-daemon
Victor Stinner453bd0b2018-05-24 03:14:44 +0200123 threads complete, except if
124 :attr:`socketserver.ThreadingMixIn.block_on_close` attribute is false. Use
125 daemonic threads by setting
Victor Stinnerdb8189b2018-01-29 12:10:22 +0100126 :data:`ThreadingMixIn.daemon_threads` to ``True`` to not wait until threads
127 complete.
128
129 .. versionchanged:: 3.7
130
131 :meth:`socketserver.ForkingMixIn.server_close` and
132 :meth:`socketserver.ThreadingMixIn.server_close` now waits until all
133 child processes and non-daemonic threads complete.
Victor Stinner453bd0b2018-05-24 03:14:44 +0200134 Add a new :attr:`socketserver.ForkingMixIn.block_on_close` class
135 attribute to opt-in for the pre-3.7 behaviour.
Victor Stinnerdb8189b2018-01-29 12:10:22 +0100136
137
Martin Pantereac17b82016-02-19 03:27:46 +0000138.. class:: ForkingTCPServer
139 ForkingUDPServer
140 ThreadingTCPServer
141 ThreadingUDPServer
142
143 These classes are pre-defined using the mix-in classes.
144
Georg Brandl116aa622007-08-15 14:28:22 +0000145
146To implement a service, you must derive a class from :class:`BaseRequestHandler`
Martin Pantereac17b82016-02-19 03:27:46 +0000147and redefine its :meth:`~BaseRequestHandler.handle` method.
148You can then run various versions of
Georg Brandl116aa622007-08-15 14:28:22 +0000149the service by combining one of the server classes with your request handler
150class. The request handler class must be different for datagram or stream
151services. This can be hidden by using the handler subclasses
152:class:`StreamRequestHandler` or :class:`DatagramRequestHandler`.
153
154Of course, you still have to use your head! For instance, it makes no sense to
155use a forking server if the service contains state in memory that can be
156modified by different requests, since the modifications in the child process
157would never reach the initial state kept in the parent process and passed to
158each child. In this case, you can use a threading server, but you will probably
159have to use locks to protect the integrity of the shared data.
160
161On the other hand, if you are building an HTTP server where all data is stored
162externally (for instance, in the file system), a synchronous class will
163essentially render the service "deaf" while one request is being handled --
164which may be for a very long time if a client is slow to receive all the data it
165has requested. Here a threading or forking server is appropriate.
166
167In some cases, it may be appropriate to process part of a request synchronously,
168but to finish processing in a forked child depending on the request data. This
169can be implemented by using a synchronous server and doing an explicit fork in
Martin Pantereac17b82016-02-19 03:27:46 +0000170the request handler class :meth:`~BaseRequestHandler.handle` method.
Georg Brandl116aa622007-08-15 14:28:22 +0000171
172Another approach to handling multiple simultaneous requests in an environment
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300173that supports neither threads nor :func:`~os.fork` (or where these are too
174expensive or inappropriate for the service) is to maintain an explicit table of
Charles-François Natali1d29cc52014-03-24 22:25:39 +0000175partially finished requests and to use :mod:`selectors` to decide which
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300176request to work on next (or whether to handle a new incoming request). This is
177particularly important for stream services where each client can potentially be
178connected for a long time (if threads or subprocesses cannot be used). See
179:mod:`asyncore` for another way to manage this.
Georg Brandl116aa622007-08-15 14:28:22 +0000180
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000181.. XXX should data and methods be intermingled, or separate?
182 how should the distinction between class and instance variables be drawn?
Georg Brandl116aa622007-08-15 14:28:22 +0000183
184
185Server Objects
186--------------
187
Martin Pantereac17b82016-02-19 03:27:46 +0000188.. class:: BaseServer(server_address, RequestHandlerClass)
Georg Brandl116aa622007-08-15 14:28:22 +0000189
Benjamin Petersond23f8222009-04-05 19:13:16 +0000190 This is the superclass of all Server objects in the module. It defines the
191 interface, given below, but does not implement most of the methods, which is
Martin Pantereac17b82016-02-19 03:27:46 +0000192 done in subclasses. The two parameters are stored in the respective
193 :attr:`server_address` and :attr:`RequestHandlerClass` attributes.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000194
195
Martin Pantereac17b82016-02-19 03:27:46 +0000196 .. method:: fileno()
Georg Brandl116aa622007-08-15 14:28:22 +0000197
Martin Pantereac17b82016-02-19 03:27:46 +0000198 Return an integer file descriptor for the socket on which the server is
199 listening. This function is most commonly passed to :mod:`selectors`, to
200 allow monitoring multiple servers in the same process.
Georg Brandl116aa622007-08-15 14:28:22 +0000201
202
Martin Pantereac17b82016-02-19 03:27:46 +0000203 .. method:: handle_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000204
Martin Pantereac17b82016-02-19 03:27:46 +0000205 Process a single request. This function calls the following methods in
206 order: :meth:`get_request`, :meth:`verify_request`, and
207 :meth:`process_request`. If the user-provided
208 :meth:`~BaseRequestHandler.handle` method of the
209 handler class raises an exception, the server's :meth:`handle_error` method
210 will be called. If no request is received within :attr:`timeout`
211 seconds, :meth:`handle_timeout` will be called and :meth:`handle_request`
212 will return.
Georg Brandl116aa622007-08-15 14:28:22 +0000213
214
Martin Pantereac17b82016-02-19 03:27:46 +0000215 .. method:: serve_forever(poll_interval=0.5)
Georg Brandl116aa622007-08-15 14:28:22 +0000216
Martin Pantereac17b82016-02-19 03:27:46 +0000217 Handle requests until an explicit :meth:`shutdown` request. Poll for
218 shutdown every *poll_interval* seconds.
219 Ignores the :attr:`timeout` attribute. It
220 also calls :meth:`service_actions`, which may be used by a subclass or mixin
221 to provide actions specific to a given service. For example, the
222 :class:`ForkingMixIn` class uses :meth:`service_actions` to clean up zombie
223 child processes.
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000224
Martin Pantereac17b82016-02-19 03:27:46 +0000225 .. versionchanged:: 3.3
226 Added ``service_actions`` call to the ``serve_forever`` method.
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800227
228
Martin Pantereac17b82016-02-19 03:27:46 +0000229 .. method:: service_actions()
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800230
Martin Pantereac17b82016-02-19 03:27:46 +0000231 This is called in the :meth:`serve_forever` loop. This method can be
232 overridden by subclasses or mixin classes to perform actions specific to
233 a given service, such as cleanup actions.
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800234
Martin Pantereac17b82016-02-19 03:27:46 +0000235 .. versionadded:: 3.3
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000236
Martin Pantereac17b82016-02-19 03:27:46 +0000237 .. method:: shutdown()
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000238
Martin Pantereac17b82016-02-19 03:27:46 +0000239 Tell the :meth:`serve_forever` loop to stop and wait until it does.
amaajemyfren2de7ac92020-03-20 11:03:18 +0300240 :meth:`shutdown` must be called while :meth:`serve_forever` is running in a
241 different thread otherwise it will deadlock.
Georg Brandl116aa622007-08-15 14:28:22 +0000242
243
Martin Pantereac17b82016-02-19 03:27:46 +0000244 .. method:: server_close()
Robert Collins1ee92832015-07-29 12:52:40 +1200245
Martin Pantereac17b82016-02-19 03:27:46 +0000246 Clean up the server. May be overridden.
247
248
249 .. attribute:: address_family
250
251 The family of protocols to which the server's socket belongs.
252 Common examples are :const:`socket.AF_INET` and :const:`socket.AF_UNIX`.
Robert Collins1ee92832015-07-29 12:52:40 +1200253
Robert Collins1ee92832015-07-29 12:52:40 +1200254
Martin Pantereac17b82016-02-19 03:27:46 +0000255 .. attribute:: RequestHandlerClass
Robert Collins1ee92832015-07-29 12:52:40 +1200256
Martin Pantereac17b82016-02-19 03:27:46 +0000257 The user-provided request handler class; an instance of this class is created
258 for each request.
Georg Brandl116aa622007-08-15 14:28:22 +0000259
Georg Brandl116aa622007-08-15 14:28:22 +0000260
Martin Pantereac17b82016-02-19 03:27:46 +0000261 .. attribute:: server_address
Georg Brandl116aa622007-08-15 14:28:22 +0000262
Martin Pantereac17b82016-02-19 03:27:46 +0000263 The address on which the server is listening. The format of addresses varies
264 depending on the protocol family;
265 see the documentation for the :mod:`socket` module
266 for details. For Internet protocols, this is a tuple containing a string giving
267 the address, and an integer port number: ``('127.0.0.1', 80)``, for example.
Georg Brandl116aa622007-08-15 14:28:22 +0000268
Georg Brandl116aa622007-08-15 14:28:22 +0000269
Martin Pantereac17b82016-02-19 03:27:46 +0000270 .. attribute:: socket
Georg Brandl116aa622007-08-15 14:28:22 +0000271
Martin Pantereac17b82016-02-19 03:27:46 +0000272 The socket object on which the server will listen for incoming requests.
Georg Brandl116aa622007-08-15 14:28:22 +0000273
Georg Brandl116aa622007-08-15 14:28:22 +0000274
Martin Pantereac17b82016-02-19 03:27:46 +0000275 The server classes support the following class variables:
Georg Brandl116aa622007-08-15 14:28:22 +0000276
Martin Pantereac17b82016-02-19 03:27:46 +0000277 .. XXX should class variables be covered before instance variables, or vice versa?
Georg Brandl116aa622007-08-15 14:28:22 +0000278
Martin Pantereac17b82016-02-19 03:27:46 +0000279 .. attribute:: allow_reuse_address
Georg Brandl116aa622007-08-15 14:28:22 +0000280
Martin Pantereac17b82016-02-19 03:27:46 +0000281 Whether the server will allow the reuse of an address. This defaults to
282 :const:`False`, and can be set in subclasses to change the policy.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000283
Georg Brandl116aa622007-08-15 14:28:22 +0000284
Martin Pantereac17b82016-02-19 03:27:46 +0000285 .. attribute:: request_queue_size
Georg Brandl116aa622007-08-15 14:28:22 +0000286
Martin Pantereac17b82016-02-19 03:27:46 +0000287 The size of the request queue. If it takes a long time to process a single
288 request, any requests that arrive while the server is busy are placed into a
289 queue, up to :attr:`request_queue_size` requests. Once the queue is full,
290 further requests from clients will get a "Connection denied" error. The default
291 value is usually 5, but this can be overridden by subclasses.
Georg Brandl116aa622007-08-15 14:28:22 +0000292
Georg Brandl116aa622007-08-15 14:28:22 +0000293
Martin Pantereac17b82016-02-19 03:27:46 +0000294 .. attribute:: socket_type
Georg Brandl116aa622007-08-15 14:28:22 +0000295
Martin Pantereac17b82016-02-19 03:27:46 +0000296 The type of socket used by the server; :const:`socket.SOCK_STREAM` and
297 :const:`socket.SOCK_DGRAM` are two common values.
Georg Brandl116aa622007-08-15 14:28:22 +0000298
Georg Brandl116aa622007-08-15 14:28:22 +0000299
Martin Pantereac17b82016-02-19 03:27:46 +0000300 .. attribute:: timeout
Georg Brandl116aa622007-08-15 14:28:22 +0000301
Martin Pantereac17b82016-02-19 03:27:46 +0000302 Timeout duration, measured in seconds, or :const:`None` if no timeout is
303 desired. If :meth:`handle_request` receives no incoming requests within the
304 timeout period, the :meth:`handle_timeout` method is called.
Georg Brandl116aa622007-08-15 14:28:22 +0000305
Georg Brandl116aa622007-08-15 14:28:22 +0000306
Martin Pantereac17b82016-02-19 03:27:46 +0000307 There are various server methods that can be overridden by subclasses of base
308 server classes like :class:`TCPServer`; these methods aren't useful to external
309 users of the server object.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000310
Martin Pantereac17b82016-02-19 03:27:46 +0000311 .. XXX should the default implementations of these be documented, or should
312 it be assumed that the user will look at socketserver.py?
Georg Brandlfceab5a2008-01-19 20:08:23 +0000313
Masayuki Yamamoto7750bde2017-11-19 16:33:37 +0900314 .. method:: finish_request(request, client_address)
Georg Brandlfceab5a2008-01-19 20:08:23 +0000315
Martin Pantereac17b82016-02-19 03:27:46 +0000316 Actually processes the request by instantiating :attr:`RequestHandlerClass` and
317 calling its :meth:`~BaseRequestHandler.handle` method.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000318
Georg Brandl116aa622007-08-15 14:28:22 +0000319
Martin Pantereac17b82016-02-19 03:27:46 +0000320 .. method:: get_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000321
Martin Pantereac17b82016-02-19 03:27:46 +0000322 Must accept a request from the socket, and return a 2-tuple containing the *new*
323 socket object to be used to communicate with the client, and the client's
324 address.
Georg Brandl116aa622007-08-15 14:28:22 +0000325
Georg Brandl116aa622007-08-15 14:28:22 +0000326
Martin Pantereac17b82016-02-19 03:27:46 +0000327 .. method:: handle_error(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000328
Martin Pantereac17b82016-02-19 03:27:46 +0000329 This function is called if the :meth:`~BaseRequestHandler.handle`
330 method of a :attr:`RequestHandlerClass` instance raises
331 an exception. The default action is to print the traceback to
Martin Panterd9108d12016-02-21 08:49:56 +0000332 standard error and continue handling further requests.
333
334 .. versionchanged:: 3.6
335 Now only called for exceptions derived from the :exc:`Exception`
336 class.
Georg Brandl116aa622007-08-15 14:28:22 +0000337
Georg Brandl116aa622007-08-15 14:28:22 +0000338
Martin Pantereac17b82016-02-19 03:27:46 +0000339 .. method:: handle_timeout()
Georg Brandl116aa622007-08-15 14:28:22 +0000340
Martin Pantereac17b82016-02-19 03:27:46 +0000341 This function is called when the :attr:`timeout` attribute has been set to a
342 value other than :const:`None` and the timeout period has passed with no
343 requests being received. The default action for forking servers is
344 to collect the status of any child processes that have exited, while
345 in threading servers this method does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000346
Georg Brandl116aa622007-08-15 14:28:22 +0000347
Martin Pantereac17b82016-02-19 03:27:46 +0000348 .. method:: process_request(request, client_address)
Benjamin Petersond23f8222009-04-05 19:13:16 +0000349
Martin Pantereac17b82016-02-19 03:27:46 +0000350 Calls :meth:`finish_request` to create an instance of the
351 :attr:`RequestHandlerClass`. If desired, this function can create a new process
352 or thread to handle the request; the :class:`ForkingMixIn` and
353 :class:`ThreadingMixIn` classes do this.
Georg Brandlfceab5a2008-01-19 20:08:23 +0000354
Georg Brandl116aa622007-08-15 14:28:22 +0000355
Martin Pantereac17b82016-02-19 03:27:46 +0000356 .. Is there any point in documenting the following two functions?
357 What would the purpose of overriding them be: initializing server
358 instance variables, adding new network families?
Benjamin Petersond23f8222009-04-05 19:13:16 +0000359
Martin Pantereac17b82016-02-19 03:27:46 +0000360 .. method:: server_activate()
Georg Brandl116aa622007-08-15 14:28:22 +0000361
Martin Pantereac17b82016-02-19 03:27:46 +0000362 Called by the server's constructor to activate the server. The default behavior
363 for a TCP server just invokes :meth:`~socket.socket.listen`
364 on the server's socket. May be overridden.
Georg Brandl116aa622007-08-15 14:28:22 +0000365
Benjamin Petersond23f8222009-04-05 19:13:16 +0000366
Martin Pantereac17b82016-02-19 03:27:46 +0000367 .. method:: server_bind()
Georg Brandl116aa622007-08-15 14:28:22 +0000368
Martin Pantereac17b82016-02-19 03:27:46 +0000369 Called by the server's constructor to bind the socket to the desired address.
370 May be overridden.
Georg Brandl116aa622007-08-15 14:28:22 +0000371
Georg Brandl116aa622007-08-15 14:28:22 +0000372
Martin Pantereac17b82016-02-19 03:27:46 +0000373 .. method:: verify_request(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000374
Martin Pantereac17b82016-02-19 03:27:46 +0000375 Must return a Boolean value; if the value is :const:`True`, the request will
376 be processed, and if it's :const:`False`, the request will be denied. This
377 function can be overridden to implement access controls for a server. The
378 default implementation always returns :const:`True`.
Georg Brandl116aa622007-08-15 14:28:22 +0000379
Georg Brandl116aa622007-08-15 14:28:22 +0000380
Martin Panter0cab9c12016-04-13 00:36:52 +0000381 .. versionchanged:: 3.6
382 Support for the :term:`context manager` protocol was added. Exiting the
383 context manager is equivalent to calling :meth:`server_close`.
384
385
Martin Pantereac17b82016-02-19 03:27:46 +0000386Request Handler Objects
387-----------------------
Georg Brandl116aa622007-08-15 14:28:22 +0000388
Martin Pantereac17b82016-02-19 03:27:46 +0000389.. class:: BaseRequestHandler
Georg Brandl116aa622007-08-15 14:28:22 +0000390
Martin Pantereac17b82016-02-19 03:27:46 +0000391 This is the superclass of all request handler objects. It defines
392 the interface, given below. A concrete request handler subclass must
393 define a new :meth:`handle` method, and can override any of
394 the other methods. A new instance of the subclass is created for each
395 request.
Georg Brandl116aa622007-08-15 14:28:22 +0000396
397
Martin Pantereac17b82016-02-19 03:27:46 +0000398 .. method:: setup()
Georg Brandl116aa622007-08-15 14:28:22 +0000399
Martin Pantereac17b82016-02-19 03:27:46 +0000400 Called before the :meth:`handle` method to perform any initialization actions
401 required. The default implementation does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000402
403
Martin Pantereac17b82016-02-19 03:27:46 +0000404 .. method:: handle()
Georg Brandl116aa622007-08-15 14:28:22 +0000405
Martin Pantereac17b82016-02-19 03:27:46 +0000406 This function must do all the work required to service a request. The
407 default implementation does nothing. Several instance attributes are
408 available to it; the request is available as :attr:`self.request`; the client
409 address as :attr:`self.client_address`; and the server instance as
410 :attr:`self.server`, in case it needs access to per-server information.
Georg Brandl116aa622007-08-15 14:28:22 +0000411
Martin Pantereac17b82016-02-19 03:27:46 +0000412 The type of :attr:`self.request` is different for datagram or stream
413 services. For stream services, :attr:`self.request` is a socket object; for
414 datagram services, :attr:`self.request` is a pair of string and socket.
Georg Brandl116aa622007-08-15 14:28:22 +0000415
Georg Brandl116aa622007-08-15 14:28:22 +0000416
Martin Pantereac17b82016-02-19 03:27:46 +0000417 .. method:: finish()
Georg Brandl116aa622007-08-15 14:28:22 +0000418
Martin Pantereac17b82016-02-19 03:27:46 +0000419 Called after the :meth:`handle` method to perform any clean-up actions
420 required. The default implementation does nothing. If :meth:`setup`
421 raises an exception, this function will not be called.
Georg Brandl116aa622007-08-15 14:28:22 +0000422
423
Martin Pantereac17b82016-02-19 03:27:46 +0000424.. class:: StreamRequestHandler
425 DatagramRequestHandler
Georg Brandl116aa622007-08-15 14:28:22 +0000426
Martin Pantereac17b82016-02-19 03:27:46 +0000427 These :class:`BaseRequestHandler` subclasses override the
428 :meth:`~BaseRequestHandler.setup` and :meth:`~BaseRequestHandler.finish`
429 methods, and provide :attr:`self.rfile` and :attr:`self.wfile` attributes.
430 The :attr:`self.rfile` and :attr:`self.wfile` attributes can be
431 read or written, respectively, to get the request data or return data
432 to the client.
Georg Brandl116aa622007-08-15 14:28:22 +0000433
Martin Panter34eeed42016-06-29 10:12:22 +0000434 The :attr:`rfile` attributes of both classes support the
435 :class:`io.BufferedIOBase` readable interface, and
436 :attr:`DatagramRequestHandler.wfile` supports the
437 :class:`io.BufferedIOBase` writable interface.
438
439 .. versionchanged:: 3.6
440 :attr:`StreamRequestHandler.wfile` also supports the
441 :class:`io.BufferedIOBase` writable interface.
442
Georg Brandlb533e262008-05-25 18:19:30 +0000443
444Examples
445--------
446
447:class:`socketserver.TCPServer` Example
448~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
449
450This is the server side::
451
452 import socketserver
453
454 class MyTCPHandler(socketserver.BaseRequestHandler):
455 """
Martin Pantereac17b82016-02-19 03:27:46 +0000456 The request handler class for our server.
Georg Brandlb533e262008-05-25 18:19:30 +0000457
458 It is instantiated once per connection to the server, and must
459 override the handle() method to implement communication to the
460 client.
461 """
462
463 def handle(self):
464 # self.request is the TCP socket connected to the client
465 self.data = self.request.recv(1024).strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200466 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000467 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000468 # just send back the same data, but upper-cased
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800469 self.request.sendall(self.data.upper())
Georg Brandlb533e262008-05-25 18:19:30 +0000470
471 if __name__ == "__main__":
472 HOST, PORT = "localhost", 9999
473
474 # Create the server, binding to localhost on port 9999
Martin Panter0cab9c12016-04-13 00:36:52 +0000475 with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
476 # Activate the server; this will keep running until you
477 # interrupt the program with Ctrl-C
478 server.serve_forever()
Georg Brandlb533e262008-05-25 18:19:30 +0000479
480An alternative request handler class that makes use of streams (file-like
481objects that simplify communication by providing the standard file interface)::
482
483 class MyTCPHandler(socketserver.StreamRequestHandler):
484
485 def handle(self):
486 # self.rfile is a file-like object created by the handler;
487 # we can now use e.g. readline() instead of raw recv() calls
488 self.data = self.rfile.readline().strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200489 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000490 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000491 # Likewise, self.wfile is a file-like object used to write back
492 # to the client
493 self.wfile.write(self.data.upper())
494
495The difference is that the ``readline()`` call in the second handler will call
496``recv()`` multiple times until it encounters a newline character, while the
497single ``recv()`` call in the first handler will just return what has been sent
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800498from the client in one ``sendall()`` call.
Georg Brandlb533e262008-05-25 18:19:30 +0000499
500
501This is the client side::
502
503 import socket
504 import sys
505
506 HOST, PORT = "localhost", 9999
507 data = " ".join(sys.argv[1:])
508
509 # Create a socket (SOCK_STREAM means a TCP socket)
Martin Pantere37fc182016-04-24 04:24:36 +0000510 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
Florent Xicluna023611f2011-10-23 22:40:37 +0200511 # Connect to server and send data
512 sock.connect((HOST, PORT))
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800513 sock.sendall(bytes(data + "\n", "utf-8"))
Georg Brandlb533e262008-05-25 18:19:30 +0000514
Florent Xicluna023611f2011-10-23 22:40:37 +0200515 # Receive data from the server and shut down
516 received = str(sock.recv(1024), "utf-8")
Georg Brandlb533e262008-05-25 18:19:30 +0000517
Florent Xicluna023611f2011-10-23 22:40:37 +0200518 print("Sent: {}".format(data))
519 print("Received: {}".format(received))
Georg Brandlb533e262008-05-25 18:19:30 +0000520
521
522The output of the example should look something like this:
523
Martin Panter1050d2d2016-07-26 11:18:21 +0200524Server:
525
526.. code-block:: shell-session
Georg Brandlb533e262008-05-25 18:19:30 +0000527
528 $ python TCPServer.py
529 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000530 b'hello world with TCP'
Georg Brandlb533e262008-05-25 18:19:30 +0000531 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000532 b'python is nice'
Georg Brandlb533e262008-05-25 18:19:30 +0000533
Martin Panter1050d2d2016-07-26 11:18:21 +0200534Client:
535
536.. code-block:: shell-session
Georg Brandlb533e262008-05-25 18:19:30 +0000537
538 $ python TCPClient.py hello world with TCP
539 Sent: hello world with TCP
Florent Xicluna023611f2011-10-23 22:40:37 +0200540 Received: HELLO WORLD WITH TCP
Georg Brandlb533e262008-05-25 18:19:30 +0000541 $ python TCPClient.py python is nice
542 Sent: python is nice
Florent Xicluna023611f2011-10-23 22:40:37 +0200543 Received: PYTHON IS NICE
Georg Brandlb533e262008-05-25 18:19:30 +0000544
545
546:class:`socketserver.UDPServer` Example
547~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
548
549This is the server side::
550
551 import socketserver
552
553 class MyUDPHandler(socketserver.BaseRequestHandler):
554 """
555 This class works similar to the TCP handler class, except that
556 self.request consists of a pair of data and client socket, and since
557 there is no connection the client address must be given explicitly
558 when sending data back via sendto().
559 """
560
561 def handle(self):
562 data = self.request[0].strip()
563 socket = self.request[1]
Florent Xicluna023611f2011-10-23 22:40:37 +0200564 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000565 print(data)
Georg Brandlb533e262008-05-25 18:19:30 +0000566 socket.sendto(data.upper(), self.client_address)
567
568 if __name__ == "__main__":
Benjamin Peterson20211002009-11-25 18:34:42 +0000569 HOST, PORT = "localhost", 9999
Martin Panter0cab9c12016-04-13 00:36:52 +0000570 with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
571 server.serve_forever()
Georg Brandlb533e262008-05-25 18:19:30 +0000572
573This is the client side::
574
575 import socket
576 import sys
577
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000578 HOST, PORT = "localhost", 9999
Georg Brandlb533e262008-05-25 18:19:30 +0000579 data = " ".join(sys.argv[1:])
580
581 # SOCK_DGRAM is the socket type to use for UDP sockets
582 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
583
584 # As you can see, there is no connect() call; UDP has no connections.
585 # Instead, data is directly sent to the recipient via sendto().
Florent Xicluna023611f2011-10-23 22:40:37 +0200586 sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT))
587 received = str(sock.recv(1024), "utf-8")
Georg Brandlb533e262008-05-25 18:19:30 +0000588
Florent Xicluna023611f2011-10-23 22:40:37 +0200589 print("Sent: {}".format(data))
590 print("Received: {}".format(received))
Georg Brandlb533e262008-05-25 18:19:30 +0000591
592The output of the example should look exactly like for the TCP server example.
593
594
595Asynchronous Mixins
596~~~~~~~~~~~~~~~~~~~
597
598To build asynchronous handlers, use the :class:`ThreadingMixIn` and
599:class:`ForkingMixIn` classes.
600
601An example for the :class:`ThreadingMixIn` class::
602
603 import socket
604 import threading
605 import socketserver
606
607 class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
608
609 def handle(self):
Florent Xicluna023611f2011-10-23 22:40:37 +0200610 data = str(self.request.recv(1024), 'ascii')
Georg Brandlf9926402008-06-13 06:32:25 +0000611 cur_thread = threading.current_thread()
Florent Xicluna023611f2011-10-23 22:40:37 +0200612 response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800613 self.request.sendall(response)
Georg Brandlb533e262008-05-25 18:19:30 +0000614
615 class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
616 pass
617
618 def client(ip, port, message):
Martin Pantere37fc182016-04-24 04:24:36 +0000619 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
620 sock.connect((ip, port))
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800621 sock.sendall(bytes(message, 'ascii'))
Florent Xicluna023611f2011-10-23 22:40:37 +0200622 response = str(sock.recv(1024), 'ascii')
623 print("Received: {}".format(response))
Georg Brandlb533e262008-05-25 18:19:30 +0000624
625 if __name__ == "__main__":
626 # Port 0 means to select an arbitrary unused port
627 HOST, PORT = "localhost", 0
628
629 server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
Martin Panter0cab9c12016-04-13 00:36:52 +0000630 with server:
631 ip, port = server.server_address
Georg Brandlb533e262008-05-25 18:19:30 +0000632
Martin Panter0cab9c12016-04-13 00:36:52 +0000633 # Start a thread with the server -- that thread will then start one
634 # more thread for each request
635 server_thread = threading.Thread(target=server.serve_forever)
636 # Exit the server thread when the main thread terminates
637 server_thread.daemon = True
638 server_thread.start()
639 print("Server loop running in thread:", server_thread.name)
Georg Brandlb533e262008-05-25 18:19:30 +0000640
Martin Panter0cab9c12016-04-13 00:36:52 +0000641 client(ip, port, "Hello World 1")
642 client(ip, port, "Hello World 2")
643 client(ip, port, "Hello World 3")
Georg Brandlb533e262008-05-25 18:19:30 +0000644
Martin Panter0cab9c12016-04-13 00:36:52 +0000645 server.shutdown()
Georg Brandlb533e262008-05-25 18:19:30 +0000646
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000647
Martin Panter1050d2d2016-07-26 11:18:21 +0200648The output of the example should look something like this:
649
650.. code-block:: shell-session
Georg Brandlb533e262008-05-25 18:19:30 +0000651
652 $ python ThreadedTCPServer.py
653 Server loop running in thread: Thread-1
Florent Xicluna023611f2011-10-23 22:40:37 +0200654 Received: Thread-2: Hello World 1
655 Received: Thread-3: Hello World 2
656 Received: Thread-4: Hello World 3
Georg Brandlb533e262008-05-25 18:19:30 +0000657
658
659The :class:`ForkingMixIn` class is used in the same way, except that the server
660will spawn a new process for each request.
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)287e6872016-06-03 05:44:47 +0000661Available only on POSIX platforms that support :func:`~os.fork`.
662