Python中的Django框架基礎(chǔ)及安裝教程
一.Django框架概述
Django是一個(gè)基于Python的高級(jí)Web框架,遵循“快速開發(fā)”和“DRY(Don't Repeat Yourself)”原則。以下為其核心特點(diǎn):
- 全??蚣?/strong>:內(nèi)置ORM、模板引擎、表單處理、認(rèn)證系統(tǒng)等組件,覆蓋開發(fā)全流程。
- MTV模式:類似MVC但略有不同,分為Model(數(shù)據(jù)層)、Template(表現(xiàn)層)、View(業(yè)務(wù)邏輯層)。
- 自動(dòng)化工具:提供命令行工具
manage.py,支持?jǐn)?shù)據(jù)庫遷移、測(cè)試、調(diào)試等。
二.Django框架安裝
方式一:命令行安裝Django
安裝:pip install Django==3.2.25 卸載:pip uninstall Django
三.Django項(xiàng)目創(chuàng)建
方式一:命令行創(chuàng)建
django-admin startproject 項(xiàng)目名稱
方式二:通過pycharm創(chuàng)建項(xiàng)目
四.Django項(xiàng)目啟動(dòng)
方式一:命令行啟動(dòng)
cmd窗口進(jìn)入Django項(xiàng)目文件夾:
python manage.py runserver
如果需要修改啟動(dòng)端口號(hào),那么:python manage.py runserver 8080

方式二:通過pycharm進(jìn)行項(xiàng)目啟動(dòng)
Django項(xiàng)目默認(rèn)的端口號(hào)為8000

五.Django項(xiàng)目路由配置
1.自定義路由配置:
urlpatterns = [
path('login/', login),
]
def login(request):
print("訪問到了登錄函數(shù)")
return render(request,"login.html")容易發(fā)生的錯(cuò)誤:
1.函數(shù)沒有返回值時(shí)報(bào)錯(cuò):

2.函數(shù)返回值格式不正確:

3.頁面正常訪問中,當(dāng)需要加載靜態(tài)資源(css文件、js文件、圖片 …... ),需要在setting.py文件中做配置
STATIC_URL = "/static/"
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
頁面跳轉(zhuǎn)-轉(zhuǎn)發(fā)與重定向
轉(zhuǎn)發(fā)(render)
def page(request):
return render(request, "main.html")
urlpatterns = [
path("login/", login),
path("login_action/", login_action),
path("page/", page),
]
重定向(redirect)
def main(request):
return render(request, "main.html")
def page(request):
return redirect("/main/")
urlpatterns = [
path("login/", login),
path("login_action/", login_action),
path("page/", page),
path("main/", main),
]
轉(zhuǎn)發(fā)和重定向的區(qū)別
轉(zhuǎn)發(fā)(Forward)和重定向(Redirect)的核心區(qū)別在于:轉(zhuǎn)發(fā)是服務(wù)器內(nèi)部行為,一次請(qǐng)求且地址欄不變;重定向是客戶端行為,兩次請(qǐng)求且地址欄變化。
?核心機(jī)制差異?
?行為主體?。
?轉(zhuǎn)發(fā)?:由服務(wù)器內(nèi)部完成(如通過RequestDispatcher),客戶端無感知
?重定向?:服務(wù)器返回狀態(tài)碼(如302)和新URL,客戶端重新發(fā)起請(qǐng)求
?請(qǐng)求次數(shù)與效率?。
?轉(zhuǎn)發(fā)?:僅一次請(qǐng)求,性能更高
?重定向?:兩次獨(dú)立請(qǐng)求,效率較低
?功能特性對(duì)比?
?地址欄變化?。
?轉(zhuǎn)發(fā)?:地址欄顯示原始URL
?重定向?:地址欄更新為新URL
?數(shù)據(jù)共享能力?。
?轉(zhuǎn)發(fā)?:通過request.setAttribute()共享數(shù)據(jù)
?重定向?:需依賴Session或URL參數(shù)傳遞數(shù)據(jù)
?應(yīng)用范圍限制?。
?轉(zhuǎn)發(fā)?:僅限同一Web應(yīng)用內(nèi)資源
?重定向?:可跨應(yīng)用或訪問外部資源六.ORM思想
ORM(對(duì)象關(guān)系映射)的核心優(yōu)勢(shì)主要體現(xiàn)在以下方面:
提升開發(fā)效率
通過將數(shù)據(jù)庫表結(jié)構(gòu)映射為程序?qū)ο螅_發(fā)者無需手動(dòng)編寫復(fù)雜的SQL語句即可完成數(shù)據(jù)操作,顯著提升編碼效率。框架如 SQLAlchemy 通過聲明式映射實(shí)現(xiàn)Python類與數(shù)據(jù)庫表的關(guān)聯(lián),支持鏈?zhǔn)讲樵儤?gòu)建。
簡(jiǎn)化數(shù)據(jù)操作邏輯
ORM框架提供數(shù)據(jù)消毒、事務(wù)管理、動(dòng)態(tài)查詢生成等功能,開發(fā)者只需關(guān)注業(yè)務(wù)邏輯而無需深究數(shù)據(jù)庫細(xì)節(jié)。
降低維護(hù)成本
統(tǒng)一的數(shù)據(jù)模型定義便于團(tuán)隊(duì)協(xié)作開發(fā),且能快速適配不同數(shù)據(jù)庫,Django、Ruby on Rails、等框架通過ORM實(shí)現(xiàn)跨平臺(tái)開發(fā),減少因數(shù)據(jù)庫遷移導(dǎo)致的代碼修改。
增強(qiáng)安全性
通過參數(shù)化查詢和預(yù)編譯語句減少SQL注入風(fēng)險(xiǎn) Laravel 等框架的ORM組件自動(dòng)處理數(shù)據(jù)過濾和轉(zhuǎn)義操作,降低數(shù)據(jù)污染風(fēng)險(xiǎn)。
促進(jìn)架構(gòu)規(guī)范
強(qiáng)制采用MVC架構(gòu)模式,使業(yè)務(wù)邏輯與數(shù)據(jù)訪問邏輯分離,代碼結(jié)構(gòu)更清晰。例如,Android Room庫通過ORM強(qiáng)制實(shí)現(xiàn)數(shù)據(jù)訪問層與業(yè)務(wù)層的隔離。
七.Django中使用ORM(掌握?。。?/h2>
第一步:改造上述Django代碼結(jié)構(gòu),需要?jiǎng)?chuàng)建特殊文件夾
方式一:通過命令行創(chuàng)建并配置
python manage.py startapp app
方式二:通過pycharm創(chuàng)建
第二步:在項(xiàng)目的settings.py文件中配置數(shù)據(jù)庫信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "spt2505", # 數(shù)據(jù)庫名稱
"HOST":"127.0.0.1", # 數(shù)據(jù)庫所在IP地址
"PORT":3306, # 數(shù)據(jù)庫端口號(hào)
"USER":"root", # 用戶名
"PASSWORD":"root" # 密碼
}
}第三步:確定需要用pymysql來操作數(shù)據(jù)庫
在與settings.py文件同一等級(jí)的init.py文件中配置pymysql
import pymysql pymysql.install_as_MySQLdb()
第四步:配置映射信息
在app文件夾下的models.py文件中做ORM映射
class User(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=20)
password = models.CharField(max_length=20)第五步:通過命令實(shí)現(xiàn)ORM映射(Django程序通過類信息自動(dòng)創(chuàng)建表格)
python manage.py makemigrations python manage.py migrate
報(bào)錯(cuò)備注:
Django版本與MySQL 5.5的兼容性?:
Django與MySQL的版本兼容性如下:
?Django 2.0及以上版本支持MySQL 5.5及以上版本?。
?Django 2.2及以上版本支持MySQL 5.5、5.6和5.7版本?。
?Django 3.0及以上版本支持MySQL 5.6、5.7和8.0版本??。
因此,?Django 4.2版本不再支持MySQL 5.5?,因?yàn)镈jango 4.2官方不再支持MySQL 5.5,這會(huì)導(dǎo)致不兼容問題?。
解決方案
?降低Django版本?:可以將Django版本降級(jí)到3.2.18或更早的版本,以繼續(xù)使用MySQL 5.5?2。
?升級(jí)MySQL版本?:將MySQL升級(jí)到8.0或更高版本,以兼容Django 4.2?2
Django3.2版本與mysql5.5版本不兼容問題:
解決方式一:降低Django版本
解決方式二:升級(jí)Mysql版本
解決方式三:在settings.py文件追加兼容性配置
# 設(shè)置兼容
from django.db.backends.mysql.base import DatabaseWrapper
DatabaseWrapper.data_types['DateTimeField'] = 'datetime'第六步:在views.py文件中開發(fā)業(yè)務(wù)邏輯模塊
from django.shortcuts import render,redirect
from app.models import User
# Create your views here.
?
def login(request):
# print("訪問到了登錄函數(shù)")
return render(request,"login.html")
?
def login_action(request):
print("登錄動(dòng)作")
# 接收界面參數(shù)
username = request.POST.get("username")
password = request.POST.get("password")
?
if User.objects.filter(username=username,password=password):
#登錄成功
return redirect("/main/")
else:
return render(request, "login.html",{"msg":"用戶名或密碼錯(cuò)誤!"})
?
def main(request):
return render(request, "main.html")第七步:在url.py文件中導(dǎo)入views.py文件
from django.urls import path
from app import views
urlpatterns = [
path("login/", views.login),
path("login_action/", views.login_action),
path("main/", views.main),
]八.request請(qǐng)求
"""
get方式:
01:刷新瀏覽器地址欄
02:a鏈接 href屬性
03:window.location.href
04:form表單中,method="GET"
05:ajax請(qǐng)求中,type:"GET"
post方式:
01:form表單中,method="POST"
02:ajax請(qǐng)求中,type:"POST"
"""
def requestTest(request):
# print(request)
# print(type(request))
# print(request.method) # 得到請(qǐng)求方法 GET POST PUT DELETE
# print(request.GET.get("id")) # 接收前臺(tái)參數(shù)
# print(request.FILES.get("filename")) # 接收前臺(tái)文件
# 了解
# print(request.path) # 獲取請(qǐng)求路由
# print(request.path_info) # 獲取請(qǐng)求路由
# print(request.encoding) # 編碼
# print(request.scheme) # 請(qǐng)求協(xié)議
# print(request.body) # 請(qǐng)求體
# print(request.get_port()) # 8000
# print(request.get_host()) #localhost:8000
# print(request.is_ajax()) # 當(dāng)次請(qǐng)求是否是ajax
return HttpResponse("lufei,海賊王,21")九.response響應(yīng)
"""
01:轉(zhuǎn)發(fā)render或重定向redirect
02:直接通過HttpResponse響應(yīng)普通字符串
03:在02響應(yīng)的基礎(chǔ)之上,如果字符串有特殊格式(JSON格式),那么響應(yīng)回去的數(shù)據(jù)可以做特殊處理
響應(yīng)JSON格式字符串
方式一:手動(dòng)拼接
方式二:通過json模塊將字典轉(zhuǎn)換為json格式字符串 (需要導(dǎo)入: import json)
方式三:通過JsonResponse (需要導(dǎo)入:from django.http import JsonResponse)
"""
import json
from django.http import JsonResponse
def responseTest(request):
#name = "{\"username\":\"lufei\",\"title\":\"海賊王\",\"age\":21}"
name = {"username":"張三","password":"123456","address":"太原"}
# return HttpResponse(json.dumps(name))
return JsonResponse(name)十.orm模型查詢(M)
各種查詢方式
方式一:Django中自帶的admin界面
在admin.py文件中注冊(cè)模型數(shù)據(jù)
admin.site.register(models.User)
通過命令追加admin界面的登錄信息
python manage.py createsuperuser
訪問admin界面,查看是否有模型數(shù)據(jù)


方式二:通過pycharm自帶的Django控制臺(tái)

方式三:通過配置在任意的python文件中做測(cè)試
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoORM20250807.settings")
import django
django.setup()
from app.models import User
user = User.objects.get(id=1)
print(user.username)ORM中查詢機(jī)制
如果控制臺(tái)需要顯示sql語句,需要在setting.py文件中配置日志信息
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}單表查詢
01.查詢所有
userlist = User.objects.all() print(userlist)
02.通過主鍵或其他字段查詢
得到的結(jié)果是唯一的對(duì)象 {{user.username}}
要求get查詢得到的結(jié)果必須是唯一的
如果數(shù)據(jù) 不存在 或 查詢的結(jié)果比較多,那么會(huì)報(bào)錯(cuò) get() returned more than one User -- it returned 2!
user = User.objects.get(username="喬巴43324") print(user)
03.通過filter查詢
得到的結(jié)果是集合 {% for user in userlist %} {{user.username}}
如果數(shù)據(jù)不存在,則返回空集合
user = User.objects.filter(username="路飛123") print(user)
04.通過values 當(dāng)前臺(tái)界面需要指定字段時(shí)使用 json格式 {key:value,key:value}
userlist = User.objects.all().values("id","username") print(userlist)05.通過values_list 當(dāng)前臺(tái)界面需要指定字段時(shí)使用 得到得只有值,[(1, '路飛123'), (2, '喬巴'), (3, '喬巴')]
userlist = User.objects.all().values_list("id", "username") print(userlist)06.exclude(參數(shù)) 查詢除了滿足條件的所有數(shù)據(jù)
userlist = User.objects.exclude(id=2) print(userlist)
07 .order_by(參數(shù)) 默認(rèn)升序
.order_by(-參數(shù)) 降序
.order_by(參數(shù)1,參數(shù)2) 如果默認(rèn)按照參數(shù)1升序,如果參數(shù)1一樣,那么按照參數(shù)2升序
userlist = User.objects.order_by("sal","-id") print(userlist)08 .reverse() 反序輸出
userlist = User.objects.order_by("-id").reverse() print(userlist)09 .count 統(tǒng)計(jì)
userlist = User.objects.all().count() print(userlist)
10 .first()或者.last() 查詢列表中的第一條或最后一條,得到是對(duì)象
userlist = User.objects.all().last() print(userlist)
11 .exists() 查詢數(shù)據(jù)是否存在,返回boolean類型
userlist = User.objects.filter(id=2).exists() print(userlist)
單表下劃線查詢
屬性__gt > 大于
屬性__gte >= 大于等于
屬性__lt < 小于
屬性__lte
屬性__gt=1,屬性__lt=5 select * from t_user where id > 1 and id < 5
屬性__range=[1,3] id>=1 and id
屬性__in=[1,3] select * from t_user where id = 1 or id = 3
屬性__contains 模糊匹配 like %路% 匹配英文區(qū)分大小寫
屬性__icontains 模糊匹配 like %路% 匹配英文不區(qū)分大小寫
屬性__startswith="路" 模糊匹配 like 路%
屬性__endswith="路" 模糊匹配 like %路
userlist = User.objects.filter(id__gt=1,id__lte=3) userlist = User.objects.filter(id__range=[1,3]) userlist = User.objects.filter(id__in=[1,3]) userlist = User.objects.filter(username__contains="LU") print(userlist)
orm_F和Q查詢
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoORM20250807.settings")
import django
django.setup()
from app.models import Book, Press, BookType
from django.db.models import F,Q
#select * from app_book where sale > kucun
#booklist = Book.objects.filter(sale__gte=F("kucun"))
#print(booklist)
#id 1,3 range in
bookes = Book.objects.filter(Q(id__gte=3) | Q(id__lte=1))
print(bookes)vvv聚合查詢
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoORM20250807.settings")
import django
django.setup()
from app.models import Book, Press, BookType
from django.db.models import F,Q,Max,Min,Sum,Count,Avg
#查詢圖書中價(jià)格的最大值和最小值
# books = Book.objects.aggregate(Avg("bookprice"),Min("bookprice"))
# print(books)
# 分組 (默認(rèn)分組)
# books = Book.objects.annotate(Count("bookprice"))
# print(books)
result = Book.objects.values("press_id").annotate(num = Count("id")).values("press_id","num")
print(result)一對(duì)多查詢
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoORM20250807.settings")
import django
django.setup()
from app.models import Book, Press, BookType1.從 多方 查找 一方
book = Book.objects.get(id=2) print(book) print(book.press.pressname)
2.從 一方 查找 多方 (查詢id為1的出版社對(duì)應(yīng)的所有圖書)
booklist = Book.objects.filter(press_id=1) print(booklist) presslist = Press.objects.get(pressname="清華大學(xué)出版社").id print(presslist)
3.從 一方 查找 多方 (查詢清華大學(xué)出版社對(duì)應(yīng)的所有圖書) 發(fā)送2條sql語句
#select * from app_book where press_id = (select id from app_press where pressname = "清華大學(xué)出版社") booklist = Book.objects.filter(press_id=Press.objects.get(pressname__contains="人民").id) print(booklist)
4.從 一方 查找 多方 (查詢清華大學(xué)出版社對(duì)應(yīng)的所有圖書) 發(fā)送1條sql語句
在外鍵字段上追加雙下劃線代表 跨表聯(lián)查
booklist = Book.objects.filter(press__pressname__contains="清華") print(booklist)
5.圖書名稱 出版社名稱 .values("自己的字段“,"外鍵字段__名稱")
booklist = Book.objects.all().values("bookname","press__pressname")
print(booklist)6.反向查詢 (從一方作為發(fā)起者查詢多方數(shù)據(jù))
方式一: 一方對(duì)象名稱.多方類名小寫_set.all() 發(fā)送多條sql
方式二: 在外鍵配置的屬性中,追加關(guān)聯(lián)字段
press = models.ForeignKey(to="Press",related_name="books", press = Press.objects.get(pressname="清華大學(xué)出版社") print(press) print(press.book_set.all()) press = Press.objects.get(books__bookname="鹿鼎記") print(press)
多對(duì)多查詢
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoORM20250807.settings")
import django
django.setup()
from app.models import Book, Press, BookType
#booktype = BookType.objects.get(id=1)
#print(booktype)
# 設(shè)置多對(duì)多關(guān)系
#booktype.books.set([1,2,3])
# 通過圖書類型查找圖書
# booktype = BookType.objects.get(id=1)
# print(booktype.books.all())
# 通過圖書查找圖書類型
# 方式一
# 方式二
# book = Book.objects.get(id=2)
# print(book.booktype_set.all())
book = Book.objects.filter(booktypes__id=1)
print(book)十一.反射
反射:
getattr() setattr() hasattr() delattr()
01:操作類屬性和類方法、靜態(tài)方法
獲取屬性:getattr(類名,"屬性名稱字符串")
設(shè)置屬性:setattr(類名,"屬性名稱字符串",需要設(shè)置的新的值)
獲取方法:getattr(類名,"方法名稱字符串")
執(zhí)行方法:getattr(類名,"方法名稱字符串")()
02:操作對(duì)象屬性和對(duì)象方法
獲取屬性:getattr(對(duì)象名稱,"屬性名稱字符串")
執(zhí)行方法:getattr(對(duì)象名稱,"方法名稱字符串")(參數(shù))
03:操作第三方模塊
執(zhí)行方法:getattr(模塊名稱,"方法名稱字符串")(參數(shù))
04:自己的模塊
執(zhí)行方法:getattr(sys.modules["__main__"],"方法名稱字符串")(參數(shù))十二.Session和Cookie
登錄:認(rèn)證與授權(quán)



到此這篇關(guān)于Python-Django框架基礎(chǔ)的文章就介紹到這了,更多相關(guān)Python Django框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pandas中datetime數(shù)據(jù)類型的使用
本文主要介紹了Pandas中datetime數(shù)據(jù)類型的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12
Python中卷積神經(jīng)網(wǎng)絡(luò)(CNN)入門教程分分享
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks, CNN)是一類特別適用于處理圖像數(shù)據(jù)的深度學(xué)習(xí)模型,本文介紹了如何使用Keras創(chuàng)建一個(gè)簡(jiǎn)單的CNN模型,并用它對(duì)手寫數(shù)字進(jìn)行分類,需要的可以參考一下2023-05-05
Python利用prettytable實(shí)現(xiàn)格式化輸出內(nèi)容
Python有一個(gè)第三方模塊叫?prettytable,專門用來將數(shù)據(jù)格式輸出。本文將通過示例為大家詳細(xì)講講prettytable的用法,感興趣的可以了解一下2022-07-07
python字符串切割:str.split()與re.split()的對(duì)比分析
今天小編就為大家分享一篇python字符串切割:str.split()與re.split()的對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07
理解生產(chǎn)者消費(fèi)者模型及在Python編程中的運(yùn)用實(shí)例
生產(chǎn)者消費(fèi)者模型一般用于體現(xiàn)程序的多線程并發(fā)性,Python的多線程雖然受到GIL控制,但依然可以構(gòu)建隊(duì)列來簡(jiǎn)單體現(xiàn)出模型的思路,這里我們就來共同理解生產(chǎn)者消費(fèi)者模型及在Python編程中的運(yùn)用實(shí)例:2016-06-06
win7下 python3.6 安裝opencv 和 opencv-contrib-python解決 cv2.xfeat
這篇文章主要介紹了win7下 python3.6 安裝opencv 和 opencv-contrib-python解決 cv2.xfeatures2d.SIFT_create() 的問題,需要的朋友可以參考下2019-10-10

