• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Python框架Django -- 01 入門

    一、MVC和MVT


    1、MVC介紹



    M: Model,  模型, 和數據進行交互。


    V: View,  視圖, 產生html 頁面。


    C: Controller,  控制器, 接收請求,進行處理,和M和V進行交互,返回應答。


    2、MVT



    M:Model , 模型, 和MVC中M功能相同,和數據庫進行交互。


    V: View , 視圖, 和MVC中C功能相同,接收請求,進行處理,和M和T進行交互,返回應答。


    T: Template , 模板,和MVC中V功能相同,產生 html 頁面。


    二、搭建環境


    1、什么是虛擬環境


            之前安裝python包的命令: sudo pip3 install 包名。包的安裝路徑:/usr/local/lib/python3.5/dist-packages 。如果要安裝同一個包的不同版本,后安裝的包會把原來安裝的包覆蓋掉。這樣,如果同一臺機器上兩個項目依賴于相同包的不同版本,則會導致一些項目運行失敗。


    解決的方案就是:虛擬環境。


    虛擬環境是真實python環境的復制版本。


    2、安裝虛擬環境


    (1)、安裝虛擬環境


    root@ubuntu:~# sudo pip3 install virtualenv


    (2)、安裝虛擬環境擴展包并修改配置文件


    安裝虛擬環境擴展包,虛擬環境擴展包的目的是使用更加簡單的命令來管理虛擬環境


    root@ubuntu:~# sudo pip3 install virtualenvwrapper


    修改~目錄下的 .bashrc 配置文件,添加環境變量的配置


    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh




    配置完成之后使用命令刷新配置文件


    root@ubuntu:~# source .bashrc


    (3)、創建python3的虛擬環境


    mkvirtualenv -p python3 虛擬環境名稱




    創建虛擬環境小總結:


            ①、創建成功后,會自動工作在這個虛擬環境上。


            ②、創建虛擬環境需要聯網。


            ③、工作在虛擬環境上,提示符最前面會出現"(虛擬環境名稱)"。


            ④、所有的虛擬環境,都位于/home/python/下的隱藏目錄.virtualenvs下。


    (4)、退出虛擬環境


    (vm_py3) root@ubuntu:~# deactivate




    (5)、查看和使用虛擬環境


    查看所有已存在的虛擬環境


    workon 兩次tab鍵




    使用指定的虛擬環境


    workon 虛擬環境名稱




    (6)、刪除虛擬環境


    rmvirtualenv 虛擬環境名稱




    (7)、虛擬環境中的包操作


    在虛擬環境中可以使用pip命令操作python包,安裝命令如下:


    pip install 包名稱


    注意:在虛擬環境中不可使用sudo pip install 包名稱 來安裝python包,這樣安裝的包實際是安裝在了真實的主機環境上。


    查看虛擬環境中已經安裝的包


    pip list  
    
    或者
    
    pip freeze



    3、創建Django虛擬環境,安裝Django的包


            后面要學習使用django,我們使用的是django1.8.2的版本,這是一個穩定性高、使用廣、文檔多的版本,注意,如果前面刪除過虛擬環境py_django,則需要先創建一下,否則直接安裝django包即可。




    三、創建項目


    1、在py_django中創建文件夾,將項目創建在該文件夾下


    創建django項目命令


    django-admin startproject 項目名




    __init__.py:是一個空文件,說明test1是一個python模塊,在python2有了此文件,該模塊可以當作包來使用。


    settings.py:項目的配置文件。


    urls.py:項目的url配置文件。


    wsgi.py:web服務器和django框架交互的接口。


    manage.py:項目的管理文件。


    2、創建應用


    開發中,常常使用一個應用開發一個業務模塊。創建應用的語法如下:


    python manage.py startapp 應用名稱


    創建一個名稱為booktest的應用,并且查看應用的目錄結構:




    _init.py_:是一個空文件,表示當前目錄booktest可以當作一個python包使用。


    tests.py:文件用于開發測試用例,在實際開發中會有專門的測試人員,這個事情不需要我們來做。


    models.py:文件跟數據庫操作相關。


    views.py:文件跟接收瀏覽器請求,進行處理,返回頁面相關。


    admin.py:文件跟網站的后臺管理相關。


    3、安裝應用


            應用創建成功之后,需要安裝才可以使用,也就是建立應用和項目之間的關聯。需要修改與項目同名的文件夾中的settings配置文件中的內容。在配置文件的應用列表中,添加新創建的應用的名稱即可。本項目中的配置文件為 test/settings.py




    四、設計模型


            django中內嵌了ORM框架,不需要直接面向數據庫編程,而是定義模型類,通過模型類和對象完成數據表的增刪改查操作。ORM框架可以根據定義的模型,自動生成對應的表結構。使用django進行數據庫開發的步驟如下:1??在models.py中定義模型類   2??遷移  3?? 通過類和對象完成數據增刪改查操作。


            下面我們以保存圖書信息為例來給大家介紹Django中進行數據庫開發的整個流程。


    1、定義模型類


    模型類定義在models.py文件中,繼承自models.Model類。




    2、遷移


    (1)、生成遷移文件


    在項目目錄下,使用命令生成一個遷移文件,命令如下:


    python manage.py makemigrations






            Django框架根據我們設計的模型類生成了遷移文件,在遷移文件中我們可以看到fields列表中每一個元素跟BookInfo類屬性名以及屬性的類型是一致的。同時我們發現多了一個id項,這一項是Django框架幫我們自動生成的,在創建表的時候id就會作為對應表的主鍵列,并且主鍵列自動增長。


    (2)、執行遷移生成表


    在項目目錄下執行遷移命令,遷移命令如下:


    python manage.py migrate




            執行遷移操作之后,Django框架會讀取遷移文件,自動幫我們在數據庫中生成對應的表格,由于Django默認采用的是sqlite3數據庫,上圖中的db.sqlite3就是Django框架幫我們自動生成的數據庫文件,而Django生成的建表語句保存在項目下與項目同名的包中的db.sqlite3文件中,打開db.sqlite3需要先安裝sqlite3數據庫,安裝命令如下:




    安裝之后,在ubuntu終端中輸入以下命令,打開sqlite數據庫


    sqliteman




    在ubuntu界面中的File --> open中打開我們項目中的db.splite3文件,即顯式如下:




    注:使用遷移操作生成的表,表明默認為:應用名_模型類名小寫


    3、數據操作:通過模型類操作數據表


    (1)、進入項目shell終端


            完成數據表的遷移之后,就可以通過進入項目的shell終端,進行簡單的API操作,進入項目shell終端的命令如下:


    python manage.py shell




    (2)、對數據進行簡單的操作




    4、一對多關系映射


    (1)、在 models.py 中創建英雄表


    from django.db import models
    
    # Create your models here.
    
    # 定義一個圖書類,繼承自models.Model
    class BookInfo(models.Model):
        """圖書模型類"""
        # 定義屬性
        
        # CharField :表明該屬性對應字段為字符串類型,max_length : 設置字段長度
        bittle = models.CharField(max_length=20)    # 圖書名
        
        # DateField : 表明該字段為Date類型 
        bpud_date = models.DateField()  # 出版日期
    
    
    # 定義一個英雄類,繼承自models.Model
    class HeroInfo(models.Model):
    	"""英雄信息類"""
    	# 定義屬性
    	
    	hname = models.CharField(max_length=20)	# 英雄名稱
    	hgender = models.BooleanField(default=False)	# 英雄性別,Boolean類型的值,默認為False(男)
    	hcoment = models.CharField(max_length=20)	# 英雄備注
    	"""
    		BookInfo和HeroInfo是一對多的關系,需要在多的一方中這只外鍵用來關聯一的一方的主鍵
    	"""
    	hbook = models.ForeignKey('BookInfo')	# 關系屬性,建立BookInfo和HeroInfo的一對多的關系


    (2)、生成遷移文件




    (3)、執行遷移生成表




    (4)、進行shell,執行CRUD操作


    >>> from booktest.models import *
    >>> from datetime import date
    >>> 
    >>> b1 = BookInfo()
    >>> b1.bittle = '天龍八部'
    >>> b1.bpud_date = date(1919, 10, 11)
    >>> 
    >>> b1.save()
    >>> 
    >>> 
    >>> h1 = HeroInfo()
    >>> h1.hname = '喬峰'
    >>> h1.hgender = False
    >>> h1.hcoment = '降龍十八掌'
    >>> h1.hbook = b1
    >>> 
    >>> h1.save()
    >>> 
    >>> h2 = HeroInfo()
    >>> h1.hname = '段譽'
    >>> h2.hname = '段譽'
    >>> h2.hgender = False
    >>> h2.hcoment = '六脈神劍'
    >>> h2.hbook= b1
    >>> h2.save()
    >>> 
    >>> 
    >>> h3 = HeroInfo()
    >>> h3.hname = '王語嫣'
    >>> h3.hgender = True
    >>> h3.hcoment = '慧眼'
    >>> h3.hbook = b1
    >>> h3.save()
    >>> 
    >>> HeroInfo.objects.all()
    [<HeroInfo: HeroInfo object>, <HeroInfo: HeroInfo object>, <HeroInfo: HeroInfo object>]
    >>> 
    >>> 
    >>> h = HeroInfo.objects.get(id=2) 
    >>> h.hname
    '段譽'
    >>> h.hbook
    <BookInfo: BookInfo object>
    >>> h.hbook_id
    3
    >>> b = BookInfo.objects.get(id=3)
    >>> b.heroinfo_set.all()
    [<HeroInfo: HeroInfo object>, <HeroInfo: HeroInfo object>, <HeroInfo: HeroInfo object>]
    >>> 


    五、管理站點


    Django能夠根據定義的模型類自動地生成管理頁面。使用Django的管理模塊,需要按照如下步驟操作:


            管理界面本地化


            創建管理員


            注冊模型類


            自定義管理頁面


    1、管理界面本地化


            本地化是將顯示的語言、時間等使用本地的習慣,這里的本地化就是進行中國化,中國大陸地區使用簡體中文,時區使用亞洲/上海時區,注意這里不使用北京時區表示。


    打開 test1/settings.py 文件,找到語言編碼、時區的設置項,將內容改為如下:




    2、創建管理員


    (1)、創建帳號


    創建管理員的命令如下,按提示輸入用戶名、郵箱、密碼。


    (py_django) root@ubuntu:~/project/test1# python manage.py createsuperuser




    (2)、啟動服務


    (py_django) root@ubuntu:~/project/test1# python manage.py runserver




    (3)、瀏覽器訪問后臺管理頁面




    3、注冊模型類


            登錄后臺管理后,默認沒有我們創建的應用中定義的模型類,需要在自己應用中的admin.py文件中注冊,才可以在后臺管理中看到,并進行增刪改查操作。打開 booktest/admin.py 文件,編寫如下代碼:




    4、自定義模型管理類


            在列表頁只顯示出了BookInfo object,對象的其它屬性并沒有列出來,查看非常不方便。 Django提供了自定義管理頁面的功能,比如列表頁要顯示哪些值。打開booktest/admin.py文件,自定義類,繼承自admin.ModelAdmin類。




    此時,瀏覽器中顯示內容為:




    六、視圖及URL


            對于django的設計框架MVT,用戶在URL中請求的是視圖,視圖接收請求后進行處理,并將處理的結果返回給請求者。使用視圖時需要進行兩步操作:


            ①、定義視圖函數


            ②、配置URLconf


    1、定義視圖


            視圖就是一個Python函數,被定義在views.py中。視圖的必須有一個參數,一般叫request,視圖必須返回HttpResponse對象,HttpResponse中的參數內容會顯示在瀏覽器的頁面上。定義語法如下:


    from django.http import HttpResponse
    
    def 函數名(request):
    	# 進行處理。。。
    	return HttpResponse('頁面顯示的內容')


    打開booktest/views.py文件,定義視圖index如下:




    2、配置URL的配置文件


    (1)、瀏覽器請求URL查找對應視圖的過程


            請求者在瀏覽器地址欄中輸入url,請求到網站后,獲取url信息,然后與編寫好的URLconf逐條匹配,如果匹配成功則調用對應的視圖函數,如果所有的URLconf都沒有匹配成功,則返回404錯誤。一條URLconf包括url規則視圖兩部分:


            url規則使用正則表達式定義。


            視圖就是在views.py中定義的視圖函數。


    (2)、需要兩步完成URLconf配置:


            ①、在應用中定義URLconf配置文件(即應用下的urls.py文件)


            ②、包含到項目的URLconf配置文件(即項目同名文件夾下的urls.py)中


            url 配置的目的是讓建立url和視圖函數的對應關系。url配置項定義在urlpatterns的列表中,每一個配置項都調用url函數。url 函數有兩個參數,第一個參數是一個正則表達式,第二個是對應的處理動作


    配置url時,有兩種語法格式:


            ①、url(正則表達式,視圖函數名)


            ②、url(正則表達式,include(應用中的urls文件))


            工作中在配置url時,首先在項目的urls.py文件中添加配置項時,并不寫具體的url和視圖函數之間的對應關系,而是包含具體應用的urls.py文件,在應用的urls.py文件中寫url和視圖函數的對應關系。


    (3)、在booktest項目中進行視圖與URL的配置


    在 booktest/ 應用下創建urls.py文件,定義代碼如下:




    打開test1/urls.py文件,為urlpatterns列表增加項如下:




    3、瀏覽器訪問視圖


    (1)、url匹配的過程


            在項目的urls.py文件中包含具體應用的urls.py文件,應用的urls.py文件中寫url和視圖函數的對應關系。

            當用戶輸入如 http://127.0.0.1:8000/aindex 時,去除域名和最前面的/,剩下aindex,拿aindex字符串到項目的urls文件中進行匹配,配置成功之后,去除匹配的a字符,那剩下的index字符串繼續到項目的urls文件中進行正則匹配,匹配成功之后執行視圖函數index,index視圖函數返回內容hello python給瀏覽器來顯示。




    (2)、啟動項目,進行訪問測試




    七、模版


    1、在項目下創建模版文件夾




    2、在 test1/settings.py 中配置模版文件夾路徑




    3、在模版文件夾中創建應用同名文件夾,并編輯模版文件






    4、視圖中調用模版


    編輯 booktest/views.py文件


    from django.shortcuts import render     # django提供的用于加載模板需要的包
    from django.http import HttpResponse    # 導入httpresponse的包
    from django.template import loader,RequestContext   # 導入加載模板需要的包
    
    # Create your views here.
    
    # 自定義視圖函數
    def index(request):
        """ 使用模板文件 """
     
         """ 不是用django提供的render函數,需要進行以下4步來進行模板的調用:
     
             # 1.加載模板文件,獲取模板內容,返回一個模板對象
             temp = loader.get_template('booktest/index.html')
             
             # 2.定義模板上下文:即給模板傳遞數據,參數1:request對象;參數2:數據字典
             list1 = [1, 3, 4, 5, 6, 7, 9]
             context = RequestContext(request, {
                                                 "content":"模板變量",
                                                 "list":list1
                                                 })
             
             # 3.模板渲染:即替換模板中的變量,返回一個標準的html的內容的字符串
             ret_html = temp.render(context)
             
             # 4.將渲染之后的標準html數據返回給頁面瀏覽器
             return HttpResponse(ret_html)
     
         """
     
         """ 
             使用django提供的render函數進行模板的調用,
             render函數的參數是:參數1:request對象;參數2:模板頁面;參數3:數據字典;
             render函數的返回值是一個封裝了模板數據的HttpResponse對象,
             調用方式如下: 
     
         """
         list1 = {1, 3, 5, 7, 9}
         return render(request, "booktest/index.html", {"content":"模板變量","list":list1})




    5、瀏覽器測試結果




    八、案例__顯示圖書信息


    1、在views.py中定義顯示圖書信息的函數


    from django.shortcuts import render     # django提供的用于加載模板需要的包
    from django.http import HttpResponse    # 導入httpresponse的包
    from django.template import loader,RequestContext   # 導入加載模板需要的包
    from booktest.models import BookInfo    # 導入BookInfo模型類
    
    # Create your views here.
    
    # 自定義視圖函數
    
    # 顯示所有圖書信息的函數
    def show_books(request):
        """ 顯示所有圖書信息 """
        # 1.查詢出所有圖書信息
        books = BookInfo.objects.all()
        # 2.加載模文件,獲取模板內容,返回一個模板對象
        temp = loader.get_template('booktest/show_books.html')
        # 3.定義模板上下文:給模板傳遞數據
        context = RequestContext(request, {'books':books})
        # 4.對模板進行渲染:產生標準的html內容
        res_html = temp.render(context)
        # 返回數據給瀏覽器
        return HttpResponse(res_html)


    2、在booktest/urls.py中配置url配置項




    3、在test1/urls.py中配置url配置項




    4、編輯模版文件


    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>顯示所有圖書信息</title>
    </head>
    <body>
    <ul>
        {% for book in books %}
            <li>{{ book.btitle }}</li>
        {% endfor %}
    </ul>
    </body>
    </html>


    5、瀏覽器測試



    版權聲明:本文為wingzhezhe原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/wingzhezhe/article/details/79728336

    智能推薦

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    基于TCP/IP的網絡聊天室用Java來實現

    基于TCP/IP的網絡聊天室實現 開發工具:eclipse 開發環境:jdk1.8 發送端 接收端 工具類 運行截圖...

    猜你喜歡

    19.vue中封裝echarts組件

    19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...

    劍指Offer39-調整數組順序使奇數位于偶數前面

    一開始想著用冒泡排序的方法來做,但是bug還是很多,后來看了評論區答案,發現直接空間換時間是最簡單的,而且和快排的寫法是類似的。...

    【一只蒟蒻的刷題歷程】【藍橋杯】歷屆試題 九宮重排 (八數碼問題:BFS+集合set)

    資源限制 時間限制:1.0s 內存限制:256.0MB 問題描述 如下面第一個圖的九宮格中,放著 1~8 的數字卡片,還有一個格子空著。與空格子相鄰的格子中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。 我們把第一個圖的局面記為:12345678. 把第二個圖的局面記為:123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。 本題目的任務是已知九宮的初態...

    dataV組件容器寬高發生變化后,組件不會自適應解決方法

    項目中需要大屏幕數據展示,于是使用了dataV組件,但是使用是發現拖動瀏覽器邊框,dataV組件顯示異常,如圖: 于是查了官網,官網的解釋如下:   于是按照官網的意思編寫代碼: 于是可以自適應了...

    CSS3干貨10:如何做一個板塊標題水平線左邊帶顏色效果

    很多網站在設計欄目標題的時候,喜歡用下劃線分開欄目標題和內容部分。 而且線條左邊的部分往往還有顏色,且這個顏色跟標題的文字長短保持一致。效果如圖所示: 這種效果其實很簡單。 我這里給大家推薦兩種方式: 假定我們的標題部分 HTML 結構如下: 方式一:利用下邊框。灰色部分是 h1 的下邊框,藍色部分是 span 標簽的下邊框。 h1 的高度為 40px,span 也設置它的高度為 40px。這樣,...

    精品国产乱码久久久久久蜜桃不卡