1、Django概述
Django是一個開放源代碼的Web應用框架,由Python寫成。采用了MTV的框架模式,即模型M,視圖V和模版T。
Django 框架的核心組件有:
- 用于創建模型的對象關系映射
- 為最終用戶設計較好的管理界面
- URL 設計
- 設計者友好的模板語言
- 緩存系統
Django已經成為web開發者的首選框架,是一個遵循 MVC 設計模式的框架。MVC是Model、View、Controller三個單詞的簡寫,分別代表模型、視圖、控制器。Django其實也是一個MTV 的設計模式。
MTV是Model、Template、View三個單詞的簡寫,分別代表模型、模版、視圖 ?。但是在Django中,控制器接受用戶輸入的部分由框架自行處理,所以 Django 里更關注的是模型(Model)、模板(Template)和視圖(Views),稱為 MTV模式。
層次 | 職責 |
模型(Model),即數據存取層 | 處理與數據相關的所有事務:如何存取、如何驗證有效性、包含哪些行為以及數據之間的關系等 |
模板(Template),即表現層 | 處理與表現相關的決定:如何在頁面或其他類型文檔中進行顯示。 |
視圖(View),即業務邏輯層 | 存取模型及調取恰當模板的相關邏輯。模型與模板的橋梁。 |
2、Django項目環境搭建
主要步驟是:
- 創建并激活虛擬環境
- 安裝Django模塊
- 創建Django項目
- 創建app應用程序
- 注冊app
- 編寫Django視圖
- 編寫Django路由
- 啟動Django項目
(1)創建并激活虛擬環境
cd D:\djangotest #自己創建空文件夾存放項目
python -m venv djangoenv #創建虛擬環境
運行以下命令,激活虛擬環境
cd D:\djangotest
djangoenv\Scripts\activate #激活虛擬環境
(2)安裝Django模塊
#1激活虛擬環境
cd D:\djangotest
djangoenv\Scripts\activate
#2安裝django模塊
pip install Django #激活虛擬環境后安裝Django模塊
上述命令執行后,會把Django模塊,安裝到了djangoenv/Lib/site-packages 下,也就是說,此Django模塊僅僅在虛擬環境中,而不是安裝在Python全 局環境。目錄如下圖所示:
(3)創建Django項目
安裝了Django之后,我們就可以使用Django的管理工具------>django-admin了
我們創建一個名稱為loginweb的Django項目,命令如下:
#1激活虛擬環境
cd D:\djangotest
djangoenv\Scripts\activate
#2創建一個loginweb的項目
django-admin startproject loginweb
此命令執行后,會在djenv的同級目錄,創建一個名稱loginweb的Django 項目。目錄結構如下圖所示:
用Pycharm打開項目,項目結構文件含義如下:
- 外層的loginweb目錄:是項目的容器,Django不關心它的名字,我 們可以將它重命名為任何我們喜歡的名字
- 里面的loginweb目錄:它是一個純python包。我們可以稱呼它為項目的名稱,不能隨意重命名
- manage.py :它是Django的一個非常重要的工具,通過它可以調用 django shell和數據庫等,如:創建app應用程序、創建數據庫表、清 空數據、啟動項目等操作
- settings.py :Django 項目的配置文件。包含了項目的默認設置,包 括數據庫信息,調試標志以及其他一些工作的變量
- urls.py :Django 項目的URL路由聲明,負責把URL模式映射到應用 程序
- wsgi.py:Web服務器網關接口(Python Web Server Gateway Interface的縮寫),Python應用和Web服務器之間的一種接口,可以 看成是一種協議、規范。它是基于Http協議的,不支持WebSoket
- asgi.py:異步網關協議接口,能夠處理多種通用的協議類型,包括 HTTP,HTTP2和WebSocket,可以看成ASGI是WSGI的擴展
(4)創建app應用程序
一般一個項目包含多個app應用程序(當然,通用的app也可以在多個項目中使用) 下面我們為loginweb項目,創建login
#1激活虛擬環境
cd D:\djangotest
djangoenv\Scripts\activate
#2切到django項目中
cd loginweb
#3創建一個叫login的應用
django-admin startapp login
上述命令執行后,目錄結構如下圖所示:
(5)注冊app
app應用程序創建以后,必須把app注冊到Django,才能夠被Django項目所管理。我們只需要把login應用的名稱,配置到 loginweb/settings.py文件中即可。如下圖所示:
(6)編寫Django視圖
Django視圖的作用:用于接受Web請求并且返回Web響應的簡單Python 函數。該函數一般定義在各自應用的views.py文件中。在視圖函數中,有 兩個重要的對象:請求對象和響應對象。
下面是一個最簡單的視圖函數:
# 例:在login/views.py 中
from django.http import HttpResponse
# Create your views here.def login(request):return HttpResponse("登錄頁面")
(7)編寫Django路由
Django的路由定義文件為:項目目錄urls.py文件。我們所有的路由配置,都以列表的方式,定義在urls.py文件中,添加我們想要的路由。
# 例:在loginweb/urls.py 中
from django.contrib import admin
from django.urls import path
from login import views
urlpatterns = [path("admin/", admin.site.urls),path("login/",views.login)
]
(8)啟動Django項目
在開發環境下,我們需要在本地啟動Django項目,來開發與調試我們的代 碼。啟動Django項目命令如下:
python manage.py runserver [port]
#[port] 為應用訪問端口,可以缺省不寫,默認為8000。
此時,我們就可以用瀏覽器訪問我們的項目了。結果如下圖所示:
訪問我們寫好的路由:
3、創建登錄頁面
在login底下新寫建一個templates目錄,存放編寫的html前端頁面。
loginweb -> login -> templates -> login.html:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登錄頁面</title><style>body{text-align:center;}</style>
</head>
<body>
<form action="/login/" method="post">{% csrf_token %}<h1 align="center">登錄頁面</h1><p class="divs"><label for="username">用戶名:</label><input type="text" id="username" name="username" align="center"></p><p class="divs">   <label for="password">密碼:</label><input type="password" id="password" name="password"></p><input type="submit" value="登錄"><span style="color:red">{{ error }}</span>
</form></body>
</html>
loginweb -> login -> templates -> index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>這里是主頁</title><style>h1 { color:red }</style>
</head>
<body><h1>這里是主頁</h1>
</body>
</html>
loginweb -> login -> views.py
from django.shortcuts import render,redirect
# Create your views here.def login(request):if request.method == 'POST':username = request.POST.get('username')passowrd = request.POST.get('password')if username=='songqin' and passowrd =='123456':return redirect('/index')else:return render(request,'login.html',{"error":"用戶名或密碼錯誤"})return render(request,'login.html')def index(request):return render(request,'index.html')
loginweb -> loginweb -> urls.py
from django.contrib import admin
from django.urls import path
from login import views
urlpatterns = [path("admin/", admin.site.urls),path("login/",views.login),path("index/",views.index)
]
再次啟動Django項目
python manage.py runserver [port]
#[port] 為應用訪問端口,可以缺省不寫,默認為8000。
訪問http://127.0.0.1:8000/login/項目
輸入不是用戶名密碼不是songqin/123456
輸入songqin/123456點擊登錄 跳轉到主頁面
4、數據庫鏈接
(1)配置mysql
loginweb -> loginweb -> settings.py
默認的數據庫配置如下:
DATABASES = {"default": {"ENGINE": "django.db.backends.sqlite3","NAME": BASE_DIR / "db.sqlite3",}
}
修改后如下所示:
DATABASES = {"default": {"ENGINE": "django.db.backends.mysql","NAME": "數據庫名","USER": "用戶","PASSWORD": "密碼","HOST": "ip","PORT": "3306"}
}
保存后,系統報錯,缺少mysql插件,需要安裝mysqlclient
,
執行以下命令安裝:
pip install mysqlclient
python manage.py runserver
:然后成功運行。
按這個同樣可以運行程序。
(2)自動創建數據庫表
在loginweb -> login -> models.py中,添加用戶類User_01。子類Meta中定義表的元數據,這里指定了表的名稱為f_user_01。
from django.db import models# Create your models here.
class User_01(models.Model):u_id = models.AutoField(primary_key=True)username = models.CharField(max_length=64, null=True)name = models.CharField(max_length=64, null=True)password = models.CharField(max_length=64, null=True)sex = models.CharField(max_length=64, null=True)age = models.CharField(max_length=64, null=True)phone = models.CharField(max_length=64, null=True)email = models.CharField(max_length=64, null=True)unit = models.CharField(max_length=64, null=True)avatar = models.CharField(max_length=64, null=True)status = models.CharField(max_length=64, null=True)create_time = models.CharField(max_length=64, null=True)delete_time = models.CharField(max_length=64, null=True)update_time = models.CharField(max_length=64, null=True)class Meta:db_table = "f_user_01"
執行命令:
# 生成遷移數據
python manage.py makemigrations
# 生成數據庫表
python manage.py migrate
執行完第一個命令,會在loginweb -> login -> migrations下生成初始化文件,僅僅對我們的類做了一個解讀。
執行完第二個命令,會在數據庫中生成數據庫表。
數據庫表中生成如下,只有f_user_01是我們要生成的表,上面其他的表都是Django系統默認生成的表,暫且不管。
(3)手工創建表進行映射
上面的方式是通過django自動創建models中定義的表。
現在我們需要手工創建表,然后在models中進行映射。
在數據庫中創建表如下:
然后在loginweb -> login -> models.py中,增加代碼如下:
class User(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=30, null=True)age = models.IntegerField(null=True)email = models.CharField(max_length=50, null=True)class Meta:db_table = "user"
直接運行程序即可。
(4)小結
1、配置mysql,需要安裝mysqlclient,編寫models的實體類,通過遷移命令可以自動生成mysql數據庫表結構。
2、如果數據庫表中已經創建好表,則只在model.py中創建對應實體類即可,不用執行遷移的兩個命令。這里就和java對應上了,直接編寫對應實體類和sql即可。
3、如果數據庫沒有創建好表,可以在models設計好實體類,使用遷移命令即可自動生成mysql數據庫表結構。
(5)添加數據
在loginweb -> login -> views.py中,添加代碼如下:
def addUser(request):models.User.objects.create(name='linfuchi', age=90, email='i miss you')result = {'code': 0,'msg': 'success','data': ''}return HttpResponse(json.dumps(result, ensure_ascii=False), content_type='application/json')
在loginweb -> loginweb -> urls.py中,添加代碼如下:
測試:
數據庫表中的信息:
(6)創建默認的表
在loginweb -> login -> models.py中,增加新的類:
class Info(models.Model):title = models.CharField(max_length=100)author = models.CharField(max_length=100)
此時沒有通過class Meta指定具體的表名信息。
那么會自動創建表嗎?答案是肯定的。
針對python manage.py migrate,提示沒有要執行的。
這是因為遷移記錄已被標記為已應用。
SELECT * FROM django_migrations;
如果發現?login
?應用的?0001_initial
?遷移記錄已經存在,說明該遷移已經被應用過了。
如果確認?login
?應用的?0001_initial
?遷移記錄不應該存在,你可以手動刪除該記錄,然后重新執行遷移。
刪除語句:
DELETE FROM django_migrations WHERE app = 'login' AND name = '0001_initial';
然后重新執行遷移:
python manage.py migrate
此時,查詢數據庫可以發現已經有一個新表了:
5、創建自定義命令
在loginweb -> login下創建目錄 management,在其下再創建目錄commands。
這里就是存放命令的目錄,類似于springboot等其他框架技術,遵循“約定大于配置”的原則。
在其下再創建hello.py的文件,整體結構如下:
hello.py的代碼如下:
from django.core.management.base import BaseCommandclass Command(BaseCommand):help = 'Prints a simple greeting message'def handle(self, *args, **options):# 在這里編寫命令的具體邏輯self.stdout.write(self.style.SUCCESS('Hello, Django!'))
執行命令:
在上述代碼中:
help 屬性是命令的簡短描述,當你運行 python manage.py help hello 時會顯示該描述。
handle 方法是命令的核心邏輯,當你運行該命令時,handle 方法會被執行。self.stdout.write 用于輸出信息,self.style.SUCCESS 會將輸出信息以綠色高亮顯示。
6、創建用戶
Django自帶的管理界面提供了便捷的用戶創建功能。
(1)創建超級用戶
在項目根目錄下,打開命令行終端,執行以下命令:
python manage.py createsuperuser
按照提示輸入用戶名、郵箱和密碼。
(2)創建普通用戶
- 啟動服務器:python manage.py runserver
- 登錄管理界面:打開瀏覽器,訪問?
http://127.0.0.1:8000/admin/
,使用之前創建的超級用戶賬號和密碼登錄。 - 創建新用戶:登錄成功后,在管理界面中找到 “用戶” 選項,點擊 “添加” 按鈕,輸入新用戶的用戶名、密碼等信息,然后點擊 “保存” 即可創建新用戶。
我們創建了賬密為hugh/hugh。