Django 系列部落格(二)
Django 系列部落格(二)
前言
今天部落格的內容為使用 Django 完成第一個 Django 頁面,並進行一些簡單頁面的搭建和轉跳。
命令列搭建 Django 專案
建立純淨虛擬環境
在上一篇部落格中已經安裝好了虛擬環境,所以用虛擬環境來安裝指定版本的 Django。為了可以從頭到尾的走一遍流程,我重新建立了一個虛擬環境。
啟用虛擬環境並安裝 Django
- 首先進入虛擬環境路徑下的 bin 目錄
- 使用命令啟用虛擬環境
- 安裝指定版本 Django
首先使用 pip3 list 命令檢視
可以看到都是建立虛擬環境時安裝的依賴包,現在使用 pip 命令安裝指定 django 版本,因為做專案需要穩定,所以安裝的版本不是最新的。
可以看到新安裝了2個包,pytz 是 python time zone 的縮寫,是用來轉換時區的包。
建立專案
前往目標路徑建立專案,在這裡我的 django 專案都在我的家目錄下面的 django_project裡面。
進入要建立專案的路徑下,使用下面的命令建立一個 django 專案。
django-admin startproject project_name
可以看到多了個資料夾。檢視專案結構
建立應用
進入專案根目錄使用下面命令建立一個 app。
python3 manage.py startapp app_name
建立成功並檢視專案結構。
啟動專案
使用下面命令
python3 manage.py runserver 127.0.0.1:8888
成功後會在本機上的8888埠開啟 django 服務
訪問8888埠會顯示下圖頁面
好了,到現在你已經開啟了第一個 django 服務,並且還是使用了命令列。
pycharm 建立 Django 專案
其實會使用命令列建立專案那麼使用 pycharm 應該是手到擒來,畢竟 pycharm 已經做了很多工作了。不過也有點麻煩。。。
在虛擬環境下使用 pycharm 安裝指定django 版本
建立專案
專案目錄結構及作用
專案目錄:包含專案最基本的一些配置 -- __init__.py:模組的配置檔案,將blog_proj資料夾變成了模組 -- settings.py:配置總檔案 -- urls.py:url配置檔案,django專案中的所有頁面都需要對其配置url地址 -- wsgi.py:(web server gateway interface),伺服器閘道器介面,python應用與web伺服器直接通訊的介面 templates:模板資料夾,存放html檔案的(頁面),支援使用Django模板語言(DTL),也可以使用第三方(jinja2) manage.py:專案管理器,與專案互動的命令列工具集的入口,檢視支援的所有命令python3 manage.py
settings.py結構
import os
# 專案根目錄
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 專案安全碼
SECRET_KEY = 'guwba1u$18=&*8kf44_u&[email protected]$0rs=(+f10yvz)p0'
# 除錯模式,上線專案要關閉debug模式,不然後臺出現異常會直接拋給前臺展現給使用者看了
DEBUG = True
# 在上線專案中,規定只能以什麼ip地址來訪問django專案
# DEBUG = FALSE
# ALLOWED_HOSTS = ['localhost']
ALLOWED_HOSTS = []
# 專案自帶的應用
# 我們建立了自己的應用就要將自定義應用新增到該配置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
# 中介軟體
# django自帶的工具集
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# 配置url配件檔案的根檔案,執行urls.py
ROOT_URLCONF = '專案目錄.urls'
# 模板,一個個html檔案
TEMPLATES = [
{
# 如果使用第三方,可以在這個地方修改模板引擎
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'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',
],
},
},
]
# 伺服器閘道器介面應用
WSGI_APPLICATION = '專案目錄.wsgi.application'
# 資料庫配置
# 要配置自定義資料庫去下面連結去查詢詳細配置
# 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/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# 國際化相關配置
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# 靜態檔案地址 (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
建立專案應用
使用 pycharm 自帶的命令列工具來建立應用
應用建立完後將應用名新增到 settings.py檔案中
INSTALLED_APPS = [
'django.contrib.admin',
...
'django.contrib.staticfiles',
# 新增的自定義應用
'app',
]
app目錄結構
建立後的 app 目錄結構和使用命令列建立的一樣,下面來看看具體都有什麼作用
migrations:資料遷移(移植)模組,內容都是由Django自動生成
-- __init__.py
__init__.py
admin.py:應用的後臺管理系統配置
apps.py:django 1.9後,本應用的相關配置
models.py:資料模型模組,使用ORM框架,類似於MVC模式下的Model層
tests.py:自動化測試模組,可以寫自動化測試指令碼
views.py:執行相應的邏輯程式碼模組(相應什麼,如何相應),程式碼邏輯處理的主要地點,專案的大部分程式碼所在位置
頁面響應
第一個響應
通過配置路由和檢視檔案來響應第一次連線請求。
配置路由
from django.conf.urls import url
from django.contrib import admin
# 匯入應用檢視
import app.views as app_view # 取別名
# 配置路由
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 為指定函式配置 url
url(r'^index/&', app_view.index)
]
配置檢視
# 匯入處理請求的 http 相應功能
from django.http import HttpResponse
# django中每一個請求都會設定相應函式來進行處理
# 函式的引數約定為 request
def index(request):
return HttpResponse('index page!')
啟動服務
啟動服務後訪問 localhost:8000/index/,可以看到響應為 index 函式裡填寫的響應,說明服務成功啟動並且響應了自己想要的響應字串。
第一個模板頁面
專案目錄下有個 templates 資料夾是專門用於存放頁面資源的,比如index.html
from django.shortcuts import render
def index(request):
# 引數:請求物件 request,模板 html 檔案,傳給前臺的資源
return render(request, 'index.html')
index.html 檔案
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主頁</title>
</head>
<body>
<h1>這是主頁</h1>
</body>
</html>
配置完成後,訪問127.0.0.1:8000/index/後顯示為:
在 views.py檔案中編寫對應響應功能函式時,會自動出現模板檔案
這是因為在 settings.py檔案中已經把模板路徑配置好了
TEMPLATES = [
{
# 如果使用第三方,可以在這個地方修改模板引擎
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 模板頁面預設路徑:專案根路徑下的templates資料夾
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
# 允許所有app均擁有自己的模板資料夾
'APP_DIRS': True,
...
},
]
第一個重定向
和上面的一樣,首先在 views.py檔案中配置響應函式
from django.shortcuts import render, redirect
# / 路徑渲染index.html頁面
def home(request):
return render(request, 'index.html')
# /index/ 路徑重定向到 / 路徑,達到渲染index.html頁面
def index(request):
return redirect('/')
響應的路由配置為
from django.conf.urls import url
from django.contrib import admin
# 匯入應用檢視
import app.views as app_view
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/$', app_view.index),
url(r'^$', app_view.home),
]
狀態碼顯示為301說明發生了轉跳,檢視網路詳細資訊發現在index/中有個 location 欄位,
該欄位值為 /,說明轉跳到了根目錄下。
其他配置
url應用移植
專案目錄下的urls.py檔案
# 匯入include功能,將url配置轉移到指定應用內部的自身url配置檔案
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 將url配置操作交給app_test自身的urls.py來進行操作
# app-test/為app_test應用的總路徑
url(r'^app-test/', include('app_test.urls')),
]
app_test下的urls.py檔案
from django.conf.urls import url
from . import views
urlpatterns = [
# 1.不要直接留空,直接留空 http://localhost:8000/app-test/* 均可以訪問
# 2.如果要配置index,訪問的地址為 http://localhost:8000/app-test/index
# 3.配置方式:r'^index/$',不要省略 / 符號
# 4.正則是否以$標識結尾取決於該路徑是否會有下一級路徑
url(r'^$', views.index),
]
多應用相同模板頁面衝突
如果在兩個應用中均有相同的模板頁面假如為index.html
# 1.在應用templates資料夾下建立與應用同名的資料夾,eg:app_text下就建立app_text
# 2.將模板建立在與應用同名的模板資料夾下
# 3.修改指定應用下views.py處理請求的render模板指向
def index(request):
# 模板指向:blog_app應用的templates下的blog_app資料夾中的index.html
return render(request, 'app_text/index.html')
靜態資源的配置
假如頁面需要一些靜態資源,比如需要 css 樣式、js 檔案等,那麼就需要在 settings 檔案中配置好靜態檔案的路徑。
配置 settings.py檔案
# 靜態檔案地址 (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
# 在專案根目錄下新建static資料夾,靜態資源均放在該資料夾中
# 增加STATICFILES_DIRS配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
# 前端頁面載入靜態資源的路徑:/static/... (...為具體在static資料夾中的路徑)
拓展靜態資源配置
# 如果要將專案根目錄下source資料夾也作為靜態資源路徑
# STATICFILES_DIRS增加source配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
os.path.join(BASE_DIR, 'source')
]
# 前端頁面載入靜態資源路徑依舊不變,Django會自動索引:/static/... (...為具體在source資料夾中的路徑)
url正則
原生字串
# urls.py配置路由
url(r'test', app_view.test)
# views.py設定響應函式
def test(request):
return HttpResponse('test')
# 問題:請求地址包含test均可以訪問
# http://127.0.0.1:8000/test => /test | /atest | /testa | /atesta | /test/a | /test/
開頭
# urls.py配置路由
url(r'^test', app_view.test)
# views.py設定響應函式
def test(request):
return HttpResponse('test')
# 問題:請求地址以test開頭均可以訪問
# http://127.0.0.1:8000/test => /test | /testa | /test/a | /test/
結尾
# urls.py配置路由
url(r'^test$', app_view.test)
# views.py設定響應函式
def test(request):
return HttpResponse('test')
# 問題:只能一種方式訪問
# http://127.0.0.1:8000/test => /test
# 不能以 /test/ 訪問
# http://127.0.0.1:8000/test/
優化結尾
# urls.py配置路由
url(r'^test/$', app_view.test)
# views.py設定響應函式
def test(request):
return HttpResponse('test')
# /test 和 /test/ 均可以訪問
# http://127.0.0.1:8000/test
# http://127.0.0.1:8000/test/
# 問題:不能作為應用總路由
# eg:app_test應用在專案urls.py
# url(r'^app-test/', include('app_test.urls')) 末尾不能加$,因為作為應用總目錄,是有下一級,如果用$標識結尾了,就代表不能有下一級路由
地址捕獲
# urls.py配置路由
url(r'^test/(\d+)/\d+/(\d+)/$', app_view.test)
# 對應請求路徑
# http://127.0.0.1:8000/test/1/22/333/
# 對應響應函式
def test(request, arg1, arg2):
# arg1: str 1
# arg2: str 333
return HttpResponse('test')
小結
# 常規路由配置
# r'^index/$'
# r'^page/2/$'
# 應用路由配置
# r'^app/'
# 根路由配置
# r'^$'
# 路由配置均以 / 結尾
# ()中的欄位會被請求響應函式捕獲
# 限制響應函式捕獲的變數名
# (?P<num>[0-9]+) 響應函式引數(requset, num)