diango基本概念

上面這兩個(gè)圖片是ORM對(duì)象關(guān)系映射的關(guān)系理解。

django框架

一、簡(jiǎn)介

web框架

具體介紹django之前,必須先介紹python的web框架等概念。

web框架: 別人已經(jīng)設(shè)定好的一個(gè)web網(wǎng)站模板,你學(xué)習(xí)它的規(guī)則,然后“填空”或“修改”成你自己需要的樣子。

一般web框架的架構(gòu)是這樣的(看圖)


其它基于python的web框架,如tornado、flask、webpy都是在這個(gè)范圍內(nèi)進(jìn)行增刪裁剪的。

例如tornado用的是自己的異步非阻塞,flask則只提供了最精簡(jiǎn)和基本的框架。

django則是直接使用了WSGI,并實(shí)現(xiàn)了大部分功能。

django簡(jiǎn)介

django是用python開(kāi)發(fā)的一個(gè)免費(fèi)開(kāi)源的web框架,可以用于快速搭建高性能,優(yōu)雅的網(wǎng)站!

django的理念是DRY(Don't Repeat Yourself)來(lái)鼓勵(lì)快速開(kāi)發(fā)!

二、django框架的核心組件有:

1.用于創(chuàng)建模型的對(duì)象關(guān)系映射(orm)

2.為最終用戶設(shè)計(jì)的完美管理界面

3.一流的URL設(shè)計(jì)

4.設(shè)計(jì)者友好的模板語(yǔ)言

5.緩存系統(tǒng)

6.國(guó)際化

1、用于創(chuàng)建模型的對(duì)象關(guān)系映射

對(duì)上面1-6的含義解析:

1.用于創(chuàng)建模型的對(duì)象關(guān)系映射(orm)

以python類(lèi)形式定義你的數(shù)據(jù)模型,ORM將模型與關(guān)系數(shù)據(jù)庫(kù)連接起來(lái),你將得到一個(gè)非常容易使用的數(shù)據(jù)庫(kù)API,同時(shí)你也可以在Django中使用原始的SQL語(yǔ)句。

2、為最終用戶設(shè)計(jì)的完美管理界面

幾行簡(jiǎn)單的代碼就讓你的網(wǎng)站擁有一個(gè)強(qiáng)大的后臺(tái),輕松管理你的內(nèi)容!

不需要你花大量的工作來(lái)創(chuàng)建人員管理和更新內(nèi)容。Django自帶一個(gè)ADMIN site,類(lèi)似于內(nèi)容管理系統(tǒng)

3、一流的URL設(shè)計(jì)

用正則匹配網(wǎng)址,傳遞到對(duì)應(yīng)函數(shù),隨意定義,如你所想!你可以設(shè)計(jì)任意的URL,沒(méi)有框架的特定限定。像你喜歡的一樣靈活

4、設(shè)計(jì)者友好的模板語(yǔ)言

強(qiáng)大,易擴(kuò)展的模板系統(tǒng),設(shè)計(jì)簡(jiǎn)易,代碼,樣式分開(kāi)設(shè)計(jì),更容易管理。

使用django強(qiáng)大而可擴(kuò)展的模板語(yǔ)言,可以分隔設(shè)計(jì)、內(nèi)容和Python代碼。并且具有可繼承性。

5、緩存系統(tǒng)

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

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

三、架構(gòu)設(shè)計(jì)

django是一個(gè)基于MVC構(gòu)造的框架,即模型model,視圖view和控制器controller。

但是在django中,控制器接受用戶輸入的部分由框架自行處理,所以django里更關(guān)注的是模型model、模板template和視圖views,稱(chēng)為MTV模式。它們各自的職責(zé)如下:

從以上表述可以看出Django視圖不處理用戶輸入,而僅僅決定要展現(xiàn)哪些數(shù)據(jù)給用戶,而Django模板 僅僅決定如何展現(xiàn)Django視圖指定的數(shù)據(jù)。或者說(shuō), Django將MVC中的視圖進(jìn)一步分解為Django視圖 和Django模板兩個(gè)部分,分別決定 “展現(xiàn)哪些數(shù)據(jù)” 和 “如何展現(xiàn)”,使得Django的模板可以根據(jù)需要隨時(shí)替換,而不僅僅限制于內(nèi)置的模板。

至于MVC控制器部分,由Django框架的URLconf來(lái)實(shí)現(xiàn)。URLconf機(jī)制是使用正則表達(dá)式匹配URL,然后調(diào)用合適的Python函數(shù)。URLconf對(duì)于URL的規(guī)則沒(méi)有任何限制,你完全可以設(shè)計(jì)成任意的URL風(fēng)格,不管是傳統(tǒng)的,RESTful的,或者是另類(lèi)的。框架把控制層給封裝了,無(wú)非與數(shù)據(jù)交互這層都是數(shù)據(jù)庫(kù)表的讀,寫(xiě),刪除,更新的操作.在寫(xiě)程序的時(shí)候,只要調(diào)用相應(yīng)的方法就行了,感覺(jué)很方便。程序員把控制層?xùn)|西交給Django自動(dòng)完成了。 只需要編寫(xiě)非常少的代碼完成很多的事情。所以,它比MVC框架考慮的問(wèn)題要深一步,因?yàn)槲覀兂绦騿T大都在寫(xiě)控制層的程序。現(xiàn)在這個(gè)工作交給了框架,僅需寫(xiě)很少的調(diào)用代碼,大大提高了工作效率。

MVC:全名Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫(xiě),一種軟件設(shè)計(jì)典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí),不需要重新編寫(xiě)業(yè)務(wù)邏輯。

通俗解釋?zhuān)阂环N文件的組織和管理形式!不要被縮寫(xiě)嚇到了,這其實(shí)就是把不同類(lèi)型的文件放到不同的目錄下的一種方法,然后取了個(gè)高大上的名字。當(dāng)然,它帶來(lái)的好處有很多,比如前后端分離,松耦合等等,就不詳細(xì)說(shuō)明了。

模型(model):定義數(shù)據(jù)庫(kù)相關(guān)的內(nèi)容,一般放在models.py文件中。

視圖(view):定義HTML等靜態(tài)網(wǎng)頁(yè)文件相關(guān),也就是那些html、css、js等前端的東西。

控制器(controller):定義業(yè)務(wù)邏輯相關(guān),就是你的主要代碼。

MTV:有些WEB框架覺(jué)得MVC的字面意思很別扭,就給它改了一下。view不再是HTML相關(guān),而是主業(yè)務(wù)邏輯了,相當(dāng)于控制器。html被放在Templates中,稱(chēng)作模板,于是MVC就變成了MTV。這其實(shí)就是一個(gè)文字游戲,和MVC本質(zhì)上是一樣的,換了個(gè)名字和叫法而已,換湯不換藥。

四、工作機(jī)制

1.用manage .py runserver啟動(dòng)django服務(wù)器時(shí)就載入了在同一目錄下的settings .py。該文件包含了項(xiàng)目中的配置信息,如前面講的URLConf等,其中最重要的配置就是ROOT_URLCONF,它告訴django哪個(gè)python模塊應(yīng)該用作本站的URLConf,默認(rèn)的是urls .py

2.當(dāng)訪問(wèn)url的時(shí)候,django會(huì)根據(jù)ROOT_URLCONF的設(shè)置來(lái)裝載URLConf。

3.然后按順序逐個(gè)匹配URLConf里的URLpatterns。如果找到則會(huì)調(diào)用相關(guān)聯(lián)的視圖函數(shù),并把HttpRequest對(duì)象作為第一個(gè)參數(shù)(通常是request)

4.最后該view函數(shù)負(fù)責(zé)返回一個(gè)HttpResponse對(duì)象。


五、版本選擇

1.5.x支持python 2.6.5 python 2.7, python 3.2和3.3.

1.6.x支持python 2.6.X, 2.7.X, 3.2.X和3.3.X

1.7.x支持python 2.7, 3.2, 3.3,和3.4(注意:Python 2.6不支持了)

1.8.x支持python 2.7, 3.2, 3.3, 3.4和3.5.(長(zhǎng)期支持版本LTS)

1.9.x支持python 2.7, 3.4和3.5.不支持3.3了

?1.10.x支持python 2.7, 3.4和3.5.

1.11.x支持python 2.7, 3.4, 3.5和3.6,17年4月4號(hào) 已經(jīng)發(fā)布(長(zhǎng)期支持版本LTS)

一般來(lái)說(shuō),選擇長(zhǎng)期支持版本比較好。

使用最新版本的問(wèn)題就是,可能要用到的一些第三方插件沒(méi)有及時(shí)更新,無(wú)法正常使用這些三方包。

如果是學(xué)習(xí),可以選擇目前的django 1.8.x來(lái)進(jìn)行,遇到問(wèn)題也容易找到答案。

如果是正式啟動(dòng)的新項(xiàng)目,建議用django 1.11.x,畢竟django 1.9以后admin界面更漂亮些。

六、搭建開(kāi)發(fā)環(huán)境

安裝虛擬環(huán)境

使用Python進(jìn)行項(xiàng)目開(kāi)發(fā)時(shí),由于不同的項(xiàng)目需要,可能會(huì)配置多個(gè)開(kāi)發(fā)環(huán)境,不同開(kāi)發(fā)環(huán)境之間的項(xiàng)目依賴包如果混合在一起,可能會(huì)引起意想不到的錯(cuò)誤。

通過(guò)虛擬環(huán)境隔離不同開(kāi)發(fā)環(huán)境,方便不同開(kāi)發(fā)環(huán)境的共存。

#安裝python虛擬環(huán)境

sudo apt-get install virtualenv

#vrtaulenvwrapper是virtualenv的擴(kuò)展包,用于更方便管理虛擬環(huán)境

sudo apt-get install virtualenvwrapper

配置虛擬環(huán)境

此時(shí)還不能使用virtualenvwrapper,實(shí)際上你需要運(yùn)行virtualenvwrapper.sh文件才行。

配置步驟如下:

1、查看virtualenvwrapper的安裝路徑

sudo find / -name virtualenvwrapper.sh

2、創(chuàng)建目錄用來(lái)存放虛擬環(huán)境

mkdir .myvirtualenvs

3、在? .bashrc中添加行

export WORKON_HOME=/home/yong/.myvirtualenvs

source /usr/share/virtualenvwrapper/virtualenvwrapper.sh

4、運(yùn)行:source? .bashrc

此時(shí)virtualenvwrapper就可以使用了。


七、virtualenvwrapper的功能

配置好virtualenvwrapper,就可以使用它的功能,方便管理虛擬環(huán)境

workon:列出虛擬環(huán)境列表

lsvirtualenv:列出虛擬環(huán)境列表

mkvirtualenv:新建虛擬環(huán)境

workon [虛擬環(huán)境名稱(chēng)]:切換/進(jìn)入虛擬環(huán)境

rmvirtualenv :刪除虛擬環(huán)境

deactivate:離開(kāi)虛擬環(huán)境


八、創(chuàng)建虛擬環(huán)境

進(jìn)入本地虛擬環(huán)境的目錄文件夾

cd? .myvirtualenvs/

創(chuàng)建虛擬環(huán)境 根據(jù)需要選擇3和2

mkvirtualenv -p /usr/bin/python3 ?virtualenv-django

mkvirtualenv -p /usr/bin/python ?virtualenv-django

進(jìn)入虛擬環(huán)境

workon virtualenv-django

查看虛擬環(huán)境中已經(jīng)安裝的包

pip list

pip freeze

九、安裝django

建議安裝1.8.2版本,這是一個(gè)穩(wěn)定性高、使用廣、文檔多的版本

1.進(jìn)入虛擬環(huán)境

workon virtualenv-django

2.安裝django

pip install django==1.8.2

3.查看版本

進(jìn)入python shell

import django

django.get_version()

說(shuō)明:使用pip install django命令進(jìn)行安裝時(shí),會(huì)自動(dòng)刪除舊版本,再安裝新版本


十、創(chuàng)建項(xiàng)目

命令django-admin startproject test1

進(jìn)入test1目錄,目錄結(jié)構(gòu)如下圖:

manage.py:一個(gè)命令行工具,可以使你用多種方式對(duì)Django項(xiàng)目進(jìn)行交互

內(nèi)層的目錄test1:項(xiàng)目的真正的Python包

_init _.py:一個(gè)空文件,它告訴Python這個(gè)目錄應(yīng)該被看做一個(gè)Python包

settings.py:項(xiàng)目的配置

urls.py:項(xiàng)目的URL聲明

wsgi.py:項(xiàng)目與WSGI兼容的Web服務(wù)器入口

十一、設(shè)計(jì)模型

設(shè)計(jì)介紹

本示例完成“圖書(shū)-英雄”信息的維護(hù),需要存儲(chǔ)兩種數(shù)據(jù):圖書(shū)、英雄

1.圖書(shū)表結(jié)構(gòu)設(shè)計(jì):

表名:BookInfo

2.圖書(shū)名稱(chēng):btitle

3.圖書(shū)發(fā)布時(shí)間:bpub_date

2.英雄表結(jié)構(gòu)設(shè)計(jì)

表名:HeroInfo

5.英雄姓名:hname

[6.英雄性別:hgender

7.英雄簡(jiǎn)介:hcontent

8.所屬圖書(shū):hbook

3.圖書(shū)-英雄的關(guān)系為一對(duì)多

createtable bookinfo(

bidint auto_increment primary key,

btitle varchar(100),

bpubdate date

);

createtable heroinfo(

hidint auto_increment primary key,

hname varchar(100),

hgender bit,

hcontent longtext,

hbook_idint,foreign key(hbook_id) references bookinfo(bid)

);

設(shè)計(jì)成類(lèi),外鍵就是設(shè)計(jì)成一個(gè)對(duì)象

數(shù)據(jù)庫(kù)配置

1.在settings.py文件中,通過(guò)DATABASES項(xiàng)進(jìn)行數(shù)據(jù)庫(kù)設(shè)置

2.django支持的數(shù)據(jù)庫(kù)包括:sqlite、mysql等主流數(shù)據(jù)庫(kù)

3.Django默認(rèn)使用SQLite數(shù)據(jù)庫(kù)

1.1.1.創(chuàng)建應(yīng)用

在一個(gè)項(xiàng)目中可以創(chuàng)建一到多個(gè)應(yīng)用,每個(gè)應(yīng)用進(jìn)行一種業(yè)務(wù)處理

創(chuàng)建應(yīng)用的命令:

python manage.py startapp booktest

應(yīng)用的目錄結(jié)構(gòu)如下圖


定義模型類(lèi)

1.有一個(gè)數(shù)據(jù)表,就有一個(gè)模型類(lèi)與之對(duì)應(yīng)

2.打開(kāi)models.py文件,定義模型類(lèi)

3.引入包from django.db import models

4.模型類(lèi)繼承自models.Model類(lèi)

5.說(shuō)明:不需要定義主鍵列,在生成時(shí)會(huì)自動(dòng)添加,并且值為自動(dòng)增長(zhǎng)

6.當(dāng)輸出對(duì)象時(shí),會(huì)調(diào)用對(duì)象的str方法

from django.db import models

class BookInfo(models.Model):

??????? btitle = models.CharField(max_length=20)

??????? bpub_date = models.DateTimeField()

def __str__(self):

?????? return "%d" % self.pk


class HeroInfo(models.Model):

???????? hname = models.CharField(max_length=20)

???????? hgender = models.BooleanField()

???????? hcontent = models.CharField(max_length=100)

???????? hBook = models.ForeignKey('BookInfo')

def __str__(self):ls

????????? return "%d" % self.pk

生成數(shù)據(jù)表

1激活模型:編輯settings.py文件,將booktest應(yīng)用加入到installed_apps中


2.生成遷移文件:根據(jù)模型類(lèi)生成sql語(yǔ)句,遷移文件被生成到應(yīng)用的migrations目錄

python manage.py makemigrations

3.執(zhí)行遷移:執(zhí)行sql語(yǔ)句生成數(shù)據(jù)表

python manage.py migrate

在Python的開(kāi)發(fā)中,遇到了這個(gè)錯(cuò)誤:

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

解決方法如下:

在代碼文件的最上方,添加如下代碼:

import os,django

# project_name項(xiàng)目名稱(chēng)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings")

django.setup()

原因:

Python啟動(dòng)方式python,會(huì)啟動(dòng)交互解釋器,需要告訴Django使用哪個(gè)設(shè)置文件,Django會(huì)搜索DJANGO_SETTINGS_MODULE環(huán)境變量,它被設(shè)置在settings.py中,

解決方法:用python manage.py shell來(lái)啟動(dòng)命令解釋器而不是python,因?yàn)閜ython manage.py shell中包含了Django使用哪個(gè)settings.py文件

1.1.1.6測(cè)試數(shù)據(jù)操作

1.激活進(jìn)入python shell,進(jìn)行簡(jiǎn)單的模型API練習(xí)

python manage.py shell

2.引入需要的包:

from booktest.models import *

from datetime import *

3.單個(gè)對(duì)象的增刪改查

4.關(guān)聯(lián)對(duì)象的操作

引入需要的包:

from booktest.models import *

from datetime import *

**************單個(gè)對(duì)象的操作**************

1、查詢所有圖書(shū)信息:

BookInfo.objects.all()

2、新建圖書(shū)信息:

b = BookInfo()

b.btitle="射雕英雄傳"

b.bpub_date=datetime(year=1990,month=1,day=10)

b.save()

3、查找圖書(shū)信息:

b=BookInfo.objects.get(pk=1)

輸出圖書(shū)信息:

b

b.id

b.btitle

4、修改圖書(shū)信息:

b.btitle="天龍八部"

b.save()

5、刪除圖書(shū)信息:

b.delete()

**************關(guān)聯(lián)對(duì)象的操作**************

1、對(duì)于HeroInfo可以按照下面的操作方式進(jìn)行

添加,注意添加關(guān)聯(lián)對(duì)象

h=HeroInfo()

h.htitle=u'郭靖'

h.hgender=True

h.hcontent='降龍十八掌'

h.hbook=b

h.save()

2、獲得關(guān)聯(lián)集合:返回當(dāng)前book對(duì)象的所有hero

b=BookInfo.objects.get(pk=1)

b.heroinfo_set.all()1、創(chuàng)建項(xiàng)目

django-admin startporject xx

2、創(chuàng)建app

python manage.py startapp yy

python manage.py startapp cc

3、將app添加到settting.py? ? INSTALLED_APPS

4、創(chuàng)建sql(不需要實(shí)現(xiàn))

5、實(shí)體類(lèi)

6、生成遷移文件

python manage.py makemigrations

7、遷移,生成sql表

python manage.py migrate

8、測(cè)試增刪改查

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.mysql',

'NAME': 'mydb',

'USER': 'root',

'PASSWORD': 'root',

'HOST': 'localhost',

'PORT': '3306',

}

}

9、修改實(shí)體類(lèi),重新遷移

建議,數(shù)據(jù)庫(kù)整個(gè)刪除,再遷移,避免報(bào)錯(cuò)。

class BookInfo(models.Model):

btitle = models.CharField(max_length=20)

bpub_date = models.DateTimeField()

def __str__(self):

return "%d" % self.pk

class HeroInfo(models.Model):

hname = models.CharField(max_length=20)

hgender = models.BooleanField()

hcontent = models.CharField(max_length=100)

hBook = models.ForeignKey('BookInfo')

def __str__(self):

return "%d" % self.pk

整理歸納流程:

1、創(chuàng)建項(xiàng)目

django-admin startporject xx

2、創(chuàng)建app

python manage.py startapp yy

python manage.py startapp cc

3、將app添加到settting.py? ? INSTALLED_APPS

4、創(chuàng)建sql(不需要實(shí)現(xiàn))

5、實(shí)體類(lèi) 在app里面的models.py操作。

class BookInfo(models.Model):

??????? btitle = models.CharField(max_length=20)

??????? bpub_date = models.DateTimeField()

def __str__(self):

???????? return "%d" % self.pk

class HeroInfo(models.Model):

????????? hname = models.CharField(max_length=20)

????????? hgender = models.BooleanField()

????????? hcontent = models.CharField(max_length=100)

????????? hBook = models.ForeignKey('BookInfo')

def __str__(self):

????????? return "%d" % self.pk

6、生成遷移文件 在manage.py這個(gè)當(dāng)前目錄中執(zhí)行。

python manage.py makemigrations

7、遷移,生成sql表

python manage.py migrate

8、測(cè)試增刪改查


9、修改實(shí)體類(lèi),重新遷移

建議,數(shù)據(jù)庫(kù)整個(gè)刪除,再遷移,避免報(bào)錯(cuò)。




修改settings.py文件下的DATABASES,添加mysql數(shù)據(jù)庫(kù)。

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.mysql',

'NAME': 'mydb',

'USER': 'root',

'PASSWORD': 'root',

'HOST': 'localhost',

'PORT': '3306',

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容