Python3 Django框架

一、Django基礎(chǔ)

Django 是用Python開發(fā)的一個免費開源的Web框架,可以用于快速搭建高性能,優(yōu)雅的網(wǎng)站!

Django的特點:

強大的數(shù)據(jù)庫功能:擁有強大的數(shù)據(jù)庫操作接口(QuerySet API),也能執(zhí)行原生SQL

自帶強大后臺:網(wǎng)站擁有一個強大的后臺,輕松管理內(nèi)容

優(yōu)雅的網(wǎng)址:用正則匹配網(wǎng)址,傳遞到對應(yīng)函數(shù),隨意定義。

模版系統(tǒng):易擴展的模版系統(tǒng),設(shè)計簡易,代碼,樣式 分開設(shè)計,更容易管理。

緩存系統(tǒng):與memcached,redis等緩存系統(tǒng)聯(lián)用,更出色的表現(xiàn),更快的加載速度。

國際化:完全支持多國語言應(yīng)用,允許定義翻譯的字符,輕松翻譯成不同國際的語言。

Django目錄結(jié)構(gòu):

urls.py:網(wǎng)址入口,關(guān)聯(lián)到對應(yīng)的Views.py中的一個函數(shù),訪問網(wǎng)址對應(yīng)的函數(shù)。

views.py:處理用戶發(fā)出的請求,從urls.py中對應(yīng)過來,通過渲染templates中的網(wǎng)頁可以將顯示內(nèi)容,比如登陸后的用戶名,數(shù)據(jù),輸出到網(wǎng)頁。

models.py:與數(shù)據(jù)庫操作相關(guān),存入或讀取數(shù)據(jù)時用到這個

templates文件夾:views.py中的函數(shù)渲染templates中的HTML模版,得到動態(tài)內(nèi)容網(wǎng)頁,可以用緩存來提高速度。
admin.py:后臺,可以用很少量的代碼就擁有一個強大的后臺。

settings.py:Django的全局設(shè)置,配置文件,比如DEBUG的開關(guān),靜態(tài)文件的位置設(shè)置等。

二、Django安裝

1、用pip來安裝

(1)安裝pip:yum install python-pip 或者https://bootstrap.pypa.io/get-pip.py 下載get-pip然后運行python get-pip.py就可以安裝pip了;也可以下載pip源碼包,運行python setup.py install 進行安裝。

(2)利用pip安裝Django

pip install Django 或者 pip install Django==2.0.4

升級pip可以用:pip install --upgrade pip

2、下載源碼安裝

linux and MAC:

下載源碼包:https://www.djangoproject.com/m/releases/2.0/Django-2.0.4.tar.gz

tar -xvf django-2.0.4.tar.gz
cd django-2.0.4
python setup.py install

3、linux用自帶源進行安裝

ubuntu:
sudo apt-get install python-django -y
fedora:
yum install python-django -y

檢查是否安裝成功:看到版本號則安裝成功!

>> import django
>> django.VERSION
(2, 0, 4, 'final', 0)
>> django.get_version()
'2.0.4'
image.png

三、Django基本命令

1.創(chuàng)建一個django項目

直接在終端輸入:

django-admin startproject Hello

然后進入mysite這個文件目錄,在終端輸入:

 cd Hello/

查看目錄有什么內(nèi)容,在終端輸入: ls
然后我們繼續(xù)進入mysite這個目錄在通過ls查看有什么內(nèi)容。


image.png

看一下它的結(jié)構(gòu)

Hello/
├── manage.py
└── Hello
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Hello/ 根目錄只是項目的容器,它的名字與Django無關(guān),可以將它重命名為任何任何名字

manage.py:一個命令行實用程序,可讓你以各種方式與Django項目進行交互

Hello:是項目的實際python包,它的名字是你需要用來導(dǎo)入任何內(nèi)容的python包名

init.py:一個空文件,告訴python這個目錄應(yīng)該被視為一個python包

settings.py:這是Django項目的設(shè)置與配置,Django設(shè)置會告訴你有關(guān)設(shè)置如何工作的所有信息

urls.py:這是Django項目的URL聲明

wsqi.py:WSGI兼容的Web服務(wù)器為你的項目提供服務(wù)的入口點

四、啟動服務(wù)器

通過上面的操作我們已經(jīng)創(chuàng)建好一個django項目了,我們回到最外層的mysite/這個目錄,然后在終端輸入:python manage.py runserver 啟動服務(wù)器,成功后會出現(xiàn)下面的樣子。

image.png

然后我們在瀏覽器訪問http://127.0.0.1:8000/,會出現(xiàn)下面這個樣子。

image.png

到現(xiàn)在為止我們已經(jīng)成功新建了一個新的django項目,并且把它運行了起來。

創(chuàng)建一個應(yīng)用

值得一提的是項目和應(yīng)用的區(qū)別:一個應(yīng)用是 Web 程序中的一個功能,比如博客應(yīng)用,投票應(yīng)用.一個項目是許多個基本應(yīng)用的集合

直接在終端輸入命令: python manage.py startapp staffadmin

成功創(chuàng)建staffadmin這個應(yīng)用我們可以進入這個文件目錄看下都有哪些文件。


image.png

admin.py:這個是配置管理后臺數(shù)據(jù).
models.py :這里面的每一個類,可以比喻成數(shù)據(jù)庫的每一個表.
views.py :主要用作前后端交互。
urls.py:用作配置路由。

創(chuàng)建一個視圖

打開staffadmin/views.py這個文件,寫下如下代碼


image.png

然后我們在staffadmin目錄下新建一個urls.py,寫下如下代碼


image.png

同時還要配置一下Hello/urls.py,寫下如下代碼


image.png

然后我們通過瀏覽器訪問http://127.0.0.1:8000/staffadmin/index

如果成功訪問,會在瀏覽器看到"This is my first application"。


image.png

我們也可以在子文件夾Hello/下創(chuàng)建一個視圖view.py


image.png

然后在Hello/下的urls.py里添加


image.png

然后訪問127.0.0.1:8080,就可以看到hello world!了


image.png

也可以修改以下規(guī)則


image.png

然后訪問127.0.0.1/hello,效果一樣


image.png

五、配置數(shù)據(jù)庫

我們打開Hello/Hello/settings.py這個文件。


image.png

我們可以看到熟悉的databases,默認(rèn)配置的數(shù)據(jù)庫是 SQLite,如果你想使用其它的數(shù)據(jù)庫,需要在文件中的 DATABASES 'default' 改變適當(dāng)?shù)闹怠?br> 比如我們想要連接mysql:


image.png

我們還可以通過這樣修改時區(qū)和中文設(shè)置。


image.png

我們還可以看到INSTALLED_APPS有這些應(yīng)用


image.png

在django中一些應(yīng)用程序使用至少一個數(shù)據(jù)庫表,因此我們需要在數(shù)據(jù)庫中創(chuàng)建表,然后才能使用它們。

直接在終端輸入命令:python manage.py migrate

image.png

創(chuàng)建模型


image.png

上面兩個類相當(dāng)于創(chuàng)建了兩個表,類名代表表名,變量代表列名
激活模型

可以在INSTALLED_APPS里面加上'staffadmin'或者'staffadmin.apps.staffadminConfig'

image.png

經(jīng)過上面的操作我們已經(jīng)注冊staffadmin這個應(yīng)用了,因為我們之前對模型做了一些改變,并且你想要把這些改變保存為 migration。

直接在終端輸入命令:python manage.py makemigrations staffadmin

image.png

如果我們想知道這個命令到底做了些什么,可以通過在終端直接輸入命令: python manage.py sqlmigrate staffadmin 0001

image.png

熟悉數(shù)據(jù)庫的同學(xué)一看就明白,這不就是創(chuàng)建數(shù)據(jù)庫表的操作命令嗎?沒錯的確如此。

然后我們還差最后一步就可以把數(shù)據(jù)庫創(chuàng)建起來,

直接在終端輸入命令: python manage.py migrate staffadmin

image.png

直到這一步,我們的數(shù)據(jù)庫已經(jīng)建好?,F(xiàn)在我還要提醒的是,migrate 命令會執(zhí)行所有還沒應(yīng)用的遷移,

并會在數(shù)據(jù)庫中執(zhí)行相應(yīng)的代碼來同步你的修改.遷移是一個非常強大且有用的工具,可以讓你在開發(fā)項目的任何時候,

不需要對數(shù)據(jù)庫進行刪除增加等操作就完成修改,在升級數(shù)據(jù)庫信息時也不會造成丟失.現(xiàn)在只需要記住以下這三個步驟:

如果修改了模型(在 models.py 文件中).
運行 python manage.py makemigrations來為這些修改創(chuàng)建遷移.
運行 python manage.py migrate 來應(yīng)用這些改變到數(shù)據(jù)庫.

image.png

操作數(shù)據(jù)庫(models)

操作數(shù)據(jù)庫無非就是增刪改查。

首先我們在終端輸入命令python manage.py shell,然后先把我們的數(shù)據(jù)庫表引進來。

from staff.modles import Department

 models.Department.objects.create(department_name='市場部')  增加一條數(shù)據(jù),可以接受字典類型數(shù)據(jù) **kwargs

 obj = models.Department(department_name='市場部')
 obj.save()

 models.Department.objects.get(id=1)         # 獲取id=1的單條數(shù)據(jù),不存在則報錯(不建議)
 models.Department.objects.all()               # 獲取全部數(shù)據(jù)
 models.Department.objects.filter(department_name='市場部') # 獲取department_name='市場部'的數(shù)據(jù)# models.Department.objects.exclude(department_name='市場部') # 獲取除了department_name='市場部'的數(shù)據(jù)

 models.Department.objects.filter(department_name='市場部').delete() # 刪除department_name='市場部'的數(shù)據(jù)

 models.Department.objects.filter(department_name='市場部').update(department_name='運營部')  # 將department_name="市場部"改成"運營部",均支持 **kwargs
 obj = models.Department.objects.get(id=1)
 obj.department_name= '運營部'
 obj.save()                                                 # 保存數(shù)據(jù)

當(dāng)有一對多,多對一,或者多對多的關(guān)系的時候,先把相關(guān)的對象查詢出來

image.png

image.png

在這里我提一下ForeignKey,ManyToManyField與OneToOneField分別是Model中定義多對一,多對多,一對一關(guān)系。
在本例的教程中,我們可以知道一個員工只有一個部門,一個部門可以有多個員工,所以用了ForeignKeyField

admin站點的使用

首先我們先創(chuàng)建一個超級用戶的賬號
直接在終端輸入命令:python manage.py createsupperuser,然后根據(jù)提示輸入相關(guān)內(nèi)容即可。

image.png

此時我們可以通過瀏覽器訪問http://127.0.0.1:8000/admin/,我們會看到下面的畫面。

此時我們發(fā)現(xiàn)我們寫的models沒有顯示出來,是因為沒有在admin上面注冊。

所以我們打開Hello/staffadmin/admin.py這個文件

然后我們把models引進來


image.png

保存代碼,然后刷新瀏覽器我們發(fā)現(xiàn)多了一個staffadmin的管理組


image.png

然后看看其內(nèi)容


image.png
image.png

這是我們剛才添加的信息

使用mysql數(shù)據(jù)庫

與數(shù)據(jù)庫的交互:

把數(shù)據(jù)存取邏輯、業(yè)務(wù)邏輯和表現(xiàn)邏輯組合在一起的概念有時被稱為軟件架構(gòu)的 Model-View-Controller (MVC)模式。在這個模式中, Model 代表數(shù)據(jù)存取層,View 代表的是系統(tǒng)中選擇顯示什么和怎么顯示的部分,Controller 指的是系統(tǒng)中根據(jù)用戶輸入并視需要訪問模型,以決定使用哪個視圖的那部分。

由于 C 由框架自行處理,而 Django 里更關(guān)注的是模型(Model)、模板(Template)和視圖(Views),Django 也被稱為 MTV 框架 。在 MTV 開發(fā)模式中:

M 代表模型(Model),即數(shù)據(jù)存取層。該層處理與數(shù)據(jù)相關(guān)的所有事務(wù):如何存取、如何確認(rèn)有效性、包含哪些行為以及數(shù)據(jù)之間的關(guān)系等。

T 代表模板(Template),即表現(xiàn)層。該層處理與表現(xiàn)相關(guān)的決定:如何在頁面或其他類型文檔中進行顯示。

V代表View,業(yè)務(wù)邏輯層。這一層包含訪問模型的邏輯和按照模板顯示。你可以認(rèn)為它是模型和模板的橋梁。

上面的數(shù)據(jù)庫用的是django自帶的sqlite3,我們也可以使用更方便地mysql,首先配置文件中修改一下mysql配置,上面提到過
這里詳細(xì)說一下mysql的方法,因為上面創(chuàng)建了一個staffadmin的app應(yīng)用,這里我們新建一個應(yīng)用----people

image.png
image.png

然后修改mysql配置,在我們的項目HELLO/Hello/setting.py中

image.png

修改對應(yīng)的mysql數(shù)據(jù)庫、用戶、密碼、端口
然后將我們新建的應(yīng)用(people)添加到 settings.py 中的 INSTALLED_APPS中,也就是告訴Django有這么一個應(yīng)用。


image.png

然后修改models.py
我們打開 people/models.py 文件,修改其中的代碼如下:

from django.db import models

# Create your models here.
class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()

    def __str__(self):
        return self.name

我們新建了一個Person類,繼承自models.Model, 一個人有姓名和年齡。
也就相當(dāng)于在mysql中創(chuàng)建了一個person表,然后里面的字段屬性有年齡,名字等
在Django中使用該數(shù)據(jù)庫布局的第一步是將其表述為Python代碼。在通過“startapp”命令創(chuàng)建的“models.py”文件中
例如:

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

這段python代碼創(chuàng)建了一個Publisher類,也就等同于在數(shù)據(jù)庫中

CREATE TABLE "books_publisher" (
    "id" serial NOT NULL PRIMARY KEY,
    "name" varchar(30) NOT NULL,
    "address" varchar(50) NOT NULL,
    "city" varchar(60) NOT NULL,
    "state_province" varchar(30) NOT NULL,
    "country" varchar(50) NOT NULL,
    "website" varchar(200) NOT NULL
);

每個模型相當(dāng)于單個數(shù)據(jù)庫表,每個屬性也是這個表中的一個字段。 屬性名就是字段名,它的類型(例如 CharField )相當(dāng)于數(shù)據(jù)庫的字段類型 (例如 varchar )。

然后shell創(chuàng)建數(shù)據(jù)表,同步數(shù)據(jù)庫信息
輸入一下命令

# Django 1.6.x 及以下
python manage.py syncdb
 
# Django 1.7 及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate

python manage.py makemigrations [appname]
python manage.py migrate [appname]
初始化數(shù)據(jù)庫,如此,我們就可以在django項目中使用mysql數(shù)據(jù)庫了。

image.png

image.png

然后可以看到數(shù)據(jù)庫里對應(yīng)了相應(yīng)的表
如何使用這個表呢?方法和上面一樣
使用 Django 提供的 QuerySet API
Django提供了豐富的API, 下面演示如何使用它。

image.png

我們新建了一個用戶WeizhongTu,它返回了一個類,名字為我們創(chuàng)建的, 那么如何從數(shù)據(jù)庫是查詢到它呢?


image.png

我們用了一個 .objects.get() 方法查詢出來符合條件的對象,但是大家注意到了沒有,我的models.py中多寫了def....最后兩行

from django.db import models
 
class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
     
    def __unicode__(self):
    # 在Python3中使用 def __str__(self):
        return self.name

如果我們不添加的話它將返回<Person: Person object>

>>> Person.objects.get(name="WeizhongTu")
<Person: Person object>
>>>

這里并沒有顯示出與WeizhongTu的相關(guān)信息,如果用戶多了就無法知道查詢出來的到底是誰,查詢結(jié)果是否正確,所以我們修改一下 people/models.py,添加最后兩行內(nèi)容
注意:name 和 age 等字段中不能有 __(雙下劃線,因為在Django QuerySet API中有特殊含義(用于關(guān)系,包含,不區(qū)分大小寫,以什么開頭或結(jié)尾,日期的大于小于,正則等)

也不能有Python中的關(guān)鍵字,name 是合法的,student_name 也合法,但是student__name不合法,try, class, continue 也不合法,因為它是Python的關(guān)鍵字( import keyword; print(keyword.kwlist) 可以打出所有的關(guān)鍵字)

新建一個對象的方法有以下幾種:

Person.objects.create(name=name,age=age)

p = Person(name="WZ", age=23)

p.save()

p = Person(name="TWZ")

p.age = 23

p.save()

Person.objects.get_or_create(name="WZT", age=23)

這種方法是防止重復(fù)很好的方法,但是速度要相對慢些,返回一個元組,第一個為Person對象,第二個為True或False, 新建時返回的是True, 已經(jīng)存在時返回False.



獲取對象有以下方法:

Person.objects.all()

Person.objects.all()[:10] 切片操作,獲取10個人,不支持負(fù)索引,切片可以節(jié)約內(nèi)存

Person.objects.get(name=name)



get是用來獲取一個對象的,如果需要獲取滿足條件的一些人,就要用到filter

Person.objects.filter(name="abc")  # 等于Person.objects.filter(name__exact="abc") 名稱嚴(yán)格等于 "abc" 的人

Person.objects.filter(name__iexact="abc")  # 名稱為 abc 但是不區(qū)分大小寫,可以找到 ABC, Abc, aBC,這些都符合條件



Person.objects.filter(name__contains="abc")  # 名稱中包含 "abc"的人

Person.objects.filter(name__icontains="abc")  #名稱中包含 "abc",且abc不區(qū)分大小寫



Person.objects.filter(name__regex="^abc")  # 正則表達(dá)式查詢

Person.objects.filter(name__iregex="^abc")  # 正則表達(dá)式不區(qū)分大小寫



filter是找出滿足條件的,當(dāng)然也有排除符合某條件的

Person.objects.exclude(name__contains="WZ")  # 排除包含 WZ 的Person對象

Person.objects.filter(name__contains="abc").exclude(age=23)  # 找出名稱含有abc, 但是排除年齡是23

然后注冊我們的models在admin上,效果和上面是一樣的


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容