forked from mattmakai/fullstackpython.com
-
Notifications
You must be signed in to change notification settings - Fork 0
/
web-frameworks.html
258 lines (251 loc) · 17 KB
/
web-frameworks.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
<!DOCTYPE html>
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Full Stack Python shows how an entire Python web application is built and deployed. Each section of the guide explains a different key concept, from the server through the Python WSGI web framework to the front end JavaScript.">
<meta name="author" content="Matt Makai">
<link rel="shortcut icon" href="theme/img/full-stack-python-logo-bw.png">
<title>Full Stack Python</title>
<!-- Bootstrap core CSS -->
<link href="theme/css/fsp.css" rel="stylesheet">
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<style>
html,
body {
font-size: 18px;
color: #222;
background: #fefefe;
}
body {
padding-top: 30px;
}
.footer {
padding: 20px 0 30px 0;
}
a, a:hover {border-bottom: 1px dotted; color: #444;}
a:hover {text-decoration: none; color: #000;}
.logo-title {font-size: 56px; color: #403072; padding-top: 80px;
font-family: "News Cycle", "Arial Narrow Bold", sans-serif;
font-weight: bold; line-height: 30px; margin-left: 5px;}
.logo-title a, .logo-title a:hover {color: #000; text-decoration: none;
border-bottom: none;}
.logo-title a:hover {color: gray;}
.logo-image {vertical-align: top; border: none;}
a.list-group-item.active {background: #444; border: 1px solid #222;}
a.list-group-item.active:hover {background: #444; border: 1px solid #222;}
#sidebar {margin-top: 30px;}
@media (max-width: 600px) {
.logo-header-section {
margin: 20px 32px 0 0;
}
}
</style>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-19910497-7']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<a href="https://github.com/makaimc/fullstackpython.github.com" class="github">
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
</a>
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="logo-header-section">
<a href="/" style="text-decoration: none; border: none;"><img src="theme/img/full-stack-python-logo-bw.png" height="42" width="42" class="logo-image" /></a>
<span class="logo-title"><a href="/">Full Stack Python</a></span>
</div>
</div>
</div>
<div class="row">
<div class="col-md-8">
<h1>Web Frameworks</h1>
<p>A web application framework is a collection of libraries that
provide functionality to accomplish common operations for the web. These
common operations include:</p>
<ol class="arabic simple">
<li>URL routing</li>
<li>HTML, XML, JSON, and other output format templating</li>
<li>Database manipulation</li>
<li>Security against Cross-site request forgery (CSRF) and other attacks</li>
</ol>
<p>Not all web frameworks include functionality for all of the above
functionality. Frameworks fall somewhere between simply executing a
single use case and attempting to be everything to every developer with
increased complexity.</p>
<p>For example, the Django web application framework includes an
Object-Relational Mapping (ORM) layer that abstracts relational database
read, write, query, and delete operations. However, Django's ORM
cannot work without significant modification on non-relational databases such
<a class="reference external" href="http://www.mongodb.org/">MongoDB</a> and <a class="reference external" href="http://docs.basho.com/">Riak</a>.
Other web frameworks such as Flask and Pyramid are generally easier to
use with non-relational databases by incorporating external Python libraries.
There is a spectrum between minimal functionality with easy extensibility and
including everything in the framework with tight integration.</p>
<div class="section" id="django">
<h2>Django</h2>
<p><a class="reference external" href="http://www.djangoproject.com/">Django</a> is a widely used Python web
application framework with a "batteries-included" philosophy. The principle
behind batteries-included is that the common functionality for building
web applications should come with the framework instead of as a separate
library. For example,
<a class="reference external" href="https://docs.djangoproject.com/en/dev/topics/http/urls/">URL routing</a>, a
<a class="reference external" href="https://docs.djangoproject.com/en/dev/topics/templates/">templating system</a>,
<a class="reference external" href="https://docs.djangoproject.com/en/dev/topics/db/">object-relational mapper</a>,
and a <a class="reference external" href="https://docs.djangoproject.com/en/dev/topics/migrations/">database schema migrations</a>
(as of version 1.7) are all included with the <a class="reference external" href="https://pypi.python.org/pypi/Django/1.6.2">Django library</a>.</p>
<div class="section" id="django-resources">
<h3>Django resources</h3>
<p><a class="reference external" href="http://twoscoopspress.com/products/two-scoops-of-django-1-6">2 Scoops of Django</a>
by Daniel Greenfield and Audrey Roy is well worth the price of admission if
you're serious about learning how to correctly develop Django websites.</p>
<p><a class="reference external" href="http://effectivedjango.com/">Effective Django</a> and
<a class="reference external" href="http://www.tangowithdjango.com/book/">Tango with Django</a> are a great free
introductions to using the most popular Python web framework.</p>
<p>DjangoCon US videos from
<a class="reference external" href="http://www.youtube.com/user/TheOpenBastion/videos">2013</a>,
<a class="reference external" href="http://pyvideo.org/category/23/djangocon-2012">2012</a>,
<a class="reference external" href="http://pyvideo.org/category/3/djangocon-2011">2011</a>, as well as
<a class="reference external" href="http://pyvideo.org/category">earlier US and DjangoCon EU conferences</a> are
all available free of charge.</p>
<p>The <a class="reference external" href="http://www.reddit.com/r/django">Django subreddit</a> often has links to
the latest resources for learning Django.</p>
<p>Lincoln Loop wrote a
<a class="reference external" href="http://lincolnloop.com/django-best-practices/">Django Best Practices guide</a>
for the community.</p>
<p>Steve Losh wrote an incredibly detailed <a class="reference external" href="http://stevelosh.com/blog/2011/06/django-advice/">Django Advice guide</a>.</p>
</div>
</div>
<div class="section" id="flask">
<h2>Flask</h2>
<p><a class="reference external" href="http://flask.pocoo.org/">Flask</a> is a Python microframework deliberately
built with a
<a class="reference external" href="http://flask.pocoo.org/docs/design/">small core and easy extensibility philosophy</a>.
Flask is generally considered more
"<a class="reference external" href="http://stackoverflow.com/questions/58968/what-defines-pythonian-or-pythonic">Pythonic</a>" than Django because Flask web application code is often more
explicit. Flask was also written several years after Django and therefore
learned from the Python community's reactions as the framework evolved.
Jökull Sólberg wrote a great piece articulating to this effect in his
<a class="reference external" href="http://jokull.calepin.co/my-flask-to-django-experience.html">experience switching between Flask and Django</a>.</p>
<div class="section" id="flask-resources">
<h3>Flask resources</h3>
<p>The 18 post series Flask mega tutorial is an absolutely amazing starting
resource:</p>
<ul class="simple">
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world">Part 1: Hello World</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ii-templates">Part 2: Templates</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iii-web-forms">Part 3: Web Forms</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database">Part 4: Database</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins">Part 5: User Logins</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vi-profile-page-and-avatars">Part 6: Profile Page and Avatars</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vii-unit-testing">Part 7: Unit Testing</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-viii-followers-contacts-and-friends">Part 8: Followers, Contacts, and Friends</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ix-pagination">Part 9: Pagination</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-x-full-text-search">Part 10: Full Text Search</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xi-email-support">Part 11: Email Support</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xii-facelift">Part 12: Facelift</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xiii-dates-and-times">Part 13: Dates and Times</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xiv-i18n-and-l10n">Part 14: I18n and L10n</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xv-ajax">Part 15: Ajax</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xvi-debugging-testing-and-profiling">Part 16: Debugging, Testing and Profiling</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xvii-deployment-on-linux-even-on-the-raspberry-pi">Part 17: Deployment on Linux</a></li>
<li><a class="reference external" href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xviii-deployment-on-the-heroku-cloud">Part 18: Deployment on the Heroku Cloud</a></li>
</ul>
<p>Yeah, there are a lot of parts to the series. However, it helps to keep the
complexity contained to small pieces at a time. The whole series is well
worth an in-depth read-through.</p>
<p>The <a class="reference external" href="http://flask.pocoo.org/extensions/">Flask Extensions Registry</a> is a
curated list of the best packages that extend Flask. It's the first location
to look through when you're wondering how to do something that's not in the
core framework.</p>
<p>Great post by Jeff Knupp on <a class="reference external" href="http://www.jeffknupp.com/blog/2014/01/29/productionizing-a-flask-application/">Productionizing a Flask App</a></p>
<p>The Plank & Whittle blog has two posts, one on <a class="reference external" href="http://www.plankandwhittle.com/packaging-a-flask-web-app/">Packaging a Flask web app</a>
and another on <a class="reference external" href="http://www.plankandwhittle.com/packaging-a-flask-app-in-a-debian-package/">Packaging a Flask app in a Debian package</a>
once you've built an app and want to deploy it.</p>
<p>The tuts+ <a class="reference external" href="http://code.tutsplus.com/tutorials/an-introduction-to-pythons-flask-framework--net-28822">Flask tutorial</a>
is another great walkthrough for getting started with the framework.</p>
</div>
</div>
<div class="section" id="web-framework-logging">
<h2>Web Framework Logging</h2>
<p>Logging is a common mechanism for monitoring web applications written with a
web framework. Runtime exceptions that prevent code from running are
important to log to investigate and fix the source of the problems.
Informational and debugging logging also helps to understand how the
application is performing even if code is working as intended.</p>
<p>Logging is often grouped into several categories:</p>
<ol class="arabic simple">
<li>Information</li>
<li>Debug</li>
<li>Warning</li>
<li>Error</li>
</ol>
<p>Logging errors that occur while a web framework is running is crucial to
understanding how your application is performing.
<a class="reference external" href="http://raven.readthedocs.org/en/latest/">Raven</a> is a Python client for the
<a class="reference external" href="https://github.com/getsentry/sentry">Sentry</a> exception logging and
aggregation application. Raven provides the way to send exceptions to
Sentry, which should be deployed on a separate server from your production
infrastructure. Raven can also be used by Python scripts to send other
log data to Sentry for aggregation. Sentry provides a clean web application
interface for viewing the exceptions. Sentry can also be configured with a
mail plugin to send emails when exceptions occur.</p>
<div class="section" id="web-framework-resources">
<h3>Web Framework Resources</h3>
<p><a class="reference external" href="http://bottlepy.org/docs/dev/">Bottle</a>,
<a class="reference external" href="http://www.pylonsproject.org/">Pyramid</a>,
<a class="reference external" href="http://falconframework.org/">Falcon</a>,
<a class="reference external" href="http://webpy.org/">web.py</a> are the most common Python web frameworks other
than Django and Flask.</p>
</div>
</div>
<br/>
Next read the
<a href="/task-queues.html">task queues</a> section.
</div>
<div class="col-md-offset-1 col-md-3" id="sidebar">
<div class="list-group">
<a href="/introduction.html" class="list-group-item ">Introduction</a>
<a href="/servers.html" class="list-group-item ">Servers</a>
<a href="/operating-systems.html" class="list-group-item ">Operating Systems</a>
<a href="/web-servers.html" class="list-group-item ">Web Servers</a>
<a href="/platform-as-a-service.html" class="list-group-item ">Platform-as-a-service</a>
<a href="/databases.html" class="list-group-item ">Databases</a>
<a href="/wsgi-servers.html" class="list-group-item ">WSGI Servers</a>
<a href="/web-frameworks.html" class="list-group-item active">Web Frameworks</a>
<a href="/task-queues.html" class="list-group-item ">Task Queues</a>
<a href="/static-content.html" class="list-group-item ">Static Content</a>
<a href="/caching.html" class="list-group-item ">Caching</a>
<a href="/web-browsers.html" class="list-group-item ">Web Browsers</a>
<a href="/web-application-security.html" class="list-group-item ">Web Application Security</a>
<a href="/monitoring.html" class="list-group-item ">Monitoring</a>
<a href="/web-analytics.html" class="list-group-item ">Web Analytics</a>
<a href="/api-integration.html" class="list-group-item ">API Integration</a>
<a href="/source-control.html" class="list-group-item ">Source Control</a>
<a href="/configuration-management.html" class="list-group-item ">Configuration Management</a>
<a href="/dependency-management.html" class="list-group-item ">Application Dependencies</a>
<a href="/no-sql-datastore.html" class="list-group-item ">NoSQL Data Stores</a>
<a href="/about-author.html" class="list-group-item ">About</a>
<a href="/change-log.html" class="list-group-item ">Change Log</a>
</div>
</div></div>
<hr/>
<div class="footer pull-right">
<a href="http://www.mattmakai.com/" class="underline">Matt Makai</a> 2014
</div>
</div>
<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
<script src="theme/js/bootstrap.min.js"></script>
</body>
</html>