Django入門與實(shí)踐

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)目

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

打開命令行黍析,到想要?jiǎng)?chuàng)建項(xiàng)目的目錄,執(zhí)行:

django-admin startproject myblog

之后ls顯示該文件夾名屎开,說(shuō)明創(chuàng)建成功阐枣。

  1. 啟動(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/
  1. 訪問(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
  1. 工程目錄說(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)用
  1. 創(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'
]
  1. 應(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)

  1. 編寫響應(yīng)函數(shù)

view.py中編寫響應(yīng)函數(shù)廉白,比如index()

from django.http import HttpResponse
def index(request):
    return HttpResponse('Hello World')
  1. 配置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

  1. 改進(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)行限制磕洪。

  1. 改進(jìn)2

blog.urls.py中配置

urlpatterns = [
    url(r'^$', views.index),
]

  1. 改進(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)建模板
  1. app根目錄下創(chuàng)建templates目錄鲫咽。
  2. templates目錄下新建index.html
<html>

<head>

<title>my first html!</title>

</head>

<body>---

<p>hello world!</p>

</body>---

</html>
  1. 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>

注意:

  1. 不同app應(yīng)用下templates同名.html會(huì)沖突:
    Django按照settings.py中的INSTALLED_APPS的順序查找templates荞下。如果兩個(gè)app應(yīng)用下的html文件重名伶选,比如blog1應(yīng)用下的index.htmlblog2應(yīng)用下的index.html重名,且INSTALLED_APPS中先聲明了blog1,那么執(zhí)行結(jié)果會(huì)都使用blog1下的index.html.
    解決辦法:
    在app的templates目錄新建以app名為名稱的目錄尖昏。將html放入該目錄下即可仰税。
    然后修改view.pyhtml路徑
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ù)表
Djangomodels以類的形式表現(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編寫
  1. 在app根目錄下創(chuàng)建models.py,并引入models模塊迹淌,創(chuàng)建類河绽,繼承models.Model,該類即是一張數(shù)據(jù)表己单。
  2. 創(chuàng)建字段
    字段即類里的屬性。比如models.py創(chuàng)建類Article
class Article(models.Model):
    title = models.CharField(max_length=32, default='title')
    content = models.TextField(null=True)
  1. 生成數(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ù)

  1. 頁(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
  1. 創(chuàng)建超級(jí)用戶
python manage.py createsuperuser

然后輸入賬號(hào)密碼即可苟跪。

  1. 登錄

瀏覽器輸入http://localhost:8000/admin/, 然后賬號(hào)密碼登錄廷痘。

  1. 修改語(yǔ)言

默認(rèn)為英文,想要中文顯示件已,修改setting.py中的
LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh_Hans'

  1. 配置應(yīng)用

在應(yīng)用admin.py中引入自身的models模塊笋额。

import models
admin.site.register(models.Article)

刷新頁(yè)面,就會(huì)看見篷扩,自己的應(yīng)用Blog兄猩,可以進(jìn)行編輯。

  1. 修改數(shù)據(jù)默認(rèn)顯示名稱

新建數(shù)據(jù)后鉴未,會(huì)發(fā)現(xiàn)顯示的名稱都是Article object枢冤。
解決:
models.pyArticle類中添加方法
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

參考

django入門與實(shí)踐

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市歼狼,隨后出現(xiàn)的幾起案子掏导,更是在濱河造成了極大的恐慌,老刑警劉巖羽峰,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趟咆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡梅屉,警方通過(guò)查閱死者的電腦和手機(jī)值纱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坯汤,“玉大人虐唠,你說(shuō)我怎么就攤上這事《枘簦” “怎么了疆偿?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)搓幌。 經(jīng)常有香客問(wèn)我杆故,道長(zhǎng),這世上最難降的妖魔是什么溉愁? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任处铛,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撤蟆。我一直安慰自己奕塑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布家肯。 她就那樣靜靜地躺著龄砰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪息楔。 梳的紋絲不亂的頭發(fā)上寝贡,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音值依,去河邊找鬼。 笑死碟案,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辆亏。 我是一名探鬼主播领迈,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼尘喝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼置吓!你這毒婦竟也來(lái)了衍锚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凫海,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荸实,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年圆存,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陌兑,死狀恐怖沈跨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兔综,我是刑警寧澤饿凛,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布狞玛,位于F島的核電站,受9級(jí)特大地震影響涧窒,放射性物質(zhì)發(fā)生泄漏心肪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一纠吴、第九天 我趴在偏房一處隱蔽的房頂上張望硬鞍。 院中可真熱鬧,春花似錦戴已、人聲如沸固该。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)伐坏。三九已至,卻和暖如春休玩,著一層夾襖步出監(jiān)牢的瞬間著淆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工拴疤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人独泞。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓呐矾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親懦砂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜒犯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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