1
IVLE Dispatch Module Design
2
===========================
7
This is the design for the dispatch module (the top-level app which handles
8
all requests in the web app and passes them on to other apps).
10
Request handling sequence
11
-------------------------
13
The request handling sequence consists of two parts. The first part is
14
dispatch being called. It autonomously performs auth and some housekeeping,
15
and then passes control to another specified app.
17
The second part of request handling is done by the app in question. The object
18
which dispatch passes the app has several methods in it which the app can
19
call. In this way, dispatch code is still used in the second part of the
20
request handling, but it is used passively instead of actively.
22
Finally, dispatch cleans up a little bit (writing footers, etc) when the app
25
1. dispatch loads. It imports config modules, so it has access to
26
admin-configured information about the plugged in apps and other
28
2. Breaks the URL and request data down and builds the IVLE request object
29
(which is higher level than the Apache request object and independent of
30
mod_python). This includes breaking the path into the "first directory"
31
(the app name) and the rest of the path (which is passed to the app as the
33
3. Decides which app to load by looking it up in the app list. If no path is
34
specified, selects the default app (does not redirect just yet). If the
35
app is not found in the app list, throws a 404 error and exits.
36
4. If the app requires authentication, checks the session information to see
37
if a user is logged in. If not, passes control to a special "app" (built
38
into dispatch, but with the same interface as other apps), the login page,
40
5. If no app was specified, performs a redirect to the default app, and
42
6. Passes control to the specified app.
43
7. After the app completes, performs cleanup (such as writing HTML footer).
45
The dispatch also provides several callbacks.
47
The dispatch "request" object could just be the Apache request object, but
48
augmented with additional methods and attributes, and an overridden "write"
51
### Writing callbacks ###
53
One important callback sequence is writing to the output. The dispatch does
54
not provide the app with an Apache request object. This is to ensure that none
55
of the apps are dependent on mod_python (even though dispatch, itself, is).
56
Each app therefore calls the dispatch request object to do all the writing.
58
(Note the apps should be given access to the Apache request object but
59
recommended not to use it. This is so that "exec" can pass it to the executed
62
The writing sequence takes place in two parts: writing the HTTP headers, and
65
The HTTP headers are written by dispatch, not the app. The app just sets
66
fields in the request object, such as "content_type", "title" and
67
"write_html_head_foot". (This is similar to how Apache works but has some
70
When the first actual write call is made, the app looks at the fields and
71
writes out the HTTP headers. The "write_html_head_foot" field, if True, causes
72
dispatch to also write out the IVLE HTML header bar section.
74
When doing the cleanup step, if write_html_head_foot is set, dispatch then
75
writes the HTML footer.
77
The header and footer includes the html and body tags. Therefore, any app
78
which sets "write_html_head_foot" should just write body content, no html or
83
The login screen is a special part of IVLE because it is not part of any
84
specific app, and does not have its own URL (there is no `/login`). It is
85
actually part of the dispatch module.
87
The login screen is displayed instead of whichever page was requested if the
88
app or page requested requires login. It does not navigate away from that page
89
(it keeps the same URL as requested). This is so that once the login is
90
successful, it can reload that URL and be on the requested page.
92
The login screen gracefully handles browsers without JavaScript, giving a nice
93
error message. The other pages won't necessarily be so graceful, as the user
94
is expected to have JavaScript if they passed the login screen.
96
The login interaction will be done with Ajax, because it might as well be.
97
This simplifies the system because the primary (non-ajax) requests do not
98
contain login POSTdata. The login is made to a special url which returns JSON,
99
and sets cookies/sessions. Upon success, the JavaScript itself performs a
100
hard refresh, which then succeeds because the cookie has been set to log in.
102
The login screen has the login box on the right, and displays other system
103
information on the rest of the screen. (This information is stuff the students
104
should probably see once in awhile even though they won't navigate explicitly
105
to it - system and subject announcements, and a random "tip of the day").
107
The IVLE Request object
108
-----------------------
110
The IVLE request object is mostly a wrapper around the Apache request object,
111
but it's a bit higher level and does not depend upon mod_python.
113
The file dispatch/request.py (or documentation generated from it) formally
114
specifies the attributes and methods of this object.