forked from mattmakai/fullstackpython.com
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathweb-frameworks.html
More file actions
executable file
·310 lines (304 loc) · 17.3 KB
/
web-frameworks.html
File metadata and controls
executable file
·310 lines (304 loc) · 17.3 KB
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
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
<!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 explains each layer of the web application stack, from the server up through the rendering in a user's browser.">
<meta name="author" content="Matt Makai">
<link rel="shortcut icon" href="theme/img/full-stack-python-logo-bw.png">
<title>Full Stack Python: Web Frameworks</title>
<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 code library that make a developer's life
easier when building reliable, scalable and maintainable web applications.</p>
<h2>Why are web frameworks necessary?</h2>
<p>Web frameworks encapsulate what developers have learned over the past twenty
years while building dynamic web applications. Frameworks make it easier
to reuse code for common HTTP operations and to structure your code so that
it is maintainable.</p>
<h2>Common web framework functionality</h2>
<p>Frameworks provide functionality in their code or through extensions to
perform common operations required to run web applications. These common
operations include:</p>
<ol>
<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 code 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. Some frameworks take the "batteries-included" approach
where everything possible comes bundled with the framework while others
have a minimal code library that plays well with extensions.</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 href="http://www.mongodb.org/">MongoDB</a>.
Some other web frameworks such as Flask and Pyramid are 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>
<h2>Django</h2>
<p><a 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 href="https://docs.djangoproject.com/en/dev/topics/http/urls/">URL routing</a>, a
<a href="https://docs.djangoproject.com/en/dev/topics/templates/">templating system</a>,
<a href="https://docs.djangoproject.com/en/dev/topics/db/">object-relational mapper</a>,
and <a href="https://docs.djangoproject.com/en/dev/topics/migrations/">database schema migrations</a>
(as of version 1.7) are all included with the <a href="https://pypi.python.org/pypi/Django/1.6.2">Django framework</a>.</p>
<h3>Django resources</h3>
<ul>
<li>
<p><a 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>
</li>
<li>
<p><a href="http://effectivedjango.com/">Effective Django</a> and
<a href="http://www.tangowithdjango.com/book/">Tango with Django</a> are a extensive
free introductions to using the most popular Python web framework.</p>
</li>
<li>
<p>DjangoCon US videos from
<a href="http://www.youtube.com/user/TheOpenBastion/videos">2013</a>,
<a href="http://pyvideo.org/category/23/djangocon-2012">2012</a>,
<a href="http://pyvideo.org/category/3/djangocon-2011">2011</a>, as well as<br />
<a href="http://pyvideo.org/category">earlier US and DjangoCon EU conferences</a> are
all available free of charge.</p>
</li>
<li>
<p>The <a href="http://www.reddit.com/r/django">Django subreddit</a> often has links to
the latest resources for learning Django.</p>
</li>
<li>
<p>Lincoln Loop wrote a
<a href="http://lincolnloop.com/django-best-practices/">Django Best Practices guide</a>
for the community.</p>
</li>
<li>
<p>Steve Losh wrote an incredibly detailed <a href="http://stevelosh.com/blog/2011/06/django-advice/">Django Advice guide</a>.</p>
</li>
<li>
<p><a href="https://godjango.com/">GoDjango</a> screencasts and tutorials are free short
videos for learning how to build Django applications.</p>
</li>
</ul>
<h2>Flask</h2>
<p><a href="http://flask.pocoo.org/">Flask</a> is a Python microframework deliberately
built with a
<a href="http://flask.pocoo.org/docs/design/">small core and easy-to-extend philosophy</a>.
Flask is generally considered more
<a 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 href="http://jokull.calepin.co/my-flask-to-django-experience.html">experience switching between Flask and Django</a>.</p>
<h3>Flask resources</h3>
<p>The 18-part Flask mega tutorial is an absolutely amazing starting
resource for using the Flask framework. Yes, there are a lot of posts in
the series. However, each post is focused on a single topic to contain
the complexity while the reader is learning the framework. The whole
series is well worth an in-depth read-through. The
<a href="https://twitter.com/miguelgrinberg">author</a> is also writing the
<a href="http://shop.oreilly.com/product/0636920031116.do">O'Reilly Flask Web Development</a>
book so consider picking that up as well.</p>
<ul>
<li><a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world">Part 1: Hello World</a></li>
<li><a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ii-templates">Part 2: Templates</a></li>
<li><a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iii-web-forms">Part 3: Web Forms</a></li>
<li><a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database">Part 4: Database</a></li>
<li><a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins">Part 5: User Logins</a></li>
<li><a 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 href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vii-unit-testing">Part 7: Unit Testing</a></li>
<li><a 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 href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ix-pagination">Part 9: Pagination</a></li>
<li><a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-x-full-text-search">Part 10: Full Text Search</a></li>
<li><a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xi-email-support">Part 11: Email Support</a></li>
<li><a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xii-facelift">Part 12: Facelift</a></li>
<li><a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xiii-dates-and-times">Part 13: Dates and Times</a></li>
<li><a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xiv-i18n-and-l10n">Part 14: I18n and L10n</a></li>
<li><a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xv-ajax">Part 15: Ajax</a></li>
<li><a 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 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>
<p><a 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></p>
</li>
<li>
<p>The <a 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>
</li>
<li>
<p>Great post by Jeff Knupp on <a href="http://www.jeffknupp.com/blog/2014/01/29/productionizing-a-flask-application/">Productionizing a Flask App</a></p>
</li>
<li>
<p>The Plank & Whittle blog has two posts, one on
<a href="http://www.plankandwhittle.com/packaging-a-flask-web-app/">Packaging a Flask web app</a>
and another on
<a 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>
</li>
<li>
<p>The tuts+ <a 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>
</li>
</ul>
<h2>Bottle</h2>
<p><a href="http://bottlepy.org/docs/dev/index.html">Bottle</a> is a WSGI-compliant
<a href="https://github.com/defnull/bottle/blob/master/bottle.py">single source file</a>
web framework with no external dependencies except for the standard library
included with Python.</p>
<h3>Bottle resources</h3>
<ul>
<li>
<p>The Tutorial on the <a href="http://bottlepy.org/docs/dev/tutorial.html">official Bottle website</a> provides a thorough view of basic concepts and features.</p>
</li>
<li>
<p>Digital Ocean provides an extensive <a href="https://www.digitalocean.com/community/articles/how-to-use-the-bottle-micro-framework-to-develop-python-web-apps">introductory post on Bottle</a>.</p>
</li>
<li>
<p>This tutorial provides a walkthrough for
<a href="http://www.giantflyingsaucer.com/blog/?p=3598">getting started with Bottle</a>.</p>
</li>
<li>
<p>Here's a short code snippet for
<a href="http://myadventuresincoding.wordpress.com/2011/01/02/creating-a-rest-api-in-python-using-bottle-and-mongodb/">creating a REST API with Bottle and MongoDB</a>.</p>
</li>
<li>
<p>Another snippet for
<a href="http://gotofritz.net/blog/weekly-challenge/restful-python-api-bottle/">executing CRUD operations on XML files</a>.</p>
</li>
</ul>
<h2>Web Framework Resources</h2>
<ul>
<li>
<p>"<a href="http://www.jeffknupp.com/blog/2014/03/03/what-is-a-web-framework/">What is a web framework?</a>"
by <a href="https://twitter.com/jeffknupp">Jeff Knupp</a>
is a in-depth explanation of what a web framework is and their relation
to web servers.</p>
</li>
<li>
<p><a href="http://www.pylonsproject.org/">Pyramid</a>,
<a href="http://falconframework.org/">Falcon</a>,
<a href="http://webpy.org/">web.py</a> are the most common Python web frameworks other
than Django, Flask and Bottle.</p>
</li>
<li>
<p>This <a href="http://codecondo.com/14-minimal-web-frameworks-for-python/">roundup of 14 minimal Python frameworks</a>
contains both familiar and less known Python libraries.</p>
</li>
<li>
<p>Good analysis <a href="http://www.slideshare.net/r1chardj0n3s/web-microframework-battle/">on Python micro frameworks</a>
by <a href="http://mechanicalcat.net/richard">Richard Jones</a>, so you can choose the one most suited for your needs.</p>
</li>
</ul>
<br/>
Next read the
<a href="/application-dependencies.html">application dependencies</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="/application-dependencies.html" class="list-group-item ">Application Dependencies</a>
<a href="/cascading-style-sheets.html" class="list-group-item ">Cascading Style Sheets</a>
<a href="/static-content.html" class="list-group-item ">Static Content</a>
<a href="/source-control.html" class="list-group-item ">Source Control</a>
<a href="/caching.html" class="list-group-item ">Caching</a>
<a href="/task-queues.html" class="list-group-item ">Task Queues</a>
<a href="/api-integration.html" class="list-group-item ">API Integration</a>
<a href="/no-sql-datastore.html" class="list-group-item ">NoSQL Data Stores</a>
<a href="/web-application-security.html" class="list-group-item ">Web Security</a>
<a href="/logging.html" class="list-group-item ">Logging</a>
<a href="/monitoring.html" class="list-group-item ">Monitoring</a>
<a href="/configuration-management.html" class="list-group-item ">Configuration Management</a>
<a href="/web-analytics.html" class="list-group-item ">Web Analytics</a>
<a href="/best-python-resources.html" class="list-group-item ">Best Python Resources</a>
<a href="/about-author.html" class="list-group-item ">About the Author</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>