1. 程式人生 > 實用技巧 >django修身大法之入門儀式

django修身大法之入門儀式

1.Django簡介

Django是一個重量性web框架,採用了MVC的框架模式,也有很多人把它稱為MVT(MTV)模式。

django版本

django各個版本對python的要求

Django Version python version
1.11 2.7 3.4 3.5 3.6
2.0 3.4 3.5 3.6 3.7
2.1 2.2 3.5 3.6 3.7

2.Django安裝

2.1 安裝

可以先建立一個虛擬環境,然後在安裝django,看自己的需求

pip install django==版本號 -i https://pypi.douban.com/simple # -i表示選擇映象源,這裡選擇豆瓣的

安裝完畢後,測試下是否安裝成功

首先執行python,進入互動環境
>> import django
>> django.get_version()

3.第一個Django專案

先切換到指定目錄,然後用以下指令建立一個專案

3.1 建立專案

cd 目錄
django-admin startproject 專案名  # 該語句用於建立django專案

3.2 專案的目錄結構

├── hello #項⽬⽬錄
│ ├── __init__.py #包標誌
│ ├── settings.py #項⽬配置⽂件
│ ├── urls.py #路由對映表
│ └── wsgi.py #wsgi接⼝
└── manage.py #項⽬管理命令

manage.py:是Django⽤於管理本項⽬的命令⾏⼯具,之後進⾏站點運⾏,資料庫
⾃動⽣成等都是通過本⽂件完成。

專案配置檔案

# 項⽬根⽬錄 manage.py所在⽬錄
BASE_DIR =
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 除錯模式
DEBUG = True
#允許訪問的主機
ALLOWED_HOSTS = ['*']
# 安裝的應⽤,⾃⼰定義應⽤也應該新增到這⾥
INSTALLED_APPS = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
]
#模板配置
TEMPLATES = [
 {
 'BACKEND': 'django.template.backends.django.DjangoTemplates',
 'DIRS': [], #模板路徑
 'APP_DIRS': True,
 'OPTIONS': {
 'context_processors': [
 'django.template.context_processors.debug',
 'django.template.context_processors.request',
 'django.contrib.auth.context_processors.auth',
 
 
'django.contrib.messages.context_processors.messages',
 ],
 },
 },
]
# 資料庫配置
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.sqlite3',
 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
	}
}

# 國際化
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'zh-hans' #語⾔編碼
TIME_ZONE = 'Asia/Shanghai' #時區

3.3 測試伺服器啟動

在命令⾏下鍵⼊:

#命令:python manage.py runserver [ip:port]
python manage.py runserver
python manage.py runserver 0.0.0.0:9000

測試伺服器預設端⼝是8000,僅限於本地連線。開啟瀏覽器輸⼊:
可以看到⾃⼰的⽹站。

http://localhost:8000 #或者
http://127.0.0.1:8000

可以看到⾃⼰的⽹站。

如果要讓遠端客戶端連線需要修改配置⽂件,其中0.0.0.0:9000是可選的,0.0.0.0
說明任何ip都可以訪問。

3.4 建立應用

⼀個django項⽬中可以包含多個應⽤,可以使⽤以下命令建⽴應⽤:

#命令: python manager.py startapp 應⽤名稱
例項: python manager.py startapp app

建立應⽤後,項⽬的結構如下:

├── App
│ ├── admin.py 站點管理
│ ├── apps.py 應⽤程式⾃身資訊
│ ├── __init__.py
│ ├── migrations 資料遷移
│ │ └── __init__.py
│ ├── models.py 模型
│ ├── tests.py
│ └── views.py 檢視響應函式
├── db.sqlite3 sqlite資料庫
├── hellodjango 項⽬
│ ├── doc.py
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ ├── settings.cpython-36.pyc
│ │ ├── urls.cpython-36.pyc
│ │ └── wsgi.cpython-36.pyc
│ ├── settings.py 系統配置
│ ├── urls.py 路由對映表
│ └── wsgi.py wsgi協議
└── manage.py 項⽬管理命令

修改專案的配置檔案settings.py

INSTALLED_APPS = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'App', # 安裝自己的應⽤,這裡要注意匯入路徑,在後期會講
]

到此為⽌,我們已經搭建好項⽬的基本框架,但項⽬還沒有實質性內容,下⾯將從
檢視函式開始給項⽬新增功能。

4. 簡單檢視函式

在django中view代表檢視函式,接收⽤戶的請求,進⾏處理然後返回html原始碼
給客戶端。在框架中,我們可以在應⽤(app)的views.py中寫⾃⼰的檢視函式,
進⾏相應的處理。
檢視函式只是⼀個普通的python函式,它的第⼀個引數必須是⼀個請求(request)物件,這是框架傳⼊的,我們可以通過請求物件獲取提交引數等內
容。它的返回值必須是⼀個web響應物件,可以⽂本、html原始碼、重定向、404
等內容。下⾯我們寫⼀個簡單檢視函式,返回“Hello Django"

from django.http import HttpResponse
def index(request):
 
	return HttpResponse("Hello Django")

其中HttpResponse函式需要引⼊模組django.http,我們可以直接寫
HttpResponse,然後通過快捷鍵alt+enter,在下拉框中選擇要導⼊的模組。

  • alt+enter 程式碼飄紅、飄⻩、檢視定義、引⼊包都可以使⽤。

5. 基本路由

新增完檢視函式後,還⽆法在瀏覽器中檢視,必須新增路由。所謂路由就是將⽤戶
請求轉換為訪問對應的檢視函式。項⽬路由在hello下urls.py中

"""
from django.conf.urls import path
from django.contrib import admin
from App import views
urlpatterns = [
 path('admin/', admin.site.urls),
 path('', views.index)
]

路由由兩部分組成,第⼀部是⼀個匹配字串(和flask規則相同),匹配⽤戶的請
求路徑,第⼆部分是檢視函式

path('', views.index)
 views.index 檢視函式

匹配字串匹配⽤戶在位址列中鍵⼊的url,當⽤戶在位址列中鍵⼊http://localhos
t:9000時會顯示Hello World.

6. 簡單模板

在上⾯我們已經能夠展示簡單的web⻚⾯,但要顯示⼀個html⻚⾯,需要使⽤模
板,在app下建⽴templates⽬錄,在templates⽬錄下建⽴⼀個index.html⽂件

重點:如果不是訪問app下的templates模板的話,則需要在配置檔案裡設定模板資料夾所在的位置,如果是用pycharm建立的話,會預設新增,手動建立則需要注意該操作

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>搜狐</title>
</head>
<body>
當你的才華還撐不起你的ᰀ⼼的時候,你就應該靜下⼼來學習;<br>
當你的能⼒還駕馭不了你的⽬標時,就應該沉下⼼來,歷練;
</body>
</html>

然後修改views中檢視函式index

from django.shortcuts import render
def index(request):
 return render(request,'index.html')

重新訪問網站

也可以在html中使⽤變ᰁ和流程控制結構,⽣成複雜的html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <!-- 模板中新增變數 -->
 <title>{{ title }}</title>
</head>
<body>
當你的才華還撐不起你的ᰀ⼼的時候,你就應該靜下⼼來學習;<br>
當你的能⼒還駕馭不了你的⽬標時,就應該沉下⼼來,歷練;
</body>
</html>

然後修改檢視函式:

from django.shortcuts import render
def index(request):
 return render(request,'index.html',context={'title':'草榴'}) # 這裡的context是上下文,用於給模板傳入資料

重新訪問首頁

7. 簡單模型

django⾃帶了⼀個sqlite資料庫,可以⽤於測試,⽣產環境⼀般不⽤。在配置⽂件
中已經設定好預設的sqlite資料庫。

DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.sqlite3', #資料庫引擎
 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), #資料庫⽂件路徑
 }
}

然後到app中models.py中建立⼀個User類:

class User(models.Model):
 uname = models.CharField(max_length=20)
 password = models.CharField(max_length=32)

到命令⾏下,輸⼊:

python manage.py makemigrations #⽣成資料庫遷移⽂件
python manage.py migrate #⽣成資料庫表

然後到pycharm左邊欄database中檢視:

生成的表名預設是app應用名加下劃線加類名的小寫,如果想更改,可以在模型類中定義class Meta,宣告db_table,

雙擊app_user新增資料:


到此為⽌,我們已經給app_user表添加了資料。然後給app新增⼀個模板:
list.html

<!DOCTYPE html>
<html lang="en">
    <head>
 <meta charset="UTF-8">
 <title>⽤戶列表</title>
</head>
<body>
<table width="80%" align="center" border="1" cellspacing="0">
 <caption>⽤戶列表</caption>
 {% for user in users %}  //模板語法,這裡先這樣寫,跟python的迴圈很像,後面會詳細講
 <tr>
 <td>{{ user.uname }}</td>
 <td>{{ user.password }}</td>
 </tr>
 {% endfor %}
</table>
</body>
</html>

繼續給app新增⼀個檢視操作函式:

from app.models import User
def userlist(req):
 #獲取app_user表中所有資料
 persons = User.objects.all() # orm語法,獲取所有的user資料
 return render(req,"list.html", context={'users':persons})

在項⽬的路由表中新增路由:

urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^$',views.index),
 url(r'^list/$',views.userlist),
]

到瀏覽器中訪問:http://localhost:9000/list/

好了,今天先簡單的介紹下django大概的樣子,後面會詳細的講解

溜了,peace