Django是一個開放源代碼的Web應用框架,由Python寫成。採用了MVC的框架模式,即模型M,視圖V和控制器C。它最初是被開發來用於管理勞倫斯出版集團旗下的一些以新聞內容爲主的網站的,便是CMS(內容管理系統)軟件。並於2005年7月在BSD許可證下發布。這套框架是以比利時的吉普賽爵士吉他手Django Reinhardt來命名的。css
Django 項目是一個python定製框架,它源自一個在線新聞 Web 站點,於 2005 年以開源的形式被釋放出來。Django 框架的核心組件有:html
用於建立模型的對象關係映射java
爲最終用戶設計的完美管理界面python
一流的 URL 設計mysql
設計者友好的模板語言web
緩存系統。正則表達式
Django 是用python語言寫的開源web開發框架(open source web framework),它鼓勵快速開發,並遵循MVC設計。Django遵照BSD版權,初次發佈於2005年7月, 並於2008年9月發佈了第一個正式版本1.0 。sql
Django 根據比利時的爵士音樂家Django Reinhardt命名,他是一個吉普賽人,主要以演奏吉它爲主,還演奏太小提琴等。shell
因爲Django在近年來的迅速發展,應用愈來愈普遍,被著名IT開發雜誌SD Times評選爲2013 SD Times 100,位列「API、庫和框架」分類第6位,被認爲是該領域的佼佼者[1] 。數據庫
Web 框架簡單,易學易上手,可是本身要着手處理不少問題。 框架複雜,學習週期稍長,可是不少問題框架已經處理或屏蔽。
同類框架---> tornado flask
2005年面世, 目前比較成熟的版本:1.10.1,支持python2.七、3.四、3.5
Django是一個基於MVC構造的框架。不過在Django中、控制器接受用戶輸入的部分由框架自行處理,因此 Django 裏更關注的是模型(Model)、模板(Template)和視圖(Views),稱爲 MTV模式。
大部分開發語言中都用到MVC框架
MVC框架的核心思想是:解耦
下降各功能模塊值間的耦合性,方便變動,更容易重構代碼,最大程度上實現代碼的重用
M:表示Model,只要用於對數據庫層的封裝
V:表示View,用於向用戶展現結果
C:表示Controller,是核心,用於處理請求,獲取數據,返回結果
M:Model 模型 負責業務對象和數據對象,處理與數據相關的全部事務: 如何存取、如何驗證有效性、包含哪些行爲以及數據之間的關係等。(即與數據庫進行相關交互操做)
T:Template 模板 存取模型及調取恰當模板的相關邏輯。模型與模板的橋樑。即(頁面展現)
V:View 視圖 處理與表現相關的決定: 如何在頁面或其餘類型文檔中進行顯示。(業務邏輯的實現)
用manage .py runserver 啓動Django服務器時就載入了在同一目錄下的settings .py。該文件包含了項目中的配置信息,如前面講的URLConf等,其中最重要的配置就是ROOT_URLCONF,它告訴Django哪一個Python模塊應該用做本站的URLConf,默認的是urls.py
當訪問url的時候,Django會根據ROOT_URLCONF的設置來裝載URLConf。
而後按順序逐個匹配URLConf裏的URLpatterns。若是找到則會調用相關聯的視圖函數,並把HttpRequest對象做爲第一個參數(一般是request)
最後該view函數負責返回一個HttpResponse對象。
強大的數據庫支持:用python的類繼承,幾行代碼就能夠擁有一個豐富,動態的數據庫操做接口(API),若是須要你也能執行SQL語句
靈活的URL轉發:使用正則表達式匹配URL,你能夠設計任意的URL,沒有框架的特定限定,靈活高效。
強大的模板系統:使用Django強大而可擴展的模板語言,能夠分隔設計、內容和Python代碼。而且具備可繼承性。
便捷的表單處理:你能夠方便的生成各類表單模型,實現表單的有效性檢驗。能夠方便的從你定義的模型實例生成相應的表單。
緩存系統:與memcached或其它的緩存系統聯用,更出色的表現,更快的加載速度。
會話系統:內置session存儲技術用戶登陸與權限檢查,快速開發用戶會話功能。
國際化:內置國際化系統,方便開發出多種語言的網站。
Django官方網站:https://www.djangoproject.com/
Django documentation:https://www.djangoproject.com/en/dev/
The Django Book:http://djangobook.py3k.cn/
Django 基礎教程:https://code.ziqiangxuetang.com/django/django-tutorial/html
Django 學習交流論壇:http://www.pythonzh.cn/
Django入門學習規劃與資料推薦:http://zmrenwu.com/post/15/
1.1 環境搭建
1.2 定義模型
1.3 使用後臺管理
1.4 編寫視圖
1.5 定義模板
pip install virtualenv 或者 pip install virtualenvwrapper-win
安裝完成後建立虛擬環境:virtualenv 虛擬環境名 或者 mkvirtualenv 虛擬環境名稱
進入到Script中執行activate啓動虛擬環境 或者 workon 虛擬環境名稱
進入到Script中執行deactivate關閉虛擬環境 或者 deactivate
查看當前環境的擴展包:pip list
pip install django==1.11
詳細說明:https://blog.csdn.net/submarineas/article/details/84551883
驗證是否安裝成功,在python交互式命令下:
import django
django.VERSION
(1, 10, 1, u'final', 0)
django.get_version()
'1.11'
django-admin startproject demo(項目名稱)
會在當前目錄下生成一個文件夾,包含manage.py 和一個名爲demo的文件夾
一個Django項目至少要包含1個以上的應用app
python web項目中只有設置的靜態文件夾才能夠直接被外部訪問
切換到新生成的項目文件夾下
python manage.py startapp appname(項目名稱)
生成的目錄結構
主文件夾
Demo1 項目文件夾
settings.py :整個Django項目的配置文件
urls.py:整個Django項目的路由(全部的請求都是經過整個文件找到對應的頁面)
wsgi.py:項目部署的時候使用的框架
appname 應用文件夾
templates 模板文件夾(可能須要手動添加)
static 靜態文件夾(可能須要手動添加)
__init__.py app初始化文件,說明該文件夾是一個python包
admin.py app 管理文件,添加後臺管理時會用
apps.py app配置文件
models.py 數據庫模板文件。
tests.py 測試文件
view.py 視圖文件,主要的後臺業務處理
manage.py 項目管理文件
修改Settings.py中的INSTALLED_APPS,在最後添加上剛剛的APP的名字,若是是pycharm建立的項目不須要手動添加。
使用pycharm打開項目注意選擇虛擬環境
在項目的settings.py文件中找到LANGUAGE_CODE = 'en-us'
改爲 LANGUAGE_CODE = 'zh-hans'
在項目的settings.py文件中找到TIME_ZONE = 'UTC' 改爲TIME_ZONE = ‘Asia/Shanghai’
python manage.py runserver [127.0.0.1:8080] 最後一個參數可選,指定IP和端口號
啓動成功後在瀏覽器中輸入127.0.0.1:8080看到 it works或者它正常工做了,則項目搭建成功
在setttings.py中的DATABASES字典中添加配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'inner_manage',
'USER':'root',
'PASSWORD':'toor',
'HOST':'127.0.0.1',
'PORT':'3306'
}
}
須要安裝mysqlclient(虛擬環境下安裝):pip install mysqlclient
若是安裝不成功,須要進行源碼安裝:去官網下載相似於mysqlclient-1.4.4-cp37-cp37m-win32.whl這樣的源碼文件。
安裝也是在虛擬環境下安裝,進入虛擬環境,轉到源碼文件的目錄下安裝,pip install mysqlclient-1.4.4-cp37-cp37m-win32.whl
pycharm建立的項目有諸多限制,建議使用命令行建立項目和app。採用pycharm進行編輯和開發。
雙擊pycharm安裝包運行安裝
pycharm採用java開發,因此安裝運行時須要jre的執行環境。
安裝完成後提示須要激活pycharm,選擇License server
,輸入http://idea.imsxm.com/
,active便可激活。
選擇File-->New Project-->選擇Django,選擇python版本和項目路徑
在more settings中輸入application name能夠在建立項目是包含一個app。
若是不生成初始的app,則須要手動執行命令行添加app。
生成後的項目目錄結構和利用命令行建立的項目路徑一致。其他的操做就都和上面同樣。
經過修改Run-->Edit Configurations中的Port修改訪問項目的端口號,默認是8000有可能被佔用。
pycharm的右上角有一個綠色的小箭頭,點擊後下方出現控制檯,而且輸出如下內容,則說明項目啓動成功。
System check identified no issues (0 silenced).
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
November 06, 2018 - 14:01:10
Django version 1.10.1, using settings 'SQLT.settings'
Starting development server at http://127.0.0.1:8081/
Quit the server with CTRL-BREAK.
訪問流程:客戶瀏覽器的請求先到達url.spy中,在urlpatterns列表中尋找相應的路徑(經過正則表達式進行匹配),經過路徑找到views中對應的函數或方法,而後將請求提交給views中進行處理,views經過從models獲取到數據,並經過數據將templates中的頁面渲染,並響應給客戶端。
Django整站技術架構
本示例完成「商品分類-商品」信息的維護,須要存儲兩種數據:分類、商品
分類表結構設計:
表名:TypeInfo
類型名稱:tname
類型添加時間:tadd_date
商品表結構設計:
表名:GoodsInfo
商品名稱:gname
商品價格:gprice
商品簡介:gdetail
所屬分類:gtype
分類-商品的關係爲一對多
在settings.py文件中,經過DATABASES項進行數據庫設置
django支持的數據庫包括:sqlite、mysql等主流數據庫
Django默認使用SQLite數據庫
在一個項目中能夠建立一到多個應用,每一個應用進行一種業務處理
建立應用的命令:
python manage.py startapp goods
有一個數據表,就有一個模型類與之對應
打開models.py文件,定義模型類
引入包from django.db import models
模型類繼承自models.Model類
說明:不須要定義主鍵列,在生成時會自動添加,而且值爲自動增加
當輸出對象時,會調用對象的str方法
from django.db import models
class TypeInfo(models.Model):
tname = models.CharField(max_length=20,verbose_name='分類名稱')
tadd_date = models.DateTimeField()
def _ _str_ _(self):
return "%d" % self.pk
class GoodsInfo(models.Model):
gname...
gprice...
gdetail...
isDelete...
gtype = models.ForeignKey(TypeInfo,on_delete=models.CASCADE)# 級聯刪除
def __str__(self):
return self.gname
激活模型:編輯settings.py文件,將goods應用加入到installed_apps中
生成遷移文件:根據模型類生成sql語句
python manage.py makemigrations
遷移文件被生成到應用的migrations目錄
執行遷移:執行sql語句生成數據表
python manage.py migrate
進入python shell,進行簡單的模型API練習
python manage.py shell
引入須要的包:
from booktest.models import BookInfo,HeroInfo from django.utils import timezone from datetime import *
查詢全部分類信息:
TypeInfo.objects.all()
新建分類信息:
t = TypeInfo() t.tname="圖書" t.badd_date=datetime(year=1990,month=1,day=10) t.save()
查找分類信息:
t=TypeInfo.objects.get(pk=1)
輸出分類信息:
t t.id t.tname
修改分類信息:
t.tname="零食" t.save()
刪除圖書信息:
t.delete()
對於HeroInfo能夠按照上面的操做方式進行
添加,注意添加關聯對象
g=GoodsInfo() g.gname='開心果' g.hprice=100 g.gdetail='開開心心' g.gtype=t g.save()
得到關聯集合:返回當前type對象的全部goods
t.goodsinfo_set.all()
有一個TypeInfo存在,必需要有一個GoodsInfo對象,提供了建立關聯的數據:
g=t.goodsinfo_set.create(gname='碧根果',gprice=100,gdetail='好吃不上火')
站點分爲「內容發佈」和「公共訪問」兩部分
「內容發佈」的部分負責添加、修改、刪除內容,開發這些重複的功能是一件單調乏味、缺少創造力的工做。爲此,Django會根據定義的模型類徹底自動地生成管理模塊
建立一個管理員用戶
python manage.py createsuperuser,按提示輸入用戶名、郵箱、密碼
啓動服務器,經過「127.0.0.1:8000/admin」訪問,輸入上面建立的用戶名、密碼完成登陸
進入管理站點,默承認以對groups、users進行管理
編輯settings.py文件,設置編碼、時區
LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai'
打開goods/admin.py文件,註冊模型
from django.contrib import admin from models import TypeInfo,GoodsInfo # 註冊方式以下: admin.site.register(TypeInfo) admin.site.register(GoodsInfo)
刷新管理頁面,能夠對TypeInfo的數據進行增刪改查操做
問題:若是在str方法中返回中文,在修改和添加時會報ascii的錯誤
解決:在str()方法中,將字符串末尾添加「.encode('utf-8')」
Django提供了admin.ModelAdmin類
經過定義ModelAdmin的子類,來定義模型在Admin界面的顯示方式
class GoodsInfoAdmin(admin.ModelAdmin): ... # 註冊方式以下: admin.site.register(GoodsInfo,GoodsInfoAdmin)
list_display:顯示字段,能夠點擊列頭進行排序
list_display = ['pk', 'gname', 'gprice']
list_filter:過濾字段,過濾框會出如今右側
list_filter = ['gname']
search_fields:搜索字段,搜索框會出如今上側
search_fields = ['gname']
list_per_page:分頁,分頁框會出如今下側
list_per_page = 10
fields:屬性的前後順序
fields = ['gname', 'gprice']
fieldsets:屬性分組
fieldsets = [ ('basic',{'fields': ['gname']}), ('more', {'fields': ['gprice']}), ]
對於GoodsInfo模型類,有兩種註冊方式
方式一:與TypeInfo模型類相同
方式二:關聯註冊
按照TypeInfo的註冊方式完成GoodsInfo的註冊
接下來實現關聯註冊
from django.contrib import admin from models import TypeInfo,GoodsInfo class GoodsInfoInline(admin.StackedInline): model = GoodsInfo extra = 2 class TypeInfoAdmin(admin.ModelAdmin): inlines = [GoodsInfoInline] admin.site.register(TypeInfo, TypeInfoAdmin)
能夠將內嵌的方式改成表格
class GoodsInfoInline(admin.TabularInline)
發佈性別的顯示不是一個直觀的結果,可使用方法進行封裝
models.py模型類中定義 def gender(self): if self.hgender: return '男' else: return '女' gender.short_description = '性別'
在admin註冊中使用gender代替hgender
class HeroInfoAdmin(admin.ModelAdmin): list_display = ['id', 'hname', 'gender', 'hcontent']
在django中,視圖對WEB請求進行迴應
視圖接收reqeust對象做爲第一個參數,包含了請求的信息
視圖就是一個Python函數,被定義在views.py中
from django.http import HttpResponse def index(request): return HttpResponse("index") def detail(request,id): return HttpResponse("detail %s" % id)
定義完成視圖後,須要配置urlconf,不然沒法處理請求
在Django中,定義URLconf包括正則表達式、視圖兩部分
Django使用正則表達式匹配請求的URL,一旦匹配成功,則調用應用的視圖
注意:只匹配路徑部分,即除去域名、參數後的字符串
在test1/urls.py插入goods,使主urlconf鏈接到goods.urls模塊
url(r'^', include('goods.urls')),
在goods中的urls.py中添加urlconf
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index), url(r'^([0-9]+)/$', views.detail), ]
模板是html頁面,能夠根據視圖中傳遞的數據填充值
修改settings.py文件,設置TEMPLATES的DIRS值
'DIRS': [os.path.join(BASE_DIR, 'templates')],
在模板中訪問視圖傳遞的數據
{{輸出值,能夠是變量,也能夠是對象.屬性}} {%執行代碼段%}
<!DOCTYPE html> <html> <head> <title>首頁</title> </head> <body> <h1>圖書列表</h1> <ul> {%for good in goodslist%} <li> <a href="{{good.id}}"> {{good.gname}} </a> </li> {%endfor%} </ul> </body> </html>
在模板中訪問對象成員時,都以屬性的方式訪問,即方法也不能加括號
編輯views.py文件,在方法中調用模板
from django.http import HttpResponse from django.template import RequestContext, loader from models import GoodsInfo def index(request): goodslist = GoodsInfo.objects.all() template = loader.get_template('index.html') context = RequestContext(request, {'goodslist': goodslist}) return HttpResponse(template.render(context)) def detail(reqeust, id): good = GoodsInfo.objects.get(pk=id) template = loader.get_template('detail.html') context = RequestContext(reqeust, {'good': good}) return HttpResponse(template.render(context))
在index.html模板中,超連接是硬編碼的,此時的請求地址爲「127.0.0.1/1/」
<a href="{{good.id}}">
看以下狀況:將urlconf中詳細頁改成以下,連接就找不到了
url(r'^good/([0-9]+)/$', views.detail),
此時的請求地址應該爲「127.0.0.1/good/1/」
問題總結:若是在模板中地址硬編碼,未來urlconf修改後,地址將失效
解決:使用命名的url設置超連接
修改test1/urls.py文件,在include中設置namespace
url(r'^admin/', include(admin.site.urls, namespace='booktest')),
修改good/urls.py文件,設置name
url(r'^book/([0-9]+)/$', views.detail, name="detail"),
修改index.html模板中的連接
<a href="{%url 'good:detail' book.id%}">
Django提供了函數Render()簡化視圖調用模板、構造上下文
from django.shortcuts import render from models import GoodsInfo def index(reqeust): goodslist = GoodsInfo.objects.all() return render(reqeust, 'index.html', {'goodslist': goodslist}) def detail(reqeust, id): good = GoodsInfo.objects.get(pk=id) return render(reqeust, 'detail.html', {'good': good})
在app的文件夾下建立一個名爲static的文件夾,將css js image等文件放在static目錄下。
settings.py STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), )
在html文件頭部添加{% load static %}
,在html文件中連接資源文件的地方,改寫成{% static 'css/style.css' %}
。便可實現動態訪問,修改方便
總結:項目搭建過程:命令行
1.建立項目工程:django-admin startproject 項目名稱
2.建立應用(模塊):進入到manage.py所在目錄:python manage.py startapp 應用名稱goods
3.settings.py:INSTALLED_APPA ->goods
4.編寫模型
5.python manage.py makemigrations(生成遷移文件)
6.同步數據庫完成遷移:python manage.py migrate
7.建立超級用戶:python manage.py createsuperuser 用戶名 郵箱 密碼 再次輸入密碼