Django 系列博客(二)

来源:https://www.cnblogs.com/zuanzuan/archive/2019/01/04/10223016.html
-Advertisement-
Play Games

Django 系列博客(二) 前言 今天博客的內容為使用 Django 完成第一個 Django 頁面,併進行一些簡單頁面的搭建和轉跳。 命令行搭建 Django 項目 創建純凈虛擬環境 在上一篇博客中已經安裝好了虛擬環境,所以用虛擬環境來安裝指定版本的 Django。為了可以從頭到尾的走一遍流程, ...


Django 系列博客(二)

前言

今天博客的內容為使用 Django 完成第一個 Django 頁面,併進行一些簡單頁面的搭建和轉跳。

命令行搭建 Django 項目

創建純凈虛擬環境

在上一篇博客中已經安裝好了虛擬環境,所以用虛擬環境來安裝指定版本的 Django。為了可以從頭到尾的走一遍流程,我重新創建了一個虛擬環境。

激活虛擬環境並安裝 Django

  1. 首先進入虛擬環境路徑下的 bin 目錄
  2. 使用命令激活虛擬環境

  1. 安裝指定版本 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&swqb@xlwgel7n$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)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • init1(){return new Promise((resolve, reject) => { let data={ dateStr:this.time }; api.get('url', null).then( res => { //自己的操作 resolve() }).catch(err = ...
  • 個人博客原文: "介面隔離原則" 設計模式六大原則之四:介面隔離原則。 簡介 姓名 :介面隔離原則 英文名 :Interface Segregation Principle 價值觀 :寧缺毋濫 個人介紹 : 1. Clients should not be forced to depend upon ...
  • 設計模式代表了最佳實踐,是開發人員在開發過程中面臨的一般問題的解決方案。這些解決方案是眾多開發人員經過相當長的一段時間的試驗和錯誤總結出來的 歷史 設計模式是一套被反覆使用,經過考驗的設計經驗的總結。使用設計模式是為了重用代碼,增強代碼的可讀性。 1994年,由Gang of Four在《設計模式 ...
  • 什麼是 Nacos? Nacos 是阿裡巴巴推出來的一個新開源項目,這是一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。 Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。 Nacos ...
  • 介面體現的是一種規範和實現分離的設計哲學,充分利用介面可以極大的降低程式中各個模塊之間的耦合,提高系統的可維護性以及可擴展性。 ...
  • 對於大部分的對象而言,程式里會有一個引用變數來引用該對象,這是最常見的引用方法。除此之外,java.lang.ref包下還提供了3個類:SoftReference、WeakReference和PhantomReference。它們分別代表了系統對對象的另外3中引用方式:軟引用、弱引用和虛引用。 ...
  • 文/沉默王二 開門見山地說吧,Java提供了一套完整的集合類(也可以叫做容器類)來管理一組長度可變的對象(也就是集合的元素),其中常見的類型包括List、Set、Queue和Map。從我個人的編程經驗來看,List的實現類ArrayList和Map的實現類HashMap使用頻率最高,其它實現類只能望 ...
  • /*懶漢模式 *優點:延遲載入 * 缺點:不加同步的懶漢模式是線程不安全的,加了synchronzide之後就變成線程安全的了 */public class Singleton { private static Singleton singleton=null; private Singleton( ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...