當前位置:
首頁 > 知識 > 由淺入深學習Python Django框架「小白必看」

由淺入深學習Python Django框架「小白必看」

點擊上方「

Python開發

」,選擇「置頂公眾號」


關鍵時刻,第一時間送達!






作者:python教程


https://mp.weixin.qq.com/s/Sl4AfLcUVKbjppGlwPAACg


Python開發整理髮布,轉載請聯繫作者獲得授權




1、Django簡介


Python下有多款不同的 Web 框架,Django是最有代表性的一種。許多成功的網站和APP都基於Django。

Django是一個開源的Web應用框架,由Python寫成。


Django採用了MVC的軟體設計模式,即模型M,視圖V和控制器C。 




2、Django的特點


1) 強大的資料庫功能:用python的類繼承,幾行代碼就可以擁有一個動態的資料庫操作API,如果需要也能執行SQL語句。

2) 自帶的強大的後台功能:幾行代碼就讓網站擁有一個強大的後台,輕鬆管理內容。


3) 優雅的網址:用正則匹配網址,傳遞到對應函數。


4) 模板系統:強大,易擴展的模板系統,設計簡易,代碼和樣式分開設計,更易管理。


5) 緩存系統:與memcached或其它緩存系統聯用,表現更出色,載入速度更快。


6) 國際化:完全支持多語言應用,允許你定義翻譯的字元,輕鬆翻譯成不同國家的語言。



3、Django項目目錄


1) urls.py:網址入口,關聯到對應的views.py中的一個函數(或generic類),訪問網址就對應一個函數。


2) views.py:處理用戶發出的請求,與urls.py對應, 通過渲染templates中的網頁可以將顯示內容,如登陸後的用戶名,用戶請求的數據等輸出到網頁。


3) models.py:與資料庫操作相關,存入或讀取數據時用到,用不到資料庫時可以不使用。


4) forms.py:表單,用戶在瀏覽器上輸入數據提交,對數據的驗證工作以及輸入框的生成等工作,也可以不使用。


5) templates文件夾:views.py中的函數渲染templates中的html模板,得到動態內容的網頁,可以用緩存來提高速度。


6) admin.py:後台,可以用很少的代碼就擁有一個強大的後台。


7) settings.py:Django 的配置文件,如 DEBUG 的開關,靜態文件的位置等。




4、Django基本命令


1) 新建一個項目:




  1. django-admin.py startproject project-name  


在 windows 上如果報錯,嘗試用 django-admin 代替 django-admin.py 。


2) 新建一個APP:




  1. python manage.py startapp app-name  


或 




  1. django-admin.py startapp app-name  


一般一個項目有多個app, 當然通用的app也可以在多個項目中使用。

3) 啟動伺服器:




  1. python manage.py runserver 0.0.0.0:8000  





  1. python manage.py runserver  


前者讓其它電腦可連接到伺服器,監聽機器上所有ip的8000埠,訪問時用電腦的ip代替 127.0.0.1(8000為埠號,如果不說明,則埠號默認為8000);後者在本電腦訪問伺服器,訪問時ip為127.0.0.1。




5、視圖與網址


views.py:

from

django.http

import

HttpResponse  

def

helloWorld

(request)

:

 
   

return

HttpResponse(

"Hello world! "

)  


urls.py:

from

django.conf.urls

import

url  

from

.

import

view  
urlpatterns = [  
   url(//img.ifuun.com/getimg.php?url=

r"^$"

, view.helloWorld)  
]  




啟動伺服器,並在瀏覽器訪問:127.0.0.1:8000。


修改後的urls.py:

from

django.conf.urls

import

url  

from

.

import

view  
urlpatterns = [  
   url(//img.ifuun.com/getimg.php?url=

r"^helloWorld$"

, view.helloWorld)  
]  


啟動伺服器,並在瀏覽器訪問:127.0.0.1:8000/helloWorld。


url(//img.ifuun.com/getimg.php?url=) 函數:可以接收四個參數,分別是兩個必選參數regex、view 和兩個可選參數kwargs、name:


① regex:正則表達式,與之匹配的 URL 會執行對應的第二個參數 view。


② view:用於執行與正則表達式匹配的 URL 請求。


③ kwargs:視圖使用的字典類型的參數。


④ name:用來反向獲取 URL。




6、Django模板


1) 實例:


① 在app目錄中,創建 templates 目錄並建立 helloWorld.html文件:




  1. <h1>{{ helloWorld }}</h1>  




② 向Django說明模板文件的路徑,修改settings.py文件,修改 TEMPLATES 中的 DIRS 為 [BASE_DIR+"/templates",]。


③ 修改views.py:

from

django.shortcuts

import

render  

def

hello

(request)

:

 
   context = {}  
   context[

"helloWorld"

] =

"Hello World!"

 
   

return

render(request,

"helloWorld.html"

, context)  


render使用了一個字典 context 作為參數,context 字典中元素的鍵值 "helloWorld" 對應了模板中的變數 "{{ helloWorld }}"。


④ 啟動伺服器,並在瀏覽器訪問:127.0.0.1:8000/helloWorld。


2) Django 模板標籤


① if/else 標籤


if/else支持嵌套,{% if %} 標籤接受and、or 或not關鍵字來對多個變數做判斷,或對變數取反。




  1. {% 

    if

     condition %}  



  2.    ...  



  3. {% endif %}  


或者:





  1. {% 

    if

     condition1 %}  



  2.    ...  



  3. {% 

    elif

     condiiton2 %}  



  4.    ...  



  5. {% 

    else

     %}  



  6.    ...  



  7. {% endif %}  




② for 標籤


{% for %} 允許在一個序列上迭代。支持嵌套。每一次循環中,模板系統會渲染在 {% for %} 和 {% endfor %} 之間的所有內容。




  1. <ul>  



  2. {% 

    for

     person 

    in

     list %}  



  3.     <li>{{ person.name }}</li>  



  4. {% endfor %}  



  5. </ul>  




給標籤增加一個 reversed 使得該列表被反向迭代:




  1. {% 

    for

     person 

    in

     list %}  



  2.     ...  



  3. {% endfor %}  




③ ifequal/ifnotequal 標籤


{% ifequal %} 標籤比較兩個值,當他們相等時,顯示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。和 {% if %} 類似, {% ifequal %} 支持可選的 {% else%} 標籤。




  1. {% ifequal person1 person2 %}  



  2.     <h1>YES</h1>  



  3. {% endifequal %}  




④ 注釋標籤


Django 注釋使用 {# #}。


⑤ 過濾器


模板過濾器可以在變數被顯示前修改它,過濾器使用管道字元:


{{ name|lower }}大寫轉換為小寫。


一個過濾器管道的輸出又可以作為下一個管道的輸入:


{{ name|first|upper }}將第一個元素轉化為大寫。


有些過濾器有參數,過濾器的參數跟隨冒號之後並總是以雙引號包含:


{{ name|truncatewords:"3" }}顯示變數的前3個詞。


addslashes:添加反斜杠到任何反斜杠、單引號或者雙引號前面。


date:按指定的格式字元串參數格式化date或datetime對象,如{{ pub_date|date:"F j, Y" }}。


length:返回變數的長度。


⑥ include 標籤


{% include %} 標籤允許在模板中包含其它的模板的內容。






  1. {% include 

    "test.html"

     %}  




7、Django模型


Django 對各種資料庫提供了很好的支持,Django 為資料庫提供了統一的調用API,可以根據業務需求選擇不同的資料庫。


以MYSQL資料庫為例,安裝 mysql 驅動的命令:sudo pip install mysqlclient。


1) 資料庫配置


在項目的settings.py文件中找到 DATABASES 配置項,將其信息修改為:

DATABASES = {  
   

"default"

: {  
       

"ENGINE"

:

"django.db.backends.mysql"

,

# 或者使用 mysql.connector.django  


       

"NAME"

:

"test"

,  
       

"USER"

:

"test"

,  
       

"PASSWORD"

:

"test123"

,  
       

"HOST"

:

"localhost"

,  
       

"PORT"

:

"3306"

,  
   }  
}  




這裡添加了中文注釋,所以需要在settings.py 文件頭部添加 # -*- coding: UTF-8 -*-。



2) 定義模型


① 創建APP:


Django規定,如果要使用模型,必須要創建一個app,使用以下命令創建一個app:python manage.py startapp TestModel。


② 修改 TestModel/models.py 文件:

from

django.db

import

models  

class

Test

(models.Model)

:

 
   name = models.CharField(max_length=

20

)  




類名代表了資料庫表名,且繼承了models.Model,類裡面的欄位代表數據表中的欄位(name),數據類型則由CharField(相當於varchar)、DateField(相當於datetime), max_length 參數限定長度。


③ 在settings.py中找到INSTALLED_APPS這一項,添加:"TestModel"。


④ 在命令行中運行以下命令,創建數據表,表名為應用名_類名(如:TestModel_test):




view plain

 

copy

python

manage.py migrate  

# 創建表結構  


python manage.py makemigrations TestModel  

# 讓Django知道模型有一些變更  


python manage.py migrate TestModel  

# 創建表結構  





3) 資料庫操作


添加database.py文件:




[python] 

view plain

 

copy

from

django.http

import

HttpResponse  

from

TestModel.models

import

Test  

def

database

(request)

:

 
   test = Test(name=

"Alice"

)  
   test.save()  
   

return

HttpResponse(

"<p>數據添加成功!</p>"

)  




修改 urls.py:


 

view plain

 

copy

from

django.conf.urls

import

*  

from

.

import

view,database  
urlpatterns = [  
   url(//img.ifuun.com/getimg.php?url=

r"^hello$"

, view.hello),  
   url(//img.ifuun.com/getimg.php?url=

r"^database$"

, database.database)  
]  


啟動伺服器,並在瀏覽器訪問:127.0.0.1:8000/database。


① 添加數據




[python] 

view plain

 

copy

from

django.http

import

HttpResponse  

from

TestModel.models

import

Test  

def

database

(request)

:

 
   test = Test(name=

"Alice"

)  
   test.save()  
   

return

HttpResponse(

"<p>數據添加成功!</p>"

)  




② 獲取數據




[python] 

view plain

 

copy

from

django.http

import

HttpResponse  

from

TestModel.models

import

Test  

def

database

(request)

:

 
   

# 初始化  


   response =

""

 
   response1 =

""

 
   

# 通過objects這個模型管理器的all()獲得所有數據行,相當於SQL中的SELECT * FROM  


   list = Test.objects.all()  
   

# filter相當於SQL中的WHERE,可設置條件過濾結果  


   response2 = Test.objects.filter(id=

1

)  
   

# 獲取單個對象  


   response3 = Test.objects.get(id=

1

)  
   

# 限制返回的數據,相當於SQL中的OFFSET 0 LIMIT 2;  


   Test.objects.order_by(

"name"

)[

0

:

2

]  
   

# 數據排序  


   Test.objects.order_by(

"id"

)  
   

# 上面的方法可以連鎖使用  


   Test.objects.filter(name=

"Alice"

).order_by(

"id"

)  
   

# 輸出所有數據  


   

for

var

in

list:  
       response1 += var.name +

" "

 
   response = response1  
   

return

HttpResponse(

"<p>"

+ response +

"</p>"

)  




③ 更新數據


[python] 

view plain

 

copy

from

django.http

import

HttpResponse  

from

TestModel.models

import

Test  

def

database

(request)

:

 
   

# 修改id=1的name欄位再save,相當於SQL中的UPDATE  


   test = Test.objects.get(id=

1

)  
   test.name=

"Alice"

 
   test.save()  
   

# 另一種方式  


   

# Test.objects.filter(id=1).update(name="Alice)  


   

# 修改所有的列  


   

# Test.objects.all()..update(name="Google")  


   

return

HttpResponse(

"<p>數據修改成功</p>"

)  




④ 刪除數據


刪除資料庫中的對象只需調用該對象的delete()方法即可:


[python] 

view plain

 

copy

from

django.http

import

HttpResponse  

from

TestModel.models

import

Test  

def

database

(request)

:

 
   

# 刪除id=1的數據  


   test = Test.objects.get(id=

1

)  
   test.delete()  
   

# 另外一種方式  


   

# Test.objects.filter(id=1).delete()  


   

# 刪除所有數據  


   

# Test.objects.all().delete()  


   

return

HttpResponse(

"<p>數據刪除成功</p>"

)  




8、Django表單


1) Get方法


① 創建一個 search.py 文件,用於接收用戶的請求:


[python] 

view plain

 

copy

from

django.http

import

HttpResponse  

from

django.shortcuts

import

render_to_response  

# 表單  


def

search_form

(request)

:

 
   

return

render_to_response(

"search_form.html"

)  
   

# 接收請求數據  


   

def

search

(request)

:

 
   request.encoding=

"utf-8"

 
   

if

"q"

in

request.GET:  
       message =

"搜索的內容為: "

+ request.GET[

"q"

].encode(

"utf-8"

)  
   

else

:  
       message =

"提交了空表單"

 
   

return

HttpResponse(message)  




② 在templates中添加 search_form.html 表單:




[html] 

view plain

 

copy

<!DOCTYPE html>

 

<

html

>

 
   

<

head

>

 
       

<

meta

charset

=

"utf-8"

>

 
       

<

title

>

</

title

>

 
   

</

head

>

 
   

<

body

>

 
       

<

form

action

=

"/search"

method

=

"get"

>

 
           

<

input

type

=

"text"

name

=

"q"

>

 
           

<

input

type

=

"submit"

value

=

"搜索"

>

 
       

</

form

>

 
   

</

body

>

 

</

html

>

 




③ 修改urls.py:


[python] 

view plain

 

copy

from

django.conf.urls

import

url  

from

.

import

view,database,search  
urlpatterns = [  
   url(//img.ifuun.com/getimg.php?url=

r"^helloWorld$"

, view.helloWorld),  
   url(//img.ifuun.com/getimg.php?url=

r"^database$"

, database.database),  
   url(//img.ifuun.com/getimg.php?url=

r"^search-form$"

, search.search_form),  
   url(//img.ifuun.com/getimg.php?url=

r"^search$"

, search.search)  
]  


④ 啟動伺服器,並在瀏覽器訪問:127.0.0.1:8000/search_form。


2) Post方法


① 在templates中添加 post.html 表單:


[python] 

view plain

 

copy

<!DOCTYPE html>

 

<

html

>

 
   

<

head

>

 
       

<

meta

charset

=

"utf-8"

>

 
       

<

title

>

</

title

>

 
   

</

head

>

 
   

<

body

>

 
       

<

form

action

=

"/search-post"

method

=

"post"

>

 
           {% csrf_token %}  
           

<

input

type

=

"text"

name

=

"q"

>

 
           

<

input

type

=

"submit"

value

=

"搜索"

>

 
       

</

form

>

 
       

<

p

>

{{ rlt }}

</

p

>

 
   

</

body

>

 

</

html

>

 




{% csrf_token %}標籤:csrf 全稱是 Cross Site Request Forgery,這是Django提供的防止偽裝提交請求的功能。POST 方法提交的表格,必須有此標籤。


② 新建 search2.py 文件並使用 search_post 函數來處理 POST 請求:


[python] 

view plain

 

copy

from

django.shortcuts

import

render  

from

django.views.decorators

import

csrf  

# 接收POST請求數據  


def

search_post

(request)

:

 
   ctx ={}  
   

if

request.POST:  
       ctx[

"rlt"

] = request.POST[

"q"

]  
   

return

render(request,

"post.html"

, ctx)  




③ 修改urls.py:


[python] 

view plain

 

copy

from

django.conf.urls

import

url  

from

.

import

view,database,search  
urlpatterns = [  
   url(//img.ifuun.com/getimg.php?url=

r"^helloWorld$"

, view.helloWorld),  
   url(//img.ifuun.com/getimg.php?url=

r"^database$"

, database.database),  
   url(//img.ifuun.com/getimg.php?url=

r"^search-form$"

, search.search_form),  
   url(//img.ifuun.com/getimg.php?url=

r"^search$"

, search.search)  
   url(//img.ifuun.com/getimg.php?url=

r"^search-post$"

, search2.search_post)  
]  




 ④ 啟動伺服器,並在瀏覽器訪問:127.0.0.1:8000/search_post。




【點擊成為Java大神】

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發 的精彩文章:

利用11行Python代碼, 盜取了室友的U盤, 內容十分刺激!

TAG:Python開發 |