~dkuhlman/python-training-materials/Materials

« back to all changes in this revision

Viewing changes to Code_python/DocServer/docserver.html

  • Committer: Dave Kuhlman
  • Date: 2015-10-03 18:25:17 UTC
  • mfrom: (35.1.5 Materials)
  • Revision ID: dkuhlman@davekuhlman.org-20151003182517-b2m7eltjdapw46zh
Review for Cisco.  Merged checkpoint 10

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?xml version="1.0" encoding="utf-8" ?>
 
2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
3
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 
4
<head>
 
5
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 
6
<meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" />
 
7
<title>Document server</title>
 
8
<style type="text/css">
 
9
 
 
10
/* css */
 
11
 
 
12
body {
 
13
  font: 90% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;
 
14
  background: #ffffff;
 
15
  color: black;
 
16
  margin: 2em;
 
17
  padding: 2em;
 
18
}
 
19
 
 
20
a[href] {
 
21
  color: #436976;
 
22
  background-color: transparent;
 
23
}
 
24
 
 
25
a.toc-backref {
 
26
  text-decoration: none;
 
27
}
 
28
 
 
29
h1 a[href] {
 
30
  text-decoration: none;
 
31
  color: #fcb100;
 
32
  background-color: transparent;
 
33
}
 
34
 
 
35
a.strong {
 
36
  font-weight: bold;
 
37
}
 
38
 
 
39
img {
 
40
  margin: 0;
 
41
  border: 0;
 
42
}
 
43
 
 
44
p {
 
45
  margin: 0.5em 0 1em 0;
 
46
  line-height: 1.5em;
 
47
}
 
48
p a {
 
49
  text-decoration: underline;
 
50
}
 
51
p a:visited {
 
52
  color: purple;
 
53
  background-color: transparent;
 
54
}
 
55
p a:active {
 
56
  color: red;
 
57
  background-color: transparent;
 
58
}
 
59
a:hover {
 
60
  text-decoration: none;
 
61
}
 
62
p img {
 
63
  border: 0;
 
64
  margin: 0;
 
65
}
 
66
 
 
67
h1, h2, h3, h4, h5, h6 {
 
68
  color: #003a6b;
 
69
  background-color: transparent;
 
70
  font: 100% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;
 
71
  margin: 0;
 
72
  padding-top: 0.5em;
 
73
}
 
74
 
 
75
h1 {
 
76
  font-size: 160%;
 
77
  margin-bottom: 0.5em;
 
78
  border-bottom: 1px solid #fcb100;
 
79
}
 
80
h2 {
 
81
  font-size: 140%;
 
82
  margin-bottom: 0.5em;
 
83
  border-bottom: 1px solid #aaa;
 
84
}
 
85
h3 {
 
86
  font-size: 130%;
 
87
  margin-bottom: 0.5em;
 
88
  text-decoration: underline;
 
89
}
 
90
h4 {
 
91
  font-size: 110%;
 
92
  font-weight: bold;
 
93
}
 
94
h5 {
 
95
  font-size: 100%;
 
96
  font-weight: bold;
 
97
}
 
98
h6 {
 
99
  font-size: 80%;
 
100
  font-weight: bold;
 
101
}
 
102
 
 
103
ul a, ol a {
 
104
  text-decoration: underline;
 
105
}
 
106
 
 
107
dt {
 
108
  font-weight: bold;
 
109
}
 
110
dt a {
 
111
  text-decoration: none;
 
112
}
 
113
 
 
114
dd {
 
115
  line-height: 1.5em;
 
116
  margin-bottom: 1em;
 
117
}
 
118
 
 
119
legend {
 
120
  background: #ffffff;
 
121
  padding: 0.5em;
 
122
}
 
123
 
 
124
form {
 
125
  margin: 0;
 
126
}
 
127
 
 
128
 
 
129
dl.form {
 
130
  margin: 0;
 
131
  padding: 1em;
 
132
}
 
133
 
 
134
dl.form dt {
 
135
  width: 30%;
 
136
  float: left;
 
137
  margin: 0;
 
138
  padding: 0 0.5em 0.5em 0;
 
139
  text-align: right;
 
140
}
 
141
 
 
142
input {
 
143
  font: 100% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;
 
144
  color: black;
 
145
  background-color: white;
 
146
  vertical-align: middle;
 
147
}
 
148
 
 
149
abbr, acronym, .explain {
 
150
  color: black;
 
151
  background-color: transparent;
 
152
}
 
153
 
 
154
q, blockquote {
 
155
}
 
156
 
 
157
code, pre {
 
158
  font-family: monospace;
 
159
  font-size: 1.2em;
 
160
  display: block;
 
161
  padding: 10px;
 
162
  border: 1px solid #838183;
 
163
  background-color: #eee;
 
164
  color: #000;
 
165
  overflow: auto;
 
166
  margin: 0.5em 1em;
 
167
}
 
168
 
 
169
div.admonition, div.attention, div.caution, div.danger, div.error,
 
170
div.hint, div.important, div.note, div.tip, div.warning {
 
171
  margin: 2em ;
 
172
  border: medium outset ;
 
173
  padding: 1em }
 
174
 
 
175
div.admonition p.admonition-title, div.hint p.admonition-title,
 
176
div.important p.admonition-title, div.note p.admonition-title,
 
177
div.tip p.admonition-title {
 
178
  font-weight: bold ;
 
179
  font-family: sans-serif }
 
180
 
 
181
div.attention p.admonition-title, div.caution p.admonition-title,
 
182
div.danger p.admonition-title, div.error p.admonition-title,
 
183
div.warning p.admonition-title {
 
184
  color: red ;
 
185
  font-weight: bold ;
 
186
  font-family: sans-serif }
 
187
 
 
188
tt.docutils {
 
189
  background-color: #dddddd;
 
190
}
 
191
 
 
192
ul.auto-toc {
 
193
  list-style-type: none }
 
194
 
 
195
</style>
 
196
</head>
 
197
<body>
 
198
<div class="document" id="document-server">
 
199
<h1 class="title">Document server</h1>
 
200
 
 
201
<div class="section" id="preliminaries">
 
202
<h1>Preliminaries</h1>
 
203
<p>We will be building an application to retrieve and store documents.
 
204
We will implement an access library/module, several servers, and
 
205
several clients.</p>
 
206
<p>The document store is an SQLite relational database.  It is file
 
207
based.</p>
 
208
<p>The document store will contain the following information:</p>
 
209
<ol class="arabic simple">
 
210
<li>The <tt class="docutils literal">documents</tt> table:<ol class="arabic">
 
211
<li>id</li>
 
212
<li>tags</li>
 
213
<li>description</li>
 
214
<li>body -- The document (body) itself.</li>
 
215
</ol>
 
216
</li>
 
217
<li>The <tt class="docutils literal">config</tt> table:<ol class="arabic">
 
218
<li>latest_id</li>
 
219
</ol>
 
220
</li>
 
221
</ol>
 
222
<p>There is a sample database containing a few documents (records) in
 
223
<tt class="docutils literal">./Data/documents01.sqlite</tt>.</p>
 
224
<p>You can create a new, empty database by running
 
225
<tt class="docutils literal">create_doc_database.py</tt>.</p>
 
226
<p>Here are some SQL queries that you will find useful:</p>
 
227
<pre class="literal-block">
 
228
# Get and update config (latest_id).
 
229
sql = 'select latest_id from config'
 
230
sql = 'update config set latest_id={}'.format(new_id)
 
231
#
 
232
# Get id, tags, and description for all documents.
 
233
sql = 'select id, tags, description from documents'
 
234
#
 
235
# Get all fields for a specific document by ID.
 
236
sql = 'select * from documents where id = {}'.format(id)
 
237
#
 
238
# Insert a new document into the database.
 
239
sql = 'insert into documents values ({}, &quot;{}&quot;, &quot;{}&quot;, &quot;{}&quot;)'.format(
 
240
    new_id, tags, description, body)
 
241
</pre>
 
242
</div>
 
243
<div class="section" id="exercises">
 
244
<h1>Exercises</h1>
 
245
<p>Now, do each of the following:</p>
 
246
<ol class="arabic">
 
247
<li><p class="first">Implement a module/library to access and add records to a
 
248
document repository stored in a SQLite relational file/database.
 
249
Support the following API:</p>
 
250
<ul class="simple">
 
251
<li><tt class="docutils literal">list()</tt> -- Provide a list of the ids, tags, and descriptions
 
252
for all the documents/records in the database.</li>
 
253
<li><tt class="docutils literal">get(id)</tt> -- Retrieve a record by ID.</li>
 
254
<li><tt class="docutils literal">search(tag)</tt> -- Return the ids, tags, and descriptions for
 
255
all records whose tags field contains <tt class="docutils literal">tag</tt>.</li>
 
256
<li><tt class="docutils literal">add(tags, description, body)</tt> -- Add a new record to the
 
257
database.</li>
 
258
</ul>
 
259
<p>The file <tt class="docutils literal">create_doc_database.py</tt> can be used to create and
 
260
initialize a new empty SQLite document database file.</p>
 
261
</li>
 
262
<li><p class="first">Implement a REST-ful document server.  Build your server on
 
263
ZeroMQ.</p>
 
264
<p>Your document server should provide these capabilities:</p>
 
265
<ul class="simple">
 
266
<li>Store (save) a document in the data store.  Return a new
 
267
document ID.</li>
 
268
<li>Search for documents and return a set of document IDs (and
 
269
possibly their descriptions).</li>
 
270
<li>Retrieve a document by ID.</li>
 
271
<li>Add a new document given tags, description, and the name of a
 
272
file to store in the database.</li>
 
273
</ul>
 
274
<p>You can find templates for the ZeroMQ parts in
 
275
<tt class="docutils literal">Templates/hwserver.py</tt> and <tt class="docutils literal">Templates/hwclient.py</tt></p>
 
276
</li>
 
277
<li><p class="first">Implement a ZeroMQ client for your document server.  The client
 
278
should be able to perform these functions:</p>
 
279
<ol class="arabic simple">
 
280
<li>Store a new document</li>
 
281
<li>Search a set of documents, given a tag.</li>
 
282
<li>Retrieve a document, given its ID.</li>
 
283
<li>Add a new document, given the tags, description, and name of a
 
284
file to be stored.</li>
 
285
</ol>
 
286
</li>
 
287
<li><p class="first">Implement a command line shell as a client for the document
 
288
store.  Use the <tt class="docutils literal">cmd</tt> module from the standard Python library.
 
289
Your command line shell can either (1) access your library/module
 
290
directly or (2) use your ZeroMQ client.</p>
 
291
<p>In your command line shell, implement the same commands: list,
 
292
search, get, and add.</p>
 
293
</li>
 
294
</ol>
 
295
<ol class="arabic" start="4">
 
296
<li><p class="first">Implement a Web application server that provides access to the
 
297
documents in our document store.  Build your Web application with
 
298
Pyramid.</p>
 
299
<p>Your Web application server should support these operations
 
300
(URLs):</p>
 
301
<pre class="literal-block">
 
302
/help -- Show this help.
 
303
/list -- List all documents.
 
304
/search/{tag} -- Search for and show documents by tag.
 
305
/get/{id} -- Get and show document by ID.
 
306
</pre>
 
307
<p>You can create a starter Pyramid application with the following
 
308
commands:</p>
 
309
<pre class="literal-block">
 
310
$ pcreate --help
 
311
$ pcreate --list
 
312
$ pcreate --scaffold=starter my_doc_server
 
313
$ cd my_doc_server
 
314
$ python setup.py develop
 
315
</pre>
 
316
<p>Now start the server with the following:</p>
 
317
<pre class="literal-block">
 
318
$ pserve development.ini
 
319
</pre>
 
320
<p>Then visit <tt class="docutils literal"><span class="pre">http://localhost:6543</span></tt> in your Web browser to see
 
321
whether your application is good.</p>
 
322
</li>
 
323
</ol>
 
324
<!-- vim:ft=rst: -->
 
325
</div>
 
326
</div>
 
327
<div class="footer">
 
328
<hr class="footer" />
 
329
<a class="reference external" href="docserver.txt">View document source</a>.
 
330
Generated on: 2015-10-03 17:18 UTC.
 
331
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
332
 
 
333
</div>
 
334
</body>
 
335
</html>