
來源:碼農程式
ID:PyExChange
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) 新建一個專案:
- 
django-admin.py startproject project-name 
在 windows 上如果報錯,嘗試用 django-admin 代替 django-admin.py 。
2) 新建一個APP:
- 
python manage.py startapp app-name 
或
- 
django-admin.py startapp app-name 
一般一個專案有多個app, 當然通用的app也可以在多個專案中使用。
3) 啟動伺服器:
- 
python manage.py runserver 0.0.0.0:8000 
或
- 
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(r'^$', view.helloWorld)  
]  
啟動伺服器,併在瀏覽器訪問:127.0.0.1:8000。
修改後的urls.py:
from django.conf.urls import url  
from . import view  
urlpatterns = [  
    url(r'^helloWorld$', view.helloWorld)  
]  啟動伺服器,併在瀏覽器訪問:127.0.0.1:8000/helloWorld。
url() 函式:可以接收四個引數,分別是兩個必選引數regex、view 和兩個可選引數kwargs、name:
① regex:正則運算式,與之匹配的 URL 會執行對應的第二個引數 view。
② view:用於執行與正則運算式匹配的 URL 請求。
③ kwargs:檢視使用的字典型別的引數。
④ name:用來反向獲取 URL。
6、Django模板
1) 實體:
① 在app目錄中,建立 templates 目錄並建立 helloWorld.html檔案:
- 
{{ helloWorld }}
② 向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關鍵字來對多個變數做判斷,或對變數取反。
- 
{% if condition %} 
- 
… 
- 
{% endif %} 
或者:
- 
{% if condition1 %} 
- 
… 
- 
{% elif condiiton2 %} 
- 
… 
- 
{% else %} 
- 
… 
- 
{% endif %} 
② for 標簽
{% for %} 允許在一個序列上迭代。支援巢狀。每一次迴圈中,模板系統會渲染在 {% for %} 和 {% endfor %} 之間的所有內容。
- 
- 
{% for person in list %} 
- 
- {{ person.name }}
- 
{% endfor %} 
- 
給標簽增加一個 reversed 使得該串列被反向迭代:
- 
{% for person in list %} 
- 
… 
- 
{% endfor %} 
③ ifequal/ifnotequal 標簽
{% ifequal %} 標簽比較兩個值,當他們相等時,顯示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。和 {% if %} 類似, {% ifequal %} 支援可選的 {% else%} 標簽。
- 
{% ifequal person1 person2 %} 
- 
YES
- 
{% endifequal %} 
④ 註釋標簽
Django 註釋使用 {# #}。
⑤ 過濾器
模板過濾器可以在變數被顯示前修改它,過濾器使用管道字元:
{{ name|lower }}大寫轉換為小寫。
一個過濾器管道的輸出又可以作為下一個管道的輸入:
{{ name|first|upper }}將第一個元素轉化為大寫。
有些過濾器有引數,過濾器的引數跟隨冒號之後並總是以雙引號包含:
{{ name|truncatewords:”3″ }}顯示變數的前3個詞。
addslashes:新增反斜槓到任何反斜槓、單引號或者雙引號前面。
date:按指定的格式字串引數格式化date或datetime物件,如{{ pub_date|date:”F j, Y” }}。
length:傳回變數的長度。
⑥ include 標簽
{% include %} 標簽允許在模板中包含其它的模板的內容。
- 
{% 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("資料新增成功!
")  
修改 urls.py:
view plain copy
from django.conf.urls import *  
from . import view,database  
urlpatterns = [  
    url(r'^hello$', view.hello),  
    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("資料新增成功!
")  
② 獲取資料
[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(""
 + response + "“)
③ 更新資料
[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("資料修改成功
")  
④ 刪除資料
刪除資料庫中的物件只需呼叫該物件的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("資料刪除成功
")  
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
  
<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(r'^helloWorld$', view.helloWorld),  
    url(r'^database$', database.database),  
    url(r'^search-form$', search.search_form),  
    url(r'^search$', search.search)  
]  
④ 啟動伺服器,併在瀏覽器訪問:127.0.0.1:8000/search_form。
2) Post方法
① 在templates中新增 post.html 表單:
[python] view plain copy
  
<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(r'^helloWorld$', view.helloWorld),  
    url(r'^database$', database.database),  
    url(r'^search-form$', search.search_form),  
    url(r'^search$', search.search)  
    url(r'^search-post$', search2.search_post)  
]  
④ 啟動伺服器,併在瀏覽器訪問:127.0.0.1:8000/search_post。
《Linux雲端計算及運維架構師高薪實戰班》2018年08月27日即將開課中,120天衝擊Linux運維年薪30萬,改變速約~~~~
*宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。
– END –


更多Linux好文請點選【閱讀原文】哦
↓↓↓
 知識星球
知識星球