Django 簡(jiǎn)介
Django基于python的高級(jí)web開發(fā)框架离钝。Django遵守BSD版權(quán)穴亏,初次發(fā)布于2005年7月, 并于2008年9月發(fā)布了第一個(gè)正式版本1.0 玫锋。Django采用了MVC的軟件設(shè)計(jì)模式,即模型M权薯,視圖V和控制器C姑躲。
Django安裝
sudo pip install Django
測(cè)試是否安裝成功:終端輸入代碼
python -m django --version
如果顯示安裝的版本,就說(shuō)明安裝成功了盟蚣。
Django使用
創(chuàng)建項(xiàng)目
- 創(chuàng)建項(xiàng)目
打開命令行黍析,到想要?jiǎng)?chuàng)建項(xiàng)目的目錄,執(zhí)行:
django-admin startproject myblog
之后ls
顯示該文件夾名屎开,說(shuō)明創(chuàng)建成功阐枣。
- 啟動(dòng)服務(wù)器
myblog
目錄下有manage.py
的文件,打開命令行輸入:
python manage.py
可以看到所有相關(guān)的命令奄抽,其中有一個(gè)是runserver
蔼两,根據(jù)名字就可以知道是啟動(dòng)服務(wù)器,所以輸入命令:
python manage.py runserver
返回結(jié)果:
Starting development server at http://127.0.0.1:8000/
- 訪問(wèn)網(wǎng)址
打開瀏覽器訪問(wèn)網(wǎng)址127.0.0.1:8000/
或者localhost:8000
訪問(wèn)逞度。
返回以下結(jié)果表示成功
It worked!
Congratulations on your first Django-powered page.
如果想要改變服務(wù)器的端口號(hào)额划,在runserver
的結(jié)尾處加上新的端口號(hào)即可:
python manage.py runserver 99999
- 工程目錄說(shuō)明:
在myblog目錄下自動(dòng)生成有一些py文件。
- urls.py: URL配置文件档泽。Django 項(xiàng)目的 URL 聲明俊戳, 一份由 Django 驅(qū)動(dòng)的網(wǎng)站"目錄"。
- wsgi.py: web服務(wù)器網(wǎng)關(guān)接口(Python Web Server Gateway Interface)馆匿。python應(yīng)用與web服務(wù)器之間的接口抑胎。
- settings.py: 項(xiàng)目的總配置文件。包括:數(shù)據(jù)庫(kù)渐北、web應(yīng)用阿逃、時(shí)間、編碼等
(1)BASE_DIR
:項(xiàng)目根目錄
(2)SECRET_KEY
:項(xiàng)目的安全碼,Django自動(dòng)生成。
(3)DEBUG = True/False
:調(diào)試開關(guān)
(4)ALLOWED_HOSTS
:訪問(wèn)主機(jī)列表盆昙,不為空則只能通過(guò)列表里的域名羽历、IP來(lái)訪問(wèn)網(wǎng)站
(5)INSTALLED_APPS
:項(xiàng)目的應(yīng)用列表焊虏,若創(chuàng)建了一個(gè)應(yīng)用淡喜,要把應(yīng)用名寫在列表里
(6)MIDDLEWARE
:中間件,Django自帶的工具集诵闭。
(7)TEMPLATES
:模板
(8)DATABASES
:數(shù)據(jù)庫(kù)配置
(9)LANGUAGE_CODE
:語(yǔ)言配置
創(chuàng)建應(yīng)用
- 創(chuàng)建應(yīng)用
命令行在manage.py
下炼团,執(zhí)行
python manage.py startapp blog
打開編譯器,看到生成blog
文件夾疏尿。
注意:
在settings.py
下的INSTALLED_APPS
中添加blog
瘟芝。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog'
]
- 應(yīng)用目錄結(jié)構(gòu)
- migrations 文件遷移模塊
- admin.py 后臺(tái)管理系統(tǒng)配置文件
- app.py 該應(yīng)用的配置文件
- models.py 數(shù)據(jù)庫(kù)框架 ORM框架
- tests.py 自動(dòng)化測(cè)試模塊
- views.py 執(zhí)行響應(yīng)的代碼所在模塊
創(chuàng)建頁(yè)面/響應(yīng)
- 編寫響應(yīng)函數(shù)
view.py
中編寫響應(yīng)函數(shù)廉白,比如index()
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World')
- 配置url
方法1
urls.py
中配置響應(yīng)函數(shù)的url
from blog import views
urlpatterns = [
url(r'^index/', views.index),
]
注意:url
是正則表達(dá)式
但是如果url都配置在這里歇父,那么多頁(yè)面扛伍,這里的配置勢(shì)必會(huì)爆炸订讼。
方法2
myblog.urls.py
中配置
from django.conf.urls import url, include
urlpatterns = [
url(r'^index/', include('blog.urls')),
]
然后在blog應(yīng)用下新建文件urls.py
然后在新建的blog.urls.py
中配置
from django.conf.urls import url
from blog import views
urlpatterns = [
url(r'^index/', views.index),
]
但是發(fā)現(xiàn)在瀏覽器輸入http://127.0.0.1:8000/index/
并找不到頁(yè)面谆膳,而是需要
http://127.0.0.1:8000/index/index/
诬辈。因?yàn)?code>myblog.urls.py中配置的路徑中已經(jīng)有了一層index
- 改進(jìn)1
新建的blog.urls.py
中配置
from django.conf.urls import url
from blog import views
urlpatterns = [
url(r'', views.index),
]
在瀏覽器輸入http://127.0.0.1:8000/index/
頁(yè)面顯示正確颓哮,但是
http://127.0.0.1:8000/index/xxx
也會(huì)顯示同樣的內(nèi)容常摧,因此空格內(nèi)容需要正則表達(dá)式進(jìn)行限制磕洪。
- 改進(jìn)2
blog.urls.py
中配置
urlpatterns = [
url(r'^$', views.index),
]
- 改進(jìn)3
為了更易讀的顯示
myblog.urls.py
中配置
urlpatterns = [
url(r'^blog/', include('blog.urls')),
]
blog.urls.py
中配置
urlpatterns = [
url(r'^index/$', views.index),
]
注意index
后面的/
模板Templates
其實(shí)就是HTML文件吭练。
默認(rèn)是Django模板語(yǔ)言(DTL: Django Template Language)。
也支持第三方模板析显,比如jinia2
創(chuàng)建模板
- 在
app
根目錄下創(chuàng)建templates
目錄鲫咽。 -
templates
目錄下新建index.html
<html>
<head>
<title>my first html!</title>
</head>
<body>---
<p>hello world!</p>
</body>---
</html>
- 將
view.py
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World')
改為
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
DTL 使用
render()
函數(shù)支持一個(gè)dict
類型參數(shù)谷异。
該字典是后端傳遞數(shù)據(jù)到模板(前端)的參數(shù)分尸,鍵值為參數(shù)名。
在模板中使用{{參數(shù)名}}
來(lái)直接使用歹嘹。
例子:
在view.py
傳入?yún)?shù)
from django.shortcuts import render
def index(request):
return render(request, 'index.html', {'hello_name':'xiaoming')
然后在index.html
中使用后端傳來(lái)的該參數(shù),訪問(wèn)頁(yè)面即可看到效果箩绍。
<html>
<head>
<title>my first html!</title>
</head>
<body>---
<p>hello {{hello_name}}!</p>
</body>---
</html>
注意:
- 不同app應(yīng)用下
templates
的同名.html
會(huì)沖突:
Django
按照settings.py
中的INSTALLED_APPS
的順序查找templates
荞下。如果兩個(gè)app應(yīng)用下的html文件重名伶选,比如blog1應(yīng)用
下的index.html
和blog2應(yīng)用
下的index.html
重名,且INSTALLED_APPS
中先聲明了blog1
,那么執(zhí)行結(jié)果會(huì)都使用blog1
下的index.html
.
解決辦法:
在app的templates
目錄新建以app名
為名稱的目錄尖昏。將html
放入該目錄下即可仰税。
然后修改view.py
的html
路徑
def index(request):
return render(request, 'blog/index.html', {'hello_name':'xiaoming'})
Models
Models簡(jiǎn)介
通常,一個(gè)models
對(duì)應(yīng)數(shù)據(jù)庫(kù)的一張數(shù)據(jù)表
Django
中models
以類的形式表現(xiàn),它包含了一些基本字段以及數(shù)據(jù)的一些行為
ORM:對(duì)象關(guān)系映射(object relation mapping),實(shí)現(xiàn)了對(duì)象和數(shù)據(jù)庫(kù)自己的映射抽诉,隱藏了數(shù)據(jù)訪問(wèn)的細(xì)節(jié)陨簇,不需要編寫SQL語(yǔ)句。
Models編寫
- 在app根目錄下創(chuàng)建
models.py
,并引入models
模塊迹淌,創(chuàng)建類河绽,繼承models.Model
,該類即是一張數(shù)據(jù)表己单。 - 創(chuàng)建字段
字段即類里的屬性。比如models.py
創(chuàng)建類Article
:
class Article(models.Model):
title = models.CharField(max_length=32, default='title')
content = models.TextField(null=True)
- 生成數(shù)據(jù)表
執(zhí)行命令:
python manage.py makemigrations app名(可選)
python manage.py migrate
Django
會(huì)自動(dòng)在migrations
目錄下生成遷移文件耙饰,比如0001_initial.py
,
并在應(yīng)用根目錄下生成db.sqlite3
纹笼。
推薦使用SQLite Expert Personal
打開sqlite3
文件, 添加數(shù)據(jù)
- 頁(yè)面呈現(xiàn)數(shù)據(jù)
(1)后端
在view.py
中
def index(request):
article = models.Article.objects.get(pk=1)
return render(request, 'blog/index.html', {'article':article})
(2)前端
模板可以直接使用對(duì)象以及對(duì)象.
操作
在index.html
中
{{article.title}}
Admin
Django自帶的功能強(qiáng)大的自動(dòng)化數(shù)據(jù)管理界面,可以
- 管理數(shù)據(jù)庫(kù)
- 定制功能
配置Admin
- 創(chuàng)建超級(jí)用戶
python manage.py createsuperuser
然后輸入賬號(hào)密碼即可苟跪。
- 登錄
瀏覽器輸入http://localhost:8000/admin/
, 然后賬號(hào)密碼登錄廷痘。
- 修改語(yǔ)言
默認(rèn)為英文,想要中文顯示件已,修改setting.py
中的
LANGUAGE_CODE = 'en-us'
為
LANGUAGE_CODE = 'zh_Hans'
- 配置應(yīng)用
在應(yīng)用admin.py
中引入自身的models
模塊笋额。
import models
admin.site.register(models.Article)
刷新頁(yè)面,就會(huì)看見篷扩,自己的應(yīng)用Blog
兄猩,可以進(jìn)行編輯。
- 修改數(shù)據(jù)默認(rèn)顯示名稱
新建數(shù)據(jù)后鉴未,會(huì)發(fā)現(xiàn)顯示的名稱都是Article object
枢冤。
解決:
在models.py
的Article
類中添加方法
python2.7 添加__unicode__
class Article(models.Model):
title = models.CharField(max_length=32, default='title')
content = models.TextField(null=True)
def __unicode__(self):
return self.title
python3添加__str__
class Article(models.Model):
title = models.CharField(max_length=32, default='title')
content = models.TextField(null=True)
def __str__(self):
return self.title