1. 程式人生 > >Django框架的基本操作

Django框架的基本操作

day01:

5.框架

1.什麼是框架?

        框架是一個為了解決某些開放性問題二存在的一種結構。

2.框架的優點

        1.快速開發

        2.解決大部分通過問題

        3.bug少,穩定性高

3.框架的分類

1.前端框架

            處理(html,css,js)

2.後端框架

            ssh, ssm -----java

3.全棧框架

            包含web整體的解決方案,如:開發框架,執行環境,處理方案

            spring,
rails(Ruby), django(python)

4.python web

            1.Django:    重量級的python web 框架

            2.Tornado:  python web非同步處理框架

            3.Flask:        輕量級

            4.webpy:    輕量級

            5.web2py:   全棧框架,webpy 的加強版

在虛擬環境中安裝

    pip     install     Django
Pillow PyMySQL

day02:

1.框架模式

常用的框架模式:MVC、ORM、MVVM、MTV

1.MVC

        M:  models      模型  對資料庫操作

        V:  Views       檢視  對HTML操作

        C:  Controller  控制器 互動

2.MTV

        M:  Models      模型  對資料庫操作CRUD

        T:  Templates   模板  對HTML操作
V: Views 檢視 互動

2.Django框架

1.什麼是Django框架

    是一個開源框架,在2005年釋出,早起用來開發新聞類網站;

2.Django優點

    1.開源,有完美的文件支援

    2.解決方案多,內部功能強大

    3.提供了完整的路由系統

    4.自助式後臺管理

3.Django的安裝

    1.Linux中的安裝

        1.檢視已安裝的Django

            1.進入虛擬環境

            2.進入python互動模式下

            3.在互動模式中資料

                1.import    Django

                無反應,已經安裝好

                報錯:環境中沒有Django

                2.Django.VERSION    檢視版本

        2.安裝Django

            1.線上安裝   ----pip

                1.pip install Django==1.11.8

            2.離線安裝

                1.下載所需要的Django包

                http://www.djangoproject.com

                    download                    

                2.在Linux中解壓Django包

                    tar -xvf    Django-1.11.8.tar.gz

                3.進入到Django-1.11.8中

                    python setup.py install

    2.在Windows中安裝

        1.線上安裝

            pip  install Django

4.Django使用

    1.建立Django專案

        django-admin.py   startproject 專案名

        點選建立Django專案按鈕

    2.通過manage.py 啟動

        python manage.py runserver

    3.python manage.py runserver    0.0.0.0:8000

5.Django 的結果介紹

    1.manage.py  檔案

        負責執行Django中的各專案操作的檔案

            如: 

                啟動服務

                建立應用

                建立管理員,建立使用者

    2.主資料夾中的內容

        1.init.py

            專案初始化檔案,每當啟動專案時,自動執行

            有初始化檔案,放在此處

        2.setting.py(重要檔案)

            專案的主配置檔案

            1.BASE_DIR:專案所在地絕對路徑

                    2.DEBUG:除錯模式

                       開發過程中,推薦使用True

                      上線執行時,推薦使用False

                     3.ALLOWED_HOSTS

                         如果不設定,只有本季能訪問

                         通常推薦為“*”

                    4.INSTALLED_APPS

                         指定安裝的應用

                    5.MIDDLEWARE:指定中間

                    6.ROOT-URLCONF:指定專案的基礎路由配置檔案

                    7.TEMPLATES:指定模板資訊

                    8.DATABASES:制定資料庫資訊

                    9.LANGUGE_CODE:指定語言

        3.urls.py

            專案路由配置檔案

            路由:去哪找執行檔案

        4.wsgi.py

            應用伺服器配置,暫時不用

    5.URL使用

        1.urls.py 

            預設自主檔案下,包含所有請求地址到檢視的對映

        2.測試URL和檢視

            1.在專案主資料夾建立views.py 

                作用:包含所有定義好的檢視

                views.py

                from django.urls import path

                from django.http import HttpResponse

            2.在urls.py裡面追加

                from .views import *



        3.url 函式

            url 函式語法

            url(regex,views,kwargs=None,name=None)

            1.regex 

                正則表示式,匹配請求的url

            2.views

                URL 處理的檢視函式,自定義

            3.kwargs

                字典,向views傳參時使用

            4.name

                字串,給url起一個別名,在模板中使用

        4.通過url向views傳參

        from django.conf.urls import url

         url(r'^index/(\d{4})/(\d{2})/(\d{2})/$',index_views)

        http://localhost:8000/index/2018/07/11

        聯絡訪問:

            1.訪問地址:

                localhost:8000/zs/1989

                localhost:8000/ls/1999

            2.訪問地址:

                localhost:8000

                返回:歡迎訪問主頁

        5.用字典傳參

            {'name':'sss','age':'20'}

3.Django 應用

1.什麼是應用?

        應用就是網站中的獨立模組

2.建立應用

        1.命令

            ./manage.py  startapp 應用名稱

        2.在setting.py 中註冊應用

            INSTALLED_APPS=[

            ...........

            '應用名稱',

            ]

3.應用的結構

        1.migrations 目錄

            存放在資料庫日誌,是一個Django與資料庫互動的中介軟體

        2.init.py

            應用的後臺管理檔案

        3.admin.py

            應用的後臺管理配置檔案

        4.app.py

            應用的屬性配置檔案,不需要改動

        5.models.py 

            Models模型檔案

        6.tests.py

            測試模組,不需要改動

        7.views.py 

            定義檢視的檔案

        練習:

            1.建立應用並註冊

                1.index

                2.news

                3.music

            2.配置路由

                1.localhost:8000/index/index

                    交給index應用中的login_views 處理

                2.localhost:8000/index/news

                    交給news應用中的index_views 處理

                localhost:8000/index/news

                    交給news應用中的login_views 處理    

                3.localhost:8000/index/music

                    交給music應用中的index_views 處理

                localhost:8000/index/music

                    交給news應用中的login_views 處理

4.Django應用

5.Django中的模板

1.什麼是模板?

    就是一個網頁,可被檢視相應給使用者

2.模板設定

    在setting中的TEPLATES變數

        1.BACKEND:指定模板的搜尋引擎,不用改

        2.DIRS:指定模板所存在的目錄們

            DIRS:['index.temp','news.temp']

            推薦:DIRS為空

                2.在每個應用下建立貼膜拉特色資料夾,存放所有網頁

        3.APP_DIRS

            True:先從DIRS中指定的資料夾中查詢模板,如果沒有找到,在搜尋名為templates的資料夾   

    3.模板的載入方式

        1.使用loader獲取模板,通過Httpresponse進行響應

                    from django.template import loader

                    def XXX_views(request):

                        t = loader.get_template('xxx.html')

                        html = t.reader({})                             

                        return HttpResponse(html)

            2.使用render或者render_to_response直接載入

                1.render

                    return render(request,‘網頁’,{})

                2.render_to_response

                    可能被放棄

    4.url()中的第四個引數

            name:定義url的別名,允許在template中使用別名來訪問url

            在模板中,使用 name 載入

            <a href="{% url  'name別名'%}"></a>通過別名訪問路徑

作業:

1.建立專案名字叫   fruitday

2.建立應用      index

3.配置 主路由配置 和 index 應用路由配置

    1.訪問 localhost:8000

        交給index應用中  index_views 處理

    2.訪問localhost:8000:login    

        交給index應用中  login_views 處理

    3.訪問 localhost:8000/register 處理

        交給index應用中register 處理

day03:

5.模板的語法

            作用:允許將後端的資料傳遞給模板,在模板中顯示實際變數的值

                在Django中允許傳遞給模板作為變數的型別

                數字,字元,列表,元組,字典,函式,物件

            如何將變數傳到模板中:

            1.使用render載入模板

                dic = {

                ‘變數’:‘值’,   

                }

                return render(request,'',dic)

            2.使用loader載入模板

                t  =  loader.get_template('xx.html')

                html = t.render(dic)

                return HttpResponse(html)

            如何在模板中獲取變數的值:

                {{變數名}}

2.標籤

    1.什麼是標籤,

        允許巢狀一些伺服器基本邏輯運算到模板中

    2.語法

        {%%}

    3.常用標籤

        1.{% if %}...{% endif  %}

        2.{% if %}...{% else%}...{% endif %}

        3.{% ifequal %}...{% endifequal %}

        4.{% for 變數 in 列表|元組 %}

                {{變數}}

        {% endfor %}

        允許使用內建變數(免宣告)

        變數:forloop

        屬性: 

            1.forloop:counter:      記錄當前迴圈的次數

            2.forloop:counter0:     同上從0開始

            3.forloop:revcounter:   記錄未被遍歷的數量

            4.forloop:first:            布林值標記是否第一個專案

            5.forloop:last:         布林值,標記為最後一個專案

3.過濾器

    1.作用:

        在顯示變數中,允許對資料進行篩選或改變

    2.語法

        {{ var | 過濾器}}

    3.常用過濾器

        1.{{var |  upper}}

            將var的資料變為全大寫

        2.{{var |  lower}}

            將var的資料變為全小寫

        3.{{var |  floatformat:n}}

            將var四捨五入到n為小數

5.模板繼承

1.模板的繼承

        當多個模板具備相同的內容時,就可以使用繼承的方式來簡化程式碼的開發

        當子模板繼承父模板後,子模板會具備模板中所有的內容,並且可以修改或增加屬於自己的內容

2.模板繼承的語法

        1.在父模板中

             增加{%block 名稱%}....{%endblock%}

             在block中定義的是正常顯示在父模板中但允許被子模板修改的內容

    在父模板中{%block 名稱%}...{%endblock%}允許出現若干個

    2.在 子模板 中

                1.在最頂層的第一句話增加

                  {%extends '父模板的名稱'%}

                2.增加block標記, 編寫屬於自己的內容

                     {%block 名稱%}

                      ...

                      {%endblock%}

day04:

1.模型-models

1.什麼是模型?

    按照資料庫表結果來抽象出來的class在資料庫中,可以完成對資料的CRUD

    C:      create      

    R:      retrieve

    U:  update

    D:  delete

2.建立 和 使用模型 - ORM

    1.什麼是ORM?

        中文:物件關係對映

        三大特徵:

            1.資料表  到  類  對映

                允許將表自動生成一個class,也允許將類對應的自動生成表

            2.資料型別的對映

                允許將表中的欄位自動生成到程式語言中 的屬性,並能夠將表中的欄位的資料

                                型別,也對應生成到程式語言中對應資料型別

            3.關係對映

                資料庫的關聯關係:

                    一對一

                    一對多

                    多對多

                將表中的關聯關係也對映到程式語言的class,通過建立物件的關係來完成對映

    2.ORM的優點

        1.提高了開發效率,能夠自動完成class到table的對映或者table到class的對映,可以在程

        序中省略龐大的資料訪問層

        2.不用編寫SQL,也能完成歲資料的CRUD操作

3.建立 和 配置 資料庫

    1.資料庫建立

        create database webdb default charset utf8

    2.Django中資料庫配置

        在setting中配置資料庫資訊

        DATABASES = {

                'default': {

                            'ENGINE': 'django.db.backends.mysql', 

                           'NAME': 'webdb',

                            'USER':'root',

                            'PASSWORD':'mysql',

                            'HOST':'localhost', 

                           'PORT':'3306'

                        }

                    }

        1.ENGINE:引擎

            連線MySQL的引擎django.db.backends.mysql

        2.NAME:要連線的 資料庫名

        3.USER:使用者名稱名稱,通常都是root

        4.PASSWORD:使用者名稱密碼:mysql

        5.HOST:主機名

        6.POST:埠號:3306

4.資料庫的同步操作

    1. manage.py makemigrations

        作用將每個應用下的models先對映成資料庫的日誌檔案,並存放在每個應用下的migrations

        檔案中

        若報錯:

            在主目錄下的init.py

                import pymysql

                pymysql.install_as_MySQLdb()

    2.manage.py migrate

        作用:將每個應用下的migrations 資料夾中的日誌檔案同步到資料庫

5.編寫models

    1.注意

        1.models中的每個class都成為模型類或者實體類

        2.models中的每個實體類,必須繼承自models。Model

    2.建立模型類

        models.py

        from   django.db  import models

        class Publisher(models.Model):

            name = models.CharField(max_length= 30)

            address = models.CharField(max_length=50) 

            city = models.CharField(max_length=30)

            country = models.CharField(max_length=30)

            website = models.URLField()

6.Django提供的資料欄位 和 欄位選項

    1.資料欄位

        1.BooleanField()

        2.CharField()

        3.DateField()

        4.DecimalField()

        5.EmailField()

        6.FloatField()

        7.fileField()

        8.IntegerField()

        9.ImageField()

        10,URLField()

    2.欄位選項

        1.null:是否允許為空

            name=models.CharField(max_length=30,null=True)

        2.default:為列設定預設值

            name=models.CHarField(max_length=30,default='匿名')

        3.verbose_name:在後臺管理中,該列顯示的名稱

            name=models.CHarField(max_length=30,verbose_name=‘使用者名稱稱’)

    練習:

        models.py  追加兩個class

        1.Auther -作者

            1.name

            2.age:IntegerField()

            3.email:允許為空

        2.Book -書籍

            1.title:書名

            2.publication——date: 出版日期

7.資料的匯入和匯出以及版本切換

        1.版本切換

            1.  ./manage.py migrate

                執行最新的日誌檔案,同步到資料庫

            2. ./manage.py migrate  應用名 版本號

                ./manage.py migrate index 0001

        2.資料庫的匯入和匯出

            1.資料的匯出

                1.匯出所有的表結構和資料

                mysqldump -u root -p 資料庫名 > xx.sql

                2.只匯出表結構,不匯出資料

                mysqldump -u root -p 資料庫名 >  xxx.sql

            2.匯入資料

                mysql -u root -p 資料庫名 < xxx.sql

        3.通過資料庫自動匯出models

            (將table對映成Models)

            ./manage.py  inspectdb  > xx.sql

2.模型的資料庫操作方法(CRUD)

1.通過檢視向DB中增加資料

    1.Entry.object.create(屬性=值,屬性=值)

        ex:

            Auther.object.create(

            name="老舍",age="50",email="[email protected]"

            )

    2.建立Models 類的物件,通過save()增加

        obj = Entry(屬性=值,屬性=值)

        obj .save()

    3.通過字典建立Models類的物件,save()增加

        dic={

        '屬性':‘值’    

        }

        obj = Entry(**dic)

        obj .save()

2.通過檢視查詢資料

    所有的查詢都要基於Entry.objects的基礎上完成

    1.查詢介面

        1.all()

            語法:entry.objects.all()

            返回:QuerySet   - 查詢結果

            sql :select * from  Entry

        2.values()

            語法:entry.objects.all().value()

            作用:Query Set

            ex:

                Author.objects.all().value('name','age')

        3.order_by()

            語法:Entry.objects.all().order_by('id')

            作用:對查詢結果集中的資料進行排序

            返回:QuerySet

            ex:

                Author.objects.all().order_by('id')

                所有資料按照id列的值升序排序

                Author.objects.all().order_by('-id')

                所有資料按照id列的值降序排序

        4.exclude()

            語法:Entry.objects.exclude(屬性=值)

            作用:對指定條件取反

            返回:QuerySet

            ex:

                1.Author.objects.exclude(id=3)

                2.Author.objects.exclude(id=3,age=50)

        5.filter()

            語法:Entry.objects.filter(條件)

            作用:將滿足條件的資料篩選出來

            返回:QuerySet

        6.get()

            語法:Entry.objects.get(條件)

            返回:一個models物件

            注意:該函式只能返回一個物件,返回多個或沒有查詢到資料的話都丟擲異常

作業:

    根據fruitday 中的login和register,分析天天果園中使用者表的資訊

        1.建立資料庫 FuritDay

        2.建立模型類 - Models

            ...

            增加一個欄位,是否為活躍使用者

day05:

    2.查詢謂詞

        每個查詢謂詞都是一個條件,真正查詢時會將謂詞翻譯成對應的條件語句

        常用查詢謂詞

            常用查詢謂詞:

                1.__exact

                    作用:等值判斷,等同於 =

                    Author.objects.get(id_exact = 1)

                    =   Author.objects.get(id = 1)

                2.lt、gt、gte、lte(前置雙下滑線)

                    作用:數值比較

                    Author.objects.filter(age__gt = 35)        =   age > 35

                3.__contains

                    作用:查詢包含指令字元的

                    Author.objects.filter(name__contains='元')

                    select * from author where name like ‘%元%’

                4.startwith,endwith

                    作用:查詢指定字元作為開始/結束

                    Auhtor .objects.filter(name__startwith=’霍‘)

                    Author.objects.filter(name__endwith="真")

3.通過檢視修改操作

1.修改單個物件

        1.通過get()得到要修改的models物件

        2.通過models物件直接修改資料即可

        3.通過models物件的save()函式直接儲存

        author = Author.objects.get(id=1)

        auhtor.name = '愛新覺羅·康熙'

        author.age = 200

        author.save()

2.批量修改

        呼叫QuerySet的update()即可完成

        Author.objects.all().update(屬性=值,屬性=值)

4.通過檢視刪除資料

    1.delete()

        Author.objects.get(id=2).delete()

        Author.objects.filter(age__gt=50).delete()

5.F()操作和Q()操作

    1.F()

        update author ser age  = age + 10

        Author .objects.all().update(age = age+ 10)

        作用:用於執行過程中獲取某列的值

        語法:F('列名')

        from Django.db.models import F

        Author .objects.all().update(age = F('age') + 10)

    2.Q()

        from  django.db.models import Q

        Author.objects.filter(Q(id=1) | Q(age=60)) 



6.原生的資料庫操作

    1.查詢

        介面:raw()

        語法:Entry.objects.raw(sql)

                引數sql:要執行的查詢SQL語句

    2.增刪改

        def cud(request):

            with connection.cursor() as cursor:

                sql = '...'

                cursor.execute(sql)

                return render(......)

1.使用後臺管理models

1.建立管理員

    manage.py createsuperuser

    username:admin    指定使用者

    email:[email protected]     指定郵箱

    password:adminadmin     密碼8位

2.基本管理

1.在應用中admin.py 中註冊要管理的models

        1.admin.py

            作用:註冊需要管理的models,只有在此註冊的models才允許被後臺管理

        2.註冊Models

            from .models import *

            admin.site.register(Entry)

            ex:

                admin.site.register(Author)

        3.修改models.py 處理顯示的內容

            在models 中的各個class中追加

                def ——str--(self):

                    return self.name

        4.通過Meta內部類實現 展開屬性

            每個models 類中都可以宣告 內部類Meta

            class Author(models,Models):

                ...

                class  Meta:

                    1.db_table:指定實體類對應的表的名字

                    2.verbose_name:定義類在admin中顯示的名稱(單數形式)

                    3.verbose_name_plural:效果同上,複數形式

                    4.ordering:指定資料們的排序方式,取值為一個列表,預設是升序排序,降序

                                的話加減號’-'

2.高階管理

1.在admin.py中建立管理類,實現高階管理功能

        1.定義EntryAdmin,繼承自admin.ModelsAdmin

        class AuthorAdmin(admin.ModelsAdmin):

            pass

        2.註冊   高階管理類

            admin.site.register(Entry,EntryAdmin)

            admin.site.register(Author,AuthorAdmin)

2.允許在EntryAdmin中增加的屬性

1.list_display()

        作用:指定顯示在實體資訊頁上的欄位

        取值:有屬性名組成的元組或列表

            ex:

                list_display = [

                'name','age','email'

                ]

2.list_display_links

        作用:定義能夠連結到詳細頁面的連結

        取值:有屬性名組成的元組或列表

        注意:取值必須出現在list_display中

3.list_editable

        作用:指定在是資訊頁上允許被修改的欄位

        取值:由屬性名組成的元組或列表

        注意:取值不能出現在list_display_links中的值     

4.search_fields

        作用:新增允許被搜尋的欄位

        取值:由屬性組成的元組

5.過濾器list_filter

        作用:在實體資訊頁右側增加一個過濾器

        一遍實現快速篩選

        取值:由屬性名組成的  

day06:

6.date_hierarchy

    作用:在實體資訊頁面的頂部增加時間選擇器

    取值:必須是DateField 或DateTimeField的列名

7.fields

    作用:在實體的詳細頁中,定義顯示那些欄位,按照什麼樣的順序

    取值:由屬性名組成的元組或列表

8.fieldsets

    作用:在實體詳細頁面中,對屬性進行分組

    注意:fieldsets 和 fields不能同時出現

    語法:

        fieldsets = (

            ('分組名稱1',{

            'fields':('欄位1','欄位2'),

            'classes':('collapse')}),

            ('分組名稱2',{

            'fields':('欄位1','欄位2'),

            'classes':('collapse')}),

        )

2.Django的連線查詢(關係對映)

1.一對一對映(1:1)

1.什麼是一對一

        A表中的一條資料對應B表中的一條資料

        典型代表:一夫一妻

        資料庫中的實現:

            A表:設定主鍵

            B表:增加一列,並引用自A表中的主鍵,並增加唯一約束

2.語法

        一對一涉及到兩個類中的任何一個類

        屬性 = models.OneToOneField(Entry)

        class Author(models.Model):

            name = models.CharField(max_length=30)

    class Wife(models.Model):

            name = models.CharField(max_length=30)

            author = models.OneToOneField(Author,on_delete=models.CASCADE)

        正向查詢:通過wife找Author

        wife = Wife.objects.get(id=1)

        author = wife.author

        反向查詢:通過Author找wife

        author = Author.objects.get(name='霍元甲')

        wife = author.wife

2.一對多

1.什麼是一對多

        A表中的一條資料對應B表中的任意條資料

        如:出版社 和 書籍

        在資料庫中的體現

            A表:設定主鍵

            B表:引用A表的主鍵

2.語法

        使用外來鍵(Foreign Key)

        屬性 = models.ForeignKey(Entry)

        ex:

            Book(m)和Publisher(1)

            class Book():

                publisher = models.ForeignKey(Publisher,null=True,on_delete=models.CASCADE)

3.查詢

        1.正向查詢 通過book找publisher

            title = '通過book找publisher'

            book = Book.objects.get(id=1)

            publisher = book.publisher

        2.反向查詢 通過publisher找book

            publisher = Publisher.objects.get(name='交大出版社')

            listbook= publisher.Book

day07:

3.多對多

1.什麼是多對多

        A表中一條資料對應B表中任意條資料匹配,

        同時B表中的一條資料也可以與A表中的任意條資料對應   

2.語法

在多對多的任何一個Models類中均可實現

entry = models.ManyToManyField(Entry)

class Book(models.Model):

    ......

class Author(models.Model):

    book = models.ManyToManyField(Book)

3.自定義查詢物件(objects)

1.宣告類 EntryManager,繼承自models,Manager,在EntryManager中增加自定義的函式

    class AuthorManager(models.Model):

        def 函式名(self,自定義引數):

            ....

            return ...

        def   .........

3.HttpRequest

1.什麼是HTTPRequest

    HttpRequest,請求物件,封裝了請求物件過程中所有在Django中的資料,HttpRequest被化成了request封裝到了檢視處理函式中作為引數,該引數在試圖處理函式被動呼叫時,自動傳入。

2.HttpRequest中的主要內容

    1.request.scheme:   請求協議

    2.request.body:     請求主體

    3.request.path:     請求路徑

    4.request.method:   請求方式

    5.request.get_host():   請求主機地址或者域名

    6.request.GET:      封裝了GET方式的請求資料

    7.request.POST:     封裝了POST方式的請求資料

    8.request.COOKIES:  封裝了cookies的資料

    9.request.META:     封裝了請求的元資料

3.有關HTTP協議

1.每一個請求會有method

        請求的method預設為get

        method:get、post、put、delete

        get:請求資料在位址列後

            Query String

        post:請求資料在請求主體中

            FormData

2.請求主體

        只有post、put才能產生請求主體

4.csrf 跨站點攻擊

    目的:解決跨站點發送POST請求的問題

    解決方案:

        1.刪除Django.middleware.csrf.CsrfViewMiddleware

        2.在處理的檢視上加上標記@csrf_protect

        3.在模板中<form>的底下第一行增加一個

            {%scrf_token%}

5.獲取請求提交資料

1.GET請求

        request.GET['名稱']

2.POST請求

        request.POST['名稱']

        建議:request.POST.get('名稱')

                request.POST.get(name)