淺談Python Django框架

一、Django簡介html

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

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

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

 

二、Django的特色sql

1) 強大的數據庫功能:用python的類繼承,幾行代碼就能夠擁有一個動態的數據庫操做API,若是須要也能執行SQL語句。數據庫

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

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

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

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

6) 國際化:徹底支持多語言應用,容許你定義翻譯的字符,輕鬆翻譯成不一樣國家的語言。

 

三、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 的開關,靜態文件的位置等。

 

四、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。

 

五、視圖與網址

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。

 

六、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" %}  

 

七、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(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("<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>")  

八、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(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

<!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(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。

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

相關文章
相關標籤/搜索