forked from mattmakai/fullstackpython.com
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapplication-dependencies.html
More file actions
210 lines (202 loc) · 12 KB
/
application-dependencies.html
File metadata and controls
210 lines (202 loc) · 12 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
<!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: Application Dependencies</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>Application Dependencies</h1>
<p>Application dependencies are the libraries other than your project code
that are required to create and run your application. </p>
<h2>Why are application dependencies important?</h2>
<p>Python web applications are built upon the work done by thousands of open
source programmers. Application dependencies include not only web frameworks but
also libraries for scraping, parsing, processing, analyzing, visualizing,
and myriad other tasks. Python's ecosystem facilitates discovery, retrieval and
installation so applications are easier for developers to create.</p>
<h2>Finding libraries</h2>
<p>Python libraries are stored in a central location known as the
<a href="https://pypi.python.org/pypi">Python Package Index</a> (PyPi). PyPi contains
search functionality with results weighted by usage and relevance based on
keyword terms.</p>
<h2>Isolating application dependencies</h2>
<p>Dependencies are installed separately from system-level packages to prevent
library version conflicts. The most common isolation method is
<a href="http://www.virtualenv.org/en/latest/">virtualenv</a>. Each virtualenv is its
own copy of the Python interpreter and depedencies in the site-packages
directory. To use a virtualenv it must first be created with the virtualenv
command and then activated.</p>
<h2>Downloading and installing Python dependencies</h2>
<p>The recommended way to install Python library dependencies is with the
<a href="http://www.pip-installer.org/en/latest/">pip</a> command when a virtualenv
is activated.</p>
<p>Pip and virtualenv work together and have complementary responsibilities.
Pip downloads and installs application dependencies from the central
<a href="https://pypi.python.org/pypi">PyPi</a> repository. </p>
<h2>requirements.txt</h2>
<p>The pip convention for specifying application dependencies is with a
<a href="http://www.pip-installer.org/en/1.4.1/cookbook.html#requirements-files">requirements.txt</a>
file. When you build a Python web application you should include a
requirements.txt file. </p>
<h3>requirements.txt example with pegged dependencies</h3>
<p>Python projects' dependencies for a web application should be specified in the
requirements.txt with
<a href="https://devcenter.heroku.com/articles/python-pip">pegged dependencies</a> like
the following:</p>
<div class="codehilite"><pre><span class="n">django</span><span class="o">==</span><span class="mf">1.6</span>
<span class="n">bpython</span><span class="o">==</span><span class="mf">0.12</span>
<span class="n">django</span><span class="o">-</span><span class="n">braces</span><span class="o">==</span><span class="mf">0.2.1</span>
<span class="n">django</span><span class="o">-</span><span class="n">model</span><span class="o">-</span><span class="n">utils</span><span class="o">==</span><span class="mf">1.1.0</span>
<span class="n">logutils</span><span class="o">==</span><span class="mf">0.3.3</span>
<span class="n">South</span><span class="o">==</span><span class="mf">0.7.6</span>
<span class="n">requests</span><span class="o">==</span><span class="mf">1.2.0</span>
<span class="n">stripe</span><span class="o">==</span><span class="mf">1.9.1</span>
<span class="n">dj</span><span class="o">-</span><span class="n">database</span><span class="o">-</span><span class="n">url</span><span class="o">==</span><span class="mf">0.2.1</span>
<span class="n">django</span><span class="o">-</span><span class="n">oauth2</span><span class="o">-</span><span class="n">provider</span><span class="o">==</span><span class="mf">0.2.4</span>
<span class="n">djangorestframework</span><span class="o">==</span><span class="mf">2.3.1</span>
</pre></div>
<p>Pegged dependencies with precise version numbers or Git tags are important
because otherwise the latest version of a dependency will be used. While
it may sound good to stay up to date, there's no telling if your application
actually works with the latest versions of all dependencies. Developers should
deliberately upgrade and test to make sure there were no backwards-incompatible
modifications in newer dependency library versions.</p>
<h2>setup.py</h2>
<p>There is another type of dependency specification for Python libraries
known as
<a href="http://stackoverflow.com/questions/1471994/what-is-setup-py">setup.py</a>.
Setup.py is a standard for distributing and installing Python libraries.
If you're building a Python library, such as
<a href="http://www.python-requests.org/en/latest/">requests</a> or
<a href="https://github.com/makaimc/underwear">underwear</a> you must include setup.py
so a dependency manager can correctly install both the library as well as
additional dependencies for the library. There's still quite a bit of
confusion in the Python community over the difference between
requirements.txt and setup.py, so read this
<a href="https://caremad.io/blog/setup-vs-requirement/">well written post</a> for
further clarification.</p>
<h2>Application dependency resources</h2>
<ul>
<li>
<p><a href="https://twitter.com/jonathanchu">Jon Chu</a> wrote a great introduction on
<a href="http://www.jontourage.com/2011/02/09/virtualenv-pip-basics/">virtualenv and pip basics</a>.</p>
</li>
<li>
<p>"<a href="http://dabapps.com/blog/introduction-to-pip-and-virtualenv-python/">A non-magical introduction to virtualenv and pip</a>
breaks down what problems these tools solve and how to use them.</p>
</li>
<li>
<p><a href="http://www.clemesha.org/blog/modern-python-hacker-tools-virtualenv-fabric-pip/">Tools of the modern Python hacker</a>
contains detailed explanations of virtualenv, Fabric, and pip.</p>
</li>
<li>
<p>Occasionally arguments about using Python's dependency manager versus
one of Linux's depenency managers comes up. This provides
<a href="http://notes.pault.ag/debian-python/">one perspective on that debate</a>.</p>
</li>
</ul>
<br/>
Next read the
<a href="/cascading-style-sheets.html">cascading style sheets</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 ">Web Frameworks</a>
<a href="/application-dependencies.html" class="list-group-item active">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>