aboutsummaryrefslogtreecommitdiff
path: root/files/zh-tw/learn/server-side/django/introduction/index.html
blob: 7a9d2f72817e06df0e23b6ce5f0662be6f6e1ffa (plain)
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
---
title: Django 介紹
slug: Learn/Server-side/Django/Introduction
translation_of: Learn/Server-side/Django/Introduction
---
<div>{{LearnSidebar}}</div>

<div>{{NextMenu("Learn/Server-side/Django/development_environment", "Learn/Server-side/Django")}}</div>

<p class="summary"> 在這第一篇Django文章中,我們將回答“什麼是Django”這個問題,並概述這個網絡框架有什麼特性。我們將描述主要功能,包括一些高級功能,但我們並不會在本單元中詳細介紹。我們還會展示一些Django應用程序的主要構建模塊(儘管此時你還沒有要測試的開發環境)。</p>

<table class="learn-box standard-table">
 <tbody>
  <tr>
   <th scope="row">先備知識:</th>
   <td>基本的電腦知識.對<a href="https://developer.mozilla.org/en-US/docs/Learn/Server-side/First_steps">服務器端網站編程的一般了解</a> ,特別是<a href="https://developer.mozilla.org/en-US/docs/Learn/Server-side/First_steps/Client-Server_overview">網站中客戶端-服務器交互的機制</a> .</td>
  </tr>
  <tr>
   <th scope="row">目標:</th>
   <td>了解Django是什麼,它提供了哪些功能,以及Django應用程序的主要構建塊。</td>
  </tr>
 </tbody>
</table>

<h2 id="什麼是_Django">什麼是 Django?</h2>

<p>Django 是一個高級的 Python 網路框架,可以快速開發安全和可維護的網站。由經驗豐富的開發者構建,Django 負責處理網站開發中麻煩的部分,因此你可以專注於編寫應用程序,而無需重新開發。</p>

<p>它是免費和開源的,有活躍繁榮的社區、豐富的文檔、以及很多免費和付費的解決方案。</p>

<p>Django 可以使你的應用具有以下優點:</p>

<dl>
 <dt>完備</dt>
 <dd>Django 遵循 “功能完備” 的理念,提供開發人員可能想要 “開箱即用” 的幾乎所有功能。因為你需要的一切,都是一個 ”產品“ 的一部分,它們都可以無縫結合在一起,遵循一致性設計原則,並且具有廣泛、和<a href="https://docs.djangoproject.com/en/2.0/">最新的文檔</a></dd>
 <dt>通用</dt>
 <dd>
 <p>Django 可以(並已經)用於構建幾乎任何類型的網站—從內容管理系統和維基,到社交網絡和新聞網站。它可以與任何客戶端框架一起工作,並且可以提供幾乎任何格式(包括 HTML、RSS、JSON、XML等)的內容。你正在閱讀的網站就是基於 Django。</p>

 <p>在內部,儘管它為幾乎所有可能需要的功能(例如幾個流行的資料庫,模版引擎等)提供了選擇,但是如果需要,它也可以擴展到使用其他組件。</p>
 </dd>
 <dt>安全</dt>
 <dd>
 <p>Django 幫助開發人員,通過提供一個被設計為 “做正確的事情” 來自動保護網站的框架,來避免許多常見的安全錯誤。例如,Django 提供了一種安全的方式,來管理用戶帳號和密碼,避免了常見的錯誤,比如將 session 放在 cookie 中這種易受攻擊的做法(取而代之的是,cookies 只包含一個密鑰,實際數據存儲在數據庫中),或直接存儲密碼,而不是密碼的 hash 值。</p>

 <p>密碼 hash ,是讓密碼通過加密 hash 函數,而創建的固定長度值。 Django 能通過運行 hash 函數,來檢查輸入的密碼 - 就是將輸出的 hash 值,與存儲的 hash 值進行比較是否正確。然而由於功能的 “單向” 性質,假使存儲的 hash 值受到威脅,攻擊者也難以解出原始密碼。 (但其實有彩虹表-譯者觀點)</p>

 <p>默認情況下,Django 可以防範許多漏洞,包括 SQL 注入,跨站點腳本,跨站點請求偽造,和點擊劫持 (請參閱 網站安全 相關信息,如有興趣)。</p>
 </dd>
 <dt>可擴展</dt>
 <dd>Django 使用基於組件的 “無共享” 架構 (架構的每一部分獨立於其他架構,因此可以根據需要進行替換或更改)。在不同部分之間,有明確的分隔,意味著它可以通過在任何級別添加硬件,來擴展服務:緩存服務器,數據庫服務器,或應用程序服務器。一些最繁忙的網站,已經在 Django 架構下成功地縮放了網站的規模大小,以滿足他們的需求(例如 Instagram 和 Disqus,僅舉兩個例子,可自行添加)。   </dd>
 <dt>可維護</dt>
 <dd>Django 代碼編寫,是遵照設計原則和模式,鼓勵創建可維護和可重複使用的代碼。特別是,它使用了不要重複自己(DRY)原則,所以沒有不必要的重複,減少了代碼的數量。 Django 還將相關功能,分組到可重用的 “應用程序” 中,並且在較低級別,將相關代碼分組或模塊( 模型視圖控制器 <a href="/en-US/Apps/Fundamentals/Modern_web_app_architecture/MVC_architecture">Model View Controller (MVC)</a> 模式)。</dd>
 <dt>可移植</dt>
 <dd>Django 是用 Python 編寫的,它在許多平台上運行。這意味著,你不受任務特定的服務器平台的限制,並且可以在許多種類的 Linux,Windows 和 Mac OS X 上運行應用程序。此外,Django 得到許多網路託管提供商的好評,他們經常提供特定的基礎設施,和託管 Django 網站的文檔。</dd>
</dl>

<h2 id="Django的起源">Django的起源?</h2>

<p>Django 最初在 2003 年到 2005 年間,由負責創建和維護報紙網站的網絡團隊開發。在創建了許多網站後,團隊開始考慮、並重用許多常見的代碼和設計模式。這個共同的代碼,演變一個通用的網絡開發框架,2005 年 7 月,被開源為 “Django” 項目。</p>

<p>Django 不斷發展壯大 — 從 2008 年 9 月的第一個里程碑版本(1.0),到最近發布的(2.0)-(2018)版本。每個版本都添加了新功能,和錯誤修復,從支持新類型的數據庫,模版引擎和緩存,到添加 “通用” 視圖函數和類別(這減少了開發人員在一些編程任務必須編寫的代碼量)。</p>

<div class="note">
<p><strong>注意</strong>:  查看 Django 網站上的發行說明 <a href="https://docs.djangoproject.com/en/2.0/releases/">release notes</a>,看看最近版本發生了什麼變化,以及 Django 能做多少工作</p>
</div>

<p>Django 現在是一個蓬勃發展的合作開源項目,擁有數千個用戶和貢獻者。雖然它仍然具有反映其起源的一些功能,但 Django 已經發展成為,能夠開發任何類型的網站的多功能框架。</p>

<h2 id="Django有多受歡迎">Django有多受歡迎?</h2>

<p>服務器端框架的受歡迎程度沒有任何可靠和明確的測量(儘管<a class="external external-icon" href="http://hotframeworks.com/" rel="noopener">Hot Frameworks</a>網站嘗試使用諸如計算每個平台的GitHub項目數量和StackOverflow問題的機制來評估流行度)。一個更好的問題是Django是否“足夠流行”,以避免不受歡迎的平台的問題。它是否繼續發展?如果您需要幫助,可以幫您嗎?如果您學習Django,有機會獲得付費工作嗎?</p>

<p>基於使用Django的流行網站數量,為代碼庫貢獻的人數以及提供免費和付費支持的人數,那麼是的,Django是一個流行的框架!</p>

<p>使用Django的流行網站包括:Disqus,Instagram,騎士基金會,麥克阿瑟基金會,Mozilla,國家地理,開放知識基金會,Pinterest和開放棧(來源:<a class="external external-icon" href="https://www.djangoproject.com/" rel="noopener">Django home page</a> ).</p>

<h2 id="Django_是特定用途的">Django 是特定用途的?</h2>

<p>Web框架通常將自己稱為“特定”或“無限制”。</p>

<p>特定框架是對處理任何特定任務的“正確方法”有意見的框架。他們經常支持特定領域的快速發展(解決特定類型的問題),因為正確的做法是通常被很好地理解和記錄在案。然而,他們在解決其主要領域之外的問題時可能不那麼靈活,並且傾向於為可以使用哪些組件和方法提供較少的選擇。</p>

<p>相比之下,无限制的框架对于将组件粘合在一起以实现目标或甚至应使用哪些组件的最佳方式的限制较少。它们使开发人员更容易使用最合适的工具来完成特定任务,尽管您需要自己查找这些组件。</p>

<p>Django“有點有意義”,因此提供了“兩個世界的最佳”。它提供了一組組件來處理大多數Web開發任務和一個(或兩個)首選的使用方法。然而,Django的解耦架構意味著您通常可以從多個不同的選項中進行選擇,也可以根據需要添加對全新的支持。</p>

<h2 id="Django_代碼是什麼樣子">Django 代碼是什麼樣子?</h2>

<p>在傳統的數據驅動網站中,Web應用程序會等待來自Web瀏覽器(或其他客戶端)的HTTP 請求。當接收到請求時,應用程序根據URL 和可能的<code>POST</code> 數據或<code>GET</code> 數據中的信息確定需要的內容。根據需要,可以從數據庫讀取或寫入信息,或執行滿足請求所需的其他任務。然後,該應用程序將返回對Web瀏覽器的響應,通常通過將檢索到的數據插入HTML模板中的佔位符來動態創建用於瀏覽器顯示的HTML 頁面。</p>

<p>Django 網絡應用程序通常將處理每個步驟的代碼分組到單獨的文件中:</p>

<p><img alt="" src="https://mdn.mozillademos.org/files/13931/basic-django.png"></p>

<ul>
 <li><strong>URLs: </strong>雖然可以通過單個功能來處理來自每個URL的請求,但是編寫單獨的視圖函數來處理每個資源是更加可維護的。URL映射器用於根據請求URL將HTTP請求重定向到相應的視圖。URL映射器還可以匹配出現在URL中的字符串或數字的特定模式,並將其作為數據傳遞給視圖功能。<br>
   </li>
 <li><strong>View:</strong>   視圖是一個請求處理函數,它接收HTTP請求並返回HTTP響應。視圖通過模型訪問滿足請求所需的數據,並將響應的格式委託給模板。<br>
   </li>
 <li><strong>Models:</strong>   模型是定義應用程序數據結構的Python對象,並提供在數據庫中管理(添加,修改,刪除)和查詢記錄的機制。<br>
   </li>
 <li><strong>Templates:</strong>  模板是定義文件(例如HTML頁面)的結構或佈局的文本文件,用於表示實際內容的佔位符。一個視圖可以使用HTML模板,從數據填充它動態地創建一個HTML頁面模型。可以使用模板來定義任何類型的文件的結構;它不一定是HTML!</li>
</ul>

<div class="note">
<p><strong>注意</strong> : Django將此組織稱為“模型視圖模板(MVT)”架構。它與更加熟悉的<a href="https://developer.mozilla.org/en-US/docs/Web/Apps/Fundamentals/Modern_web_app_architecture/MVC_architecture">Model View Controller</a>架構有許多相似之處. </p>
</div>

<ul>
</ul>

<p>以下部分將為您提供Django應用程序的這些主要部分的想法(稍後我們將在進一步詳細介紹後,我們將在開發環境中進行更詳細的介紹)。</p>

<h3 id="將請求發送到正確的視圖(urls.py)">將請求發送到正確的視圖(urls.py)</h3>

<p>URL映射器通常存儲在名為urls.py的文件中。在下面的示例中,mapper(<code>urlpatterns</code>)定義了特定URL 模式和相應視圖函數之間的映射列表。如果接收到具有與指定模式匹配的URL(例如r'^$',下面)的HTTP請求,則將調用相關聯的視圖功能(例如 views.index)並傳遞請求。</p>

<pre>urlpatterns = [
    <strong>path('admin/', admin.site.urls),
    </strong>path('book/&lt;int:id&gt;/', views.book_detail, name='book_detail'),
    path('catalog/', include('catalog.urls')),
    re_path(r'^([0-9]+)/$', views.best),
]
</pre>

<p><code>urlpatterns</code>對像是<code>path()</code>和/或<code>re_path()</code>函數的列表(Python列表使用方括號定義,其中項目用逗號分隔,可以有一個<a href="https://docs.python.org/2/faq/design.html#why-does-python-allow-commas-at-the-end-of-lists-and-tuples">可選的尾隨逗號</a>。例如:[<code>item1, item2, item3,</code> ])。</p>

<p>兩種方法的第一個參數,是將要匹配的路由(模式)。<code> path()</code>方法使用尖括號,來定義將被捕獲、並作為命名參數傳遞給視圖函數的 URL 的部分。<code> re_path()</code>函數使用靈活的模式匹配方法,稱為正則表達式。我們將在後面的文章中討論這些內容!</p>

<p>第二個參數,是在匹配模式時將調用的另一個函數。註釋 <code>views.book_detail</code>表示該函數名為<code>book_detail()</code>,可以在名為<code>views</code>的模塊中找到(即在名為<code>views.py</code>的文件中)</p>

<h3 id="處理請求(views.py)">處理請求(views.py)</h3>



<p>視圖是Web應用程序的核心,從Web客戶端接收HTTP請求並返回HTTP響應。在兩者之間,他們編制框架的其他資源來訪問數據庫,渲染模板等。</p>

<p>下面的例子顯示了一個最小的視圖功能index(),這可以通過我們的URL映射器在上一節中調用。像所有視圖函數一樣,它接收一個HttpRequest對像作為參數(request)並返回一個HttpResponse對象。在這種情況下,我們對請求不做任何事情,我們的響應只是返回一個硬編碼的字符串。我們會向您顯示一個請求,在稍後的部分中會提供更有趣的內容。</p>



<pre class="brush: python">## filename: views.py (Django view functions)

from django.http import HttpResponse

def index(request):
    # Get an HttpRequest - the request parameter
    # perform operations using information from the request.
    # Return HttpResponse
    return HttpResponse('Hello from Django!')
</pre>

<div class="note">
<p><strong>注意</strong> :一點點Python:</p>

<ul>
 <li><a class="external external-icon" href="https://docs.python.org/3/tutorial/modules.html" rel="noopener">Python模塊</a>是函數的“庫”,存放在單獨的文件中,我們可能希望在代碼中使用。在這裡,我們只導入了<code>HttpResponse</code>從對象<code>django.http</code>模塊,使我們可以在視圖中使用<br>
  <code>from django.http import HttpResponse</code><br>
  還有其他方法可以從模塊導入一些或所有對象</li>
 <li>使用<code>def</code>,如上所示的關鍵字聲明函數,命參數在函數名稱後面的括號中列出:整行以冒號結尾。注意下一行是否都<strong>縮進</strong>。縮進很重要,因為它指定代碼行在該特定塊內(強制縮進是Python的一個關鍵特徵,而且是Python代碼很容易閱讀的一個原因)。</li>
</ul>


</div>

<ul>
</ul>

<p>視圖通常存放在一個名為<strong>views.py</strong>的文件中。</p>

<h3 id="定義數據模型(models.py)">定義數據模型(models.py)</h3>



<p>Django Web應用程序,通過被稱為模型的Python對象,來管理和查詢數據。模型定義存儲數據的結構,包括字段類型 以及字段可能的最大值,默認值,選擇列表選項,文檔幫助文本,表單的標籤文本等。模型的定義與底層數據庫無關-您可以選擇其中一個,作為項目設置的一部分。一旦您選擇了要使用的數據庫,您就不需要直接與之交談- 只需編寫模型結構和其他代碼,Django可以處理與數據庫通信的所有辛苦的工作。</p>

<p>下面的代碼片段為<code>Team</code>對象,展示了一個非常簡單的Django模型。本<code>Team</code>類別是從Django的類別派生<code>models.Model</code>。它將團隊名稱和團隊級別,定義為字符字段,並為每個記錄指定了要存放的最大字符數。<code>team_level</code>可以是幾個值中的一個,因此,我們將其定義為一個選擇字段,並在被展示的數據、和被儲存的數據之間,建立映射,並設置一個默認值。</p>



<pre class="brush: python"># filename: models.py

from django.db import models

class Team(models.Model):
    team_name = models.CharField(max_length=40)

    TEAM_LEVELS = (
        ('U09', 'Under 09s'),
        ('U10', 'Under 10s'),
        ('U11', 'Under 11s'),
        ...  #list other team levels
    )
    team_level = models.CharField(max_length=3,choices=TEAM_LEVELS,default='U11')
</pre>

<div class="note">
<p><strong>注意</strong> : Python小知識:</p>

<ul>
 <li>Python支持“面向對象編程”,這是一種編程風格,我們將代碼組織到對像中,其中包括用於對該對象進行操作的相關數據和功能。對像也可以從其他對象繼承/擴展/派生,允許相關對象之間的共同行為被共享。在Python中,我們使用關鍵字<strong>Class</strong>定義對象的“藍圖”。我們可以根據類中的模型創建類型的多個特定實例。</li>
 <li>例如,我們有個<strong>Team</strong>類,它來自於<strong>Model</strong>類。這意味著它是一個模型,並且將包含模型的所有方法,但是我們也可以給它自己的專門功能。在我們的模型中,我們定義了我們的數據庫需要存儲我們的數據字段,給出它們的具體名稱。Django使用這些定義(包括字段名稱)來創建底層數據庫。</li>
</ul>


</div>

<h3 id="查詢數據(views.py)">查詢數據(views.py)</h3>



<p>Django模型提供了一個,用於搜索數據庫的簡單查詢API。這可以使用不同的標準(例如,精確,不區分大小寫,大於等等)來匹配多個字段,並且可以支持複雜語句(例如,您可以在擁有一個團隊的<strong>U11</strong>團隊上指定搜索名稱以“Fr ”開頭或以“al”結尾)。</p>

<p>代碼片段顯示了一個視圖函數(資源處理程序),用於顯示我們所有的<strong>U09</strong>團隊。<strong>粗體</strong>顯示如何使用模型查詢API,過濾所有記錄,其中該  <strong>team_level</strong>字段,具有正確的文本“ <strong>U09</strong> ”(請注意,該條件如何filter()作為參數傳遞給該函數,該字段名稱和匹配類型由雙下劃線:  <strong>team_level__exact</strong></p>



<pre class="brush: python">## filename: views.py

from django.shortcuts import render
from .models import Team

def index(request):
    <strong>list_teams = Team.objects.filter(team_level__exact="U09")</strong>
    context = {'youngest_teams': list_teams}
    return render(request, '/best/index.html', context)
</pre>

<dl>
</dl>

<p>此功能使用<strong>render</strong> ()功能創建<strong>HttpResponse</strong>發送回瀏覽器的功能。這個函數是一個快捷方式;它通過組合指定的HTML模版和一些數據來插入模版(在名為“ <strong>content</strong> ”的變量中提供)來創建一個<strong>HTML</strong>文件。在下一節中,我們將介紹如何在其中插入數據以創建<strong>HTML</strong></p>

<h3 id="呈現數據(HTML模版)">呈現數據(HTML模版)</h3>

<p>模板系統允許您使用佔位符指定輸出文檔的結構,以便在生成頁面時填充數據。模板通常用於創建HTML,但也可以創建其他類型的文檔。 Django支持其本機模板系統,和另一個流行的Python庫,名為 Jinja2(如果需要,它也可以支持其他系統)。</p>

<p>代碼片段,顯示了上一節中<code>render()</code>函數調用的HTML模板的外觀。這個模板的編寫假設它在渲染時可以訪問名為<code>youngest_teams</code>的列表變量(包含在上面<code>render()</code>函數中的上下文變量<code>context</code>中)。在HTML框架內部,我們有一個表達式,首先檢查<code>youngest_teams</code>變量是否存在,然後在<code>for</code>循環中迭代它。在每次迭代中,模板在{{htmlelement("li")}}元素中顯示每個團隊的<code>team_name</code>值。</p>

<pre class="brush: python">## filename: best/templates/best/index.html

&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;body&gt;

 {% if youngest_teams %}
    &lt;ul&gt;
    {% for team in youngest_teams %}
        &lt;li&gt;\{\{ team.team_name \}\}&lt;/li&gt;
    {% endfor %}
    &lt;/ul&gt;
{% else %}
    &lt;p&gt;No teams are available.&lt;/p&gt;
{% endif %}

&lt;/body&gt;
&lt;/html&gt;</pre>

<h2 id="你還能做什麼?">你還能做什麼?</h2>



<p>前面的部分,展示了幾乎每個Web應用程序將使用的主要功能:URL映射,視圖,模型和模版。Django提供的其他內容包括:</p>

<ul>
 <li><strong>表單</strong> : HTML表單用於收集用戶數據,以便在服務器上進行處理。Django簡化了表單創建,驗證和處理。</li>
 <li><strong>用戶身份驗證和權限</strong> : Django包含了一個強大的用戶身份驗證和權限系統,該系統已經構建了安全性。</li>
 <li><strong>緩存</strong> :與提供靜態內容相比,動態創建內容需要更大的計算強度(也更緩慢)。Django提供靈活的緩存,以便你可以存儲所有或部分的頁面。如無必要,不會重新呈現網頁。</li>
 <li><strong>管理網站</strong> :當你使用基本骨架創建應用時,就已經默認包含了一個Django管理站點。它十分輕鬆地創建了一個管理頁面,使網站管理員能夠創建、編輯和查看站點中的任何數據模型。</li>
 <li><strong>序列化數據</strong> : Django可以輕鬆地將數據序列化,並支持XML或JSON格式。這會有助於創建一個Web服務(Web服務指數據純粹為其他應用程序或站點所用,並不會在自己的站點中顯示),或是有助於創建一個由客戶端代碼處理、和呈現所有數據的網站。</li>
</ul>



<h2 id="總結">總結</h2>



<p>恭喜,您已經完成了Django之旅的第一步!您現在應該了解Django的主要優點,一些關於它的歷史,以及Django應用程序的每個主要部分可能是什麼樣子。您還應該了解Python編程語言的一些內容,包括列表,函數和類別的語法。</p>

<p>您已經看到上面的一些真正的Django代碼,但與客戶端代碼不同,您需要設置一個開發環境來運行它。這是我們的下一步。</p>



<div>{{NextMenu("Learn/Server-side/Django/development_environment", "Learn/Server-side/Django")}}</div>

<h2 id="本教學連結">本教學連結</h2>

<ul>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Introduction">Django introduction</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/development_environment">Setting up a Django development environment</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Tutorial_local_library_website">Django Tutorial: The Local Library website</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/skeleton_website">Django Tutorial Part 2: Creating a skeleton website</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Models">Django Tutorial Part 3: Using models</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Admin_site">Django Tutorial Part 4: Django admin site</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Home_page">Django Tutorial Part 5: Creating our home page</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Generic_views">Django Tutorial Part 6: Generic list and detail views</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Sessions">Django Tutorial Part 7: Sessions framework</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Authentication">Django Tutorial Part 8: User authentication and permissions</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Forms">Django Tutorial Part 9: Working with forms</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Testing">Django Tutorial Part 10: Testing a Django web application</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Deployment">Django Tutorial Part 11: Deploying Django to production</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/web_application_security">Django web application security</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/django_assessment_blog">DIY Django mini blog</a></li>
</ul>