Django(個人推薦, 如果專案較大 需要協同開發, 建議使用django這種重量級框架, 如果類似于純api的后端應用建議使用 flask, 輕量小巧 , 麻雀雖小五臟俱全)
1.Django是什么
他是一個基于python語言的WEB框架
-
為什么使用Django
- 他是python中最大的框架集成很多api
- 他是全球第五大框架(代表作豆瓣)
- 適合開發工期短,效率高使用
-
Django的優勢
- 開發效率高,功能強大
-
通過wsgi模塊理解Django的作業集成原理
- 路由分發器通過寫一個函式上傳一個字典,如果傳進來的environment.get('PATH_INFO')在字典中存在,就執行對應的函式,否則回傳404f
-
wsgi是一種規范,wsgiref是基于wsgi規范開發的模塊
- 雖然自己寫web server比較的麻煩,但是我們也從中了解了web框架的本質
- 瀏覽器是socket客戶端,網站是socket服務端
- wsgi是一種web server開發的規范,wsgiref實作了這個規范并在其內部實作了socket服務端
- 根據url的不同執行不同的函式 - 路由分發
- 函式 - 處理業務邏輯的行程
- 圖案css js檔案統一稱為靜態檔案,需要讀取內容直接回傳給用戶瀏覽器
- 雖然自己寫web server比較的麻煩,但是我們也從中了解了web框架的本質
2.創建Django專案
-
django-admin.py startproject my_site 創建my_site專案
- 創建成功后會有幾個默認的檔案
- manage.py # 管理程式的檔案,啟動和結束等
- my_site #
- init.py
- settings.py # 程式的組態檔 - 資料庫配置之類的
- urls.py # 程式的路由系統
- wsgi.py # 指定框架的wsgi
- 在my_site大專案下創建app每一個業務線都要有一個app
- 創建app django-amdin.py startapp app01
- ├── admin.py 資料庫管理后臺
├── apps.py django把專案和app 關聯起來的一個檔案
├── init.py
├── migrations 與資料庫相關
│ └── init.py
├── models.py 資料庫增刪該查操作的檔案
├── tests.py 單元測驗
└── views.py 業務邏輯函式代碼存放的位置
- 創建成功后會有幾個默認的檔案
-
第一次django請求
- 1.首先匹配路由,查找對應的url對應的關系,找到了就呼叫回傳頁面,否則404
- 2.業務函式,執行業務邏輯
- 3.回傳資料給瀏覽器
? 啟動django web服務器 python3 manage.py runserver 0.0.0.0:8000
? retrun HttpResponse方法回傳我們定義的資料
3.模板初探
- 1.配置settings DIRS
- 2.配置views.py return render(request,'form.html')
- MVC & MTV
- m model 模型 一般對資料庫操作,資料的存取 models.py
- v views 視圖 決定著如何展示資料 views.py
- c controller 控制器 負責處理用戶互動的部分,控制器負責從視圖讀取資料,控制用戶輸入,并向模型發送資料. urls.py
Django是一個MTV框架,其框架模板上看起來和傳統的MVC架構沒有什么太大的區別.
Django將MVC中的視圖進一步分解為Django視圖和Django模板兩個部分
? - Django中的html檔案就是模板 視圖就是views.py
-
T 就是Templates 資料展示
在Django的MTV框架中MVC C控制器部分由Django框架的urlconf來實作代替
嚴格來說Django是MVTC C被實作替代了
urls.py檔案中 re_path是使用正則匹配用戶請求的url 主要配合動態路由
-
Django路由的匹配心法
-
Django 在2.0之后使用了新的語法path,不使用re_path
-
path('articles/<int:arg1>/<month:arg2>/<int:arg3>', views.kw) -
str 字串 除了/ 之外的任何字串都能匹配
-
int 匹配任意數字
-
slug 匹配任意的**-**-**
-
uuid 匹配uuid格式的,特定場景下才會使用的到
-
path / + str 可以匹配到/
-
-
使用include管理app下的url
-
在頂級的urls.py檔案中匯入from django.urls import include
-
path('app01/',include('app01.urls')),
-
-
Django的模型(admin檔案的操作)
- views中操作資料庫
- 自己寫sql陳述句的問題 - 有sql注入的風險,代碼與sql寫死在一起了,導致解耦性差,開發人員的sql水平層次不齊,導致性能可能會變差,開發效率低下
4.ORM的引出
-
ORM是什么?
- 物件關系映射,他的實質就是將關系資料庫中的業務資料用物件的形式表示出來,并通過面向物件的方式將這些物件組織起來,實作系統業務邏輯程序
- ORM中最重要的概念就是映射,通過這種映射可以使業務物件與資料庫分離,從面向物件來說,資料庫不應該和業務邏輯系結到一起,ORM則起到這樣的分離作用,使資料庫層透明,開發人員真正的面向物件.
-
ORM的作用
- 實作了代碼與資料庫操作的解耦
- 不需要自己寫原生的sql,提高了開發效率
- 有效的防止了sql注入
- 缺點
- 犧牲性能 - 將物件轉換成原生的sql
- 復雜陳述句難以實作
-
ORM映射欄位的語法
-
AutoField (設定自增)
-
BigAutoField (設定更大的自增)
-
BigIntegerField (更大的整數)
-
BinaryField (二進制的資料)
-
BooleanField (布爾型別的資料)
-
CharField (字串型別的資料)
-
DateField (年與日時間型別)
-
DataTimeField(精確到時分秒的時間型別)
-
DecimalField ()
-
DurationField()
-
EmailField(郵箱型別)
-
FileField(存盤檔案的型別)
-
FloatField(浮點數型別)
-
ImageField(圖片型別)
-
IntegerField(整數型別)
-
GenericIPAddressField(ipv4地址型別)
-
NullBooleanField (允許boolean型別為空)
-
TextField(大的文本)
-
ForeignKey(外鍵關聯)
-
ManyToManyField(多對多)
-
OneToOneField(1對1)
-
-
將models檔案中的類同步到mysql資料庫中(必須要注意models檔案中的外鍵和多對多要一一對應)
-
在Django官網找到資料庫的配置https://docs.djangoproject.com/en/3.0/ref/settings/#databases 寫到settings檔案當中
-
在專案下的init.py檔案中寫入
-
import pymysql pymysql.version_info = (1, 3, 13,"final",0) pymysql.install_as_MySQLdb() -
創建資料庫mysql> create database blogdatabase charset utf8;
-
在settings檔案中設定INSTALLED_APPS 加上app的名字
-
使用Django資料庫的同步工具migrations
- 1.生成同步檔案 python manage.py makemigrations
- 2.同步資料庫 python manage.py migrate
-
-
使用ORM映射插入資料 首先 python manage.py shell
-
普通創建
>>> models.Account.objects.create( >>> ... username = 'jeke', >>> ... email = '[email protected]', >>> ... password = '123', >>> ... ) -
外鍵關聯創建
>>> o = models.Article( >>> ... title = '我是Peter', >>> ... content = 'xixi', >>> ... pub_data = 'https://www.cnblogs.com/zjaiccn/p/2020-6-11') >>> o >>> <Article: Article object (None)> >>> o.account_id = 1 > >>> o.save() -
多對多的創建資料
- 先創建完物件在關聯o.tags.set([id,id]) 這是覆寫性設定
- o.tags.add(id,id) 這是添加
-
-
ORM對資料進行查詢(后來找到的查詢語法https://www.cnblogs.com/ls1997/p/10955402.html)
-
models.Account.objects.all() ==> select *
-
models.Account.objects.filter(id=1) ==> select * where id=1
-
models.Account.objects.filter(id__gt=1) ==> where id > 1
-
models.Account.objects.filter(id__gt=1,password='111') ==> where id >1 and password ='111';
-
models.Account.objects.filter(password__startswith=1) ==> where password like '1%'
-
models.Account.objects.filter(username__contains='zj') ==> 只要username包含大小寫的zj
-
models.Account.objects.filter(username__icontains='zj') ==> 只能匹配到小寫的zj
-
models.Account.objects.filter(id__in=[1,2]) ==> where id in (1,2)
-
models.Account.objects.filter(username__endswith='j') ==> where username like '%j'
-
日期的待補充
-
filter正則運算式
- models.Account.objects.filter(username__regex=r'(zj|j)$') 以zj或者j結尾
- models.Account.objects.filter(username__iregex=r'(zj|j)$') 加上i就是大小寫不敏感都匹配
-
上邊拿到的都是queryset的物件,不是資料,想要拿到資料可以使用很多方法
>>> a = models.Account.objects.filter(username__regex=r'(zj|j)$') >>> b = a.values() >>> b.values('id').order_by('id') #升序 <QuerySet [{'id': 2}, {'id': 3}]> >>> b.values('id').order_by('-id') <QuerySet [{'id': 3}, {'id': 2}]> #降序 >>> *想要用reverse 必須要用先order_by排序* >>> b.values('id').order_by('-id').reverse() #翻轉 <QuerySet [{'id': 2}, {'id': 3}]> >>> b.values('id').order_by('id').reverse().first() #取最后一個值,先翻轉在取第一個 {'id': 3}
-
5.ORM陳述句總結
-
a = models.Account.objects.get(id=1) 精確查詢某一欄位 #回傳的是真實的物件了,不是queryset物件了
直接呼叫a.id a.username 即可
-
models.Account.objects.exclude(id=1)
<QuerySet [<Account: Account object (2)>, <Account: Account object (3)>]>
get 回傳一個物件,沒有或者多個會報錯,不常用但是要不filter查詢速率快
filter 回傳多個物件
all 回傳所有資料
exclude 排除符合匹配條件的資料,回傳其他的資料
- 修改和洗掉操作
- 修改全部
>>> models.Account.objects.exclude(id=1).update(password='1234656') #批量修改只要是id不等于1的密碼都改成123456
- 單條修改(先get在賦值后保存)
>>> a = models.Account.objects.get(id=1)
>>> a.password = '123456789'
>>> a.save()
- 批量洗掉,關聯的表的資料也會洗掉或者變成設定的默認的
>>> models.Account.objects.get(password='123456').delete()
- 單條洗掉
>>> a = models.Account.objects.get(id=1)
>>> a.delete()
外鍵關聯操作(模塊創建)
正向外鍵關聯(在有關聯欄位的表中查詢)
>>> a = models.Article.objects.create(title = 'hahahaha322332', content = '阿光高你剛42151啊方法',account_id = 8 ,pub_data = 'https://www.cnblogs.com/zjaiccn/p/2020-06-12')
>>> a.account.id # a 定義的是Article的資料,但是可以通過外鍵關聯到Account 查詢到Account的資料
反向外鍵關聯(無關聯欄位的表中查詢, ORM會自動的幫助我們創建一個表)
>>> obj = models.Account.objects.all()[0]
>>> obj.article_set.all()
<QuerySet [<Article: Article object (6)>]>
>>> obj.article_set.all().values()
<QuerySet [{'id': 6, 'title': 'hahahaha', 'content': '阿光高你剛啊方法', 'account_id': 4, 'pub_data': datetime.date(2020, 6, 12)}]>
多對多關聯
>>> a.tags.all()
>>> t = models.tag.objects.all()[1]
>>> t.article_set.all()
6.Django Admin (組件)
admin 是Django自帶的讓你用來進行資料庫管理的web app
提供了很多定制化的功能,你甚至可以用它來進行公司內部的內容管理
首先創建登錄的用戶 >> python3 manage.py createsuperuser
如果app01想要被管理的話,必須授權允許管理admin.py檔案寫入下面的內容
from django.contrib import admin
from app01 import models
# Register your models here.
admin.site.register(models.Account)
admin.site.register(models.Article)
admin.site.register(models.Tag)
開啟Django >> python3 manage.py runserver 0.0.0.0:8000
打開localhost:8000/admin 就可以看到對應的資料庫進行操作了
7.定制Django admin
from django.contrib import admin
from app01 import models
class AccountAdmin(admin.ModelAdmin):
list_display = ('username', 'email', 'signature') # 顯示這三個欄位
search_fields = ('username', 'email','signature') # 加入搜索按鈕
list_filter = ('email', ) # 過濾, 針對重復的欄位過濾
list_per_page = 2 # 設定分頁
# list_display_links = ('email',)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'content', 'account', 'pub_data')
list_filter = ('account', 'pub_data')
search_fielshituds = ('title',)
fields = ('title', 'content', ('pub_data', 'account', 'tags')) # 設定admin修改創建頁面可修改的資料
exclude = ('account',) # 排除不顯示一些欄位
date_hierarchy = 'pub_data' # 按照時間的分組(只能用時間)
fieldsets = (
('文章基本資訊', {
'fields': ['title', 'content'],
},
),
('高級選項', {
'fields': ['account', 'tags', 'pub_data'],
'classes': ('collapse',), # 讓這個高級選項變成有收縮折疊功能
}
)
)
filter_horizontal = ('tags',) # 只能針對多對多
filter_vertical = ('tags',)
radio_fields = {'account': admin.VERTICAL} # 將下拉框變成按鈕以供選擇
autocomplete_fields = ['account',]
readonly_fields = ('title',) # 設定只讀欄位
admin.site.register(models.Account,AccountAdmin)
admin.site.register(models.Article,ArticleAdmin)
admin.site.register(models.Tag)
-
自定義Admin欄位
在models檔案中寫入
def get_comment(self): return 10再在admin對應的庫中加上list_display = ('get_comment',) 欄位
-
自定義欄位名 在,models中修改
-
signature = models.CharField("簽名", max_length=255, null=True) # null允許值為空,簽名 -
自定義表名 在models檔案中類中加入
class Meta: # verbose_name = "用戶串列" # 針對英文的 verbose_name_plural = '用戶串列' # 針對中文的 -
8.views 視圖(views檔案的操作)
-
視圖中的欄位拋開講解
-
HttpRequest物件屬性
- 他封裝了本次請求所涉及的用戶瀏覽器端資料,服務器端資料等,在views里可以通過request物件來調取相應的屬性
- request.scheme ==> 查看是https 協議還是http
- request.path == > 回傳的是當前請求的url
- request.method ==> 查看獲取網頁的方法 post get put delete
- request.content_type ==> 回傳mime的型別
- request.GET ==> 列印網頁GET請求的引數
- request.POST ==> 列印網頁POST請求的引數
- request.COOKIE ==> 獲取瀏覽器的cookie資料
- request.FILES == > 拿到通過前端頁面上傳來的檔案,放到記憶體當中
- request.POST.get("test_f") ==> 拿到選擇檔案的檔案名
- request.META ==> 回傳所有的請求頭
-
除了屬性HttpRequest的方法
- request.get_host() ==> 回傳網站服務器地址,example: '127.0.0.1':'8000'
- request.get_port() ==> 回傳服務器主機埠
- request.get_full_path() ==> 回傳請求的路徑
- request.build_absolute_uri(locaiton) ==> 回傳請求完整的url
- request.is_srcure() ==> 判斷他是不是https
- request.is_ajax() ==> 判斷是否是ajax請求
-
Httpresponse(content_type格式參考手冊https://www.w3school.com.cn/media/media_mimeref.asp)
-
設定下載檔案的方法
def download(request): f = open("static_data/15s第三方軟體設備適配情況.xlsx", 'rb') res = HttpResponse(f.read(),content_type='application/vnd.ms-excel') # 設定回傳的內容格式為excel檔案格式 res['Content-Disposition'] = 'attachment; filename ="15s.xlsx"' # 設定用戶請求的時候下載下來的是一個attachement附件和檔案名 return res -
設定重定向
def redirect(request): return HttpResponseRedirect("/app01/download")
-
-
CBV(class base view) 類視圖
- 使用類的方式來定義視圖,提高代碼的可復用性,還可以加入判斷條件,還有繼承
from django.views import view
class TestView(View):
def get(self,request):
return HttpResponse("測驗get請求自動的使用這個get()函式")
def post(self,request):
return HttpResponse("測驗post")
在url 定義的時候加入as.view()方法
path('class_view',view.TestView.as_view())
很久沒有整理之前的筆記了.... ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/253824.html
標籤:Python
