Django Full Coverage(飛速入門)

Django(我的推薦, 若是項目較大 須要協同開發, 建議使用django這種重量級框架, 若是相似於純api的後端應用建議使用 flask, 輕量小巧 , 麻雀雖小五臟俱全)

1.Django是什麼

他是一個基於python語言的WEB框架
  • 爲何使用Djangocss

    • 他是python中最大的框架集成不少api
    • 他是全球第五大框架(表明做豆瓣)
    • 適合開發工期短,效率高使用
  • Django的優點html

    • 開發效率高,功能強大
  • 經過wsgi模塊理解Django的工做集成原理前端

    • 路由分發器經過寫一個函數上傳一個字典,若是傳進來的environment.get('PATH_INFO')在字典中存在,就執行對應的函數,不然返回404f
  • wsgi是一種規範,wsgiref是基於wsgi規範開發的模塊python

    • 雖然本身寫web server比較的麻煩,可是咱們也從中瞭解了web框架的本質
      • 瀏覽器是socket客戶端,網站是socket服務端
      • wsgi是一種web server開發的規範,wsgiref實現了這個規範並在其內部實現了socket服務端
      • 根據url的不一樣執行不一樣的函數 - 路由分發
      • 函數 - 處理業務邏輯的進程
      • 圖案css js文件統一稱爲靜態文件,須要讀取內容直接返回給用戶瀏覽器

2.建立Django項目

  • django-admin.py startproject my_site 建立my_site項目mysql

    • 建立成功後會有幾個默認的文件
      • 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請求web

    • 1.首先匹配路由,查找對應的url對應的關係,找到了就調用返回頁面,不然404
    • 2.業務函數,執行業務邏輯
    • 3.返回數據給瀏覽器

啓動django web服務器 python3 manage.py runserver 0.0.0.0:8000ajax

​ 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架構沒有什麼太大的區別.sql

Django將MVC中的視圖進一步分解爲Django視圖和Django模板兩個部分shell

​ - 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 = '123@163.com',
       >>> ... password = '123',
       >>> ... )
    • 外鍵關聯建立

      >>> o = models.Article(
      >>> ... title = '我是Peter',
      >>> ... content = 'xixi',
      >>> ... pub_data = '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 = '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())

好久沒有整理以前的筆記了.... 😢

相關文章
相關標籤/搜索