Django -- 基礎

十二章 Django

12.1 HTTP

超文本傳輸協議(英文:Hyper Text Transfer Protocol,HTTP)是一種用於分佈式、協做式和超媒體信息系統的應用層協議。HTTP是萬維網的數據通訊基礎.HTTP有不少應用,最著名的是用於Web瀏覽器服務器之間的雙工通訊.html

HTTP是一個客戶端(用戶)和服務器端(網站)請求和應答的標準(TCP).python

12.1.1 HTTP請求/響應的步驟:
  1. 客戶啊短鏈接到Web服務器mysql

    一個HTTP客戶端,一般是瀏覽器,與Web服務器的HTTP端口(默認爲80)創建一個TCP套接字鏈接.web

  2. 發送HTTP請求面試

    經過TCP協議套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行,請求頭部,空行和請求數據4部分組成.sql

  3. 服務器接收請求並返回HTTP響應數據庫

    Web服務器解析請求,定位請求資源.服務器將資源副本寫到TCP套接字,由客戶端讀取.一個響應由狀態行,響應頭部,空行和響應數據4部分組成django

  4. 釋放鏈接TCP鏈接flask

    若connection 模式爲close,則服務器主動關閉TCP鏈接,客戶端被動關閉鏈接,釋放TCP鏈接;若connection 模式爲keepalive,則該鏈接會保持一段時間,在該時間內能夠繼續接收請求;瀏覽器

  5. 客戶端瀏覽器解析HTML內容

    客戶端瀏覽器首先解析狀態行,查看代表請求是否成功的狀態代碼。而後解析每個響應頭,響應頭告知如下爲若干字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,並在瀏覽器窗口中顯示。

在瀏覽器地址欄鍵入URL,按下回車以後經歷的流程:(面試題)

  1. 瀏覽器向DNS服務器請求解析該URL中的域名所對應的的IP地址;

  2. 解析出IP地址後,根據IP地址和默認端口80,和服務器創建TCP鏈接

  3. 瀏覽器發出讀取文件(URL中域名後面部分對應的文件)的HTTP請求,該請求報文做爲TCP三次握手的第三個報文的數據發送給服務器.

  4. 服務器對瀏覽器請求做出相應,並把對應的HTML文本發送給瀏覽器

  5. 釋放TCP鏈接

  6. 瀏覽器將該HTML文本並顯示內容

12.1.2 HTTP請求方法
  1. GET

    向指定的資源發出「顯示」請求。使用GET方法應該只用在讀取數據,而不該當被用於產生「反作用」的操做中,例如在Web Application中。其中一個緣由是GET可能會被網絡蜘蛛等隨意訪問。

  2. HEAD

    與GET方法同樣,都是向服務器發出指定資源的請求。只不過服務器將不傳回資源的本文部分。它的好處在於,使用這個方法能夠在沒必要傳輸所有內容的狀況下,就能夠獲取其中「關於該資源的信息」(元信息或稱元數據)。

  3. POST

    向指定資源提交數據,請求服務器進行處理(例如提交表單或者上傳文件)。數據被包含在請求本文中。這個請求可能會建立新的資源或修改現有資源,或兩者皆有。

  4. PUT

    向指定資源位置上傳其最新內容。

  5. DELETE

    請求服務器刪除Request-URI所標識的資源。

  6. TRACE

    回顯服務器收到的請求,主要用於測試或診斷。

  7. OPTIONS

    這個方法可以使服務器傳回該資源所支持的全部HTTP請求方法。用'*'來代替資源名稱,向Web服務器發送OPTIONS請求,能夠測試服務器功能是否正常運做

  8. CONNECT

    HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器。一般用於SSL加密服務器的連接(經由非加密的HTTP代理服務器)。

12.1.3 HTTP狀態碼

全部HTTP響應的第一行都是狀態行,依次是當前HTTP版本號,3位數字組成的狀態代碼,以及描述狀態的短語,彼此由空格分隔。

狀態代碼的第一個數字表明當前響應的類型:

  • 1xx消息——請求已被服務器接收,繼續處理

  • 2xx成功——請求已成功被服務器接收、理解、並接受 ***

  • 3xx重定向——須要後續操做才能完成這一請求

  • 4xx請求錯誤——請求含有詞法錯誤或者沒法被執行

    404: NOT FIND(服務器上沒有) 403 服務器上有,可是沒有權限 ***

  • 5xx服務器錯誤——服務器在處理某個正確請求時發生錯誤

12.1.4 URL

超文本傳輸協議(HTTP)的統一資源定位符將從因特網獲取信息的五個基本元素包括在一個簡單的地址中:

  • 傳送協議。

  • 層級URL標記符號(爲[//],固定不變)

  • 訪問資源須要的憑證信息(可省略)

  • 服務器 -- (一般爲域名,有時爲IP地址)

  • 端口號 -- (以數字方式表示,若爲HTTP的默認值":80",https 端口默認":443"可省略)

  • 路徑 -- (以「/」字符區別路徑中的每個目錄名稱)

  • 查詢 -- (GET模式的窗體參數,以「?」字符爲起點,每一個參數以「&」隔開,再以「=」分開參數名稱與數據,一般以UTF8的URL編碼,避開字符衝突的問題)

  • 片斷 -- 以「#」字符爲起點

https://www.sogou.com:443/web?query=海水兩邊顏色不一樣&_asf=www.sogou.com&_ast=&w=01015002&p=40040108&ie=utf8&from=index-nologin&s_from=index&oq=&ri=0&sourceid=sugg&suguuid=&sut=0&sst0=1566374533005&lkt=0%2C0%2C0&sugsuv=0003ECF37B7010FB5D174856999B7817&sugtime=1566374533005

  • http,是協議;

  • www.sogou.com是域名,服務器

  • 443是服務器上的網路端口號

  • /web 是路徑

  • ?query=海水兩邊顏色不一樣 : 問號以後是查詢參數

請求 ( 瀏覽器發給服務器的數據,request )

響應 ( 服務器發給瀏覽器的數據,response )

12.1.5 web框架

web框架的本質 : socket服務端

1. web框架的功能
  1. 使用socket收發消息

  2. 根據不一樣的路徑返回不一樣的內容

  3. 返回動態的數據(字符串的替換 -- 模板的渲染(使用jinja2) )

分類:

  • Django實現 2 3 功能

  • flask 實現 2 功能

  • tornado 實現 1 2 3功能

2. 服務器程序和應用程序

對於真實開發中的python web程序來講,通常會分爲兩部分:服務器程序和應用程序。

服務器程序負責對socket服務端進行封裝,並在請求到來時,對請求的各類數據進行整理。

應用程序則負責具體的邏輯處理。爲了方便應用程序的開發,就出現了衆多的Web框架,例如:Django、Flask、web.py 等。不一樣的框架有不一樣的開發方式,可是不管如何,開發出的應用程序都要和服務器程序配合,才能爲用戶提供服務。

WSGI(Web Server Gateway Interface)就是一種規範,它定義了使用Python編寫的web應用程序與web服務器程序之間的接口格式,實現web應用程序與web服務器程序間的解耦。

經常使用的WSGI服務器有uWSGI、Gunicorn。而Python標準庫提供的獨立WSGI服務器叫wsgiref,Django開發環境用的就是這個模塊來作服務器。

12.2 Django基礎

12.2.1 Django的下載安裝
  1. 命令行

    pip3 install django==1.11.23 -i https://pypi.tuna.tsinghua.edu.cn/simple

  2. pycharm

12.2.2 建立項目
  1. 命令行

    django-admin startproject 項目名稱

  2. pycharm

    flie _ new_project _ django _ 項目路徑 選解釋器

12.2.3 啓動項目
  1. 命令行

    • python manage.py runserver # 127.0.0.1:8000

    • python manage.py runserver 80 # 127.0.0.1:80 修改端口號

    • python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80 修改IP和端口號

  2. pycharm

    點綠三角 dj --> 不要右鍵運行文件

12.2.4 簡單的使用
  1. urls.pyurl 與函數的對應關係,寫函數

from django.shortcuts import HttpResponse,render
​
def func(request):
    return HttpResponse('返回的字符串')   # 返回字符串
def home(request):
    return render(request,'home.html')   # 返回html頁面
​
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^func/', func),                # 路徑和函數的對應關係
    url(r'^home/', home),
]
  1. 靜態文件的配置

STATIC_URL = '/static/'  # 別名
​
STATICFILES_DIRS = [     # 按照列表的順序進行查找
    os.path.join(BASE_DIR, 'x1'),
    os.path.join(BASE_DIR, 'static'),
    os.path.join(BASE_DIR, 'x2')
]
  1. 登陸的實例

    form表單

    1. action -- 提交的地址 , method -- 請求方法 ( 默認是get , 設置post )

    2. input 須要有name屬性 , required表示必須填寫(能夠去掉)

    3. submit 提交的按鈕或者input

    4. form表單 novalidate不須要校驗

    目前提交post請求,要註釋一個csrf中間件 ( setting.py文件)

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',    # csrf中間件
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
  1. GET和POST

    # Django中獲取數據:
    request.GET.get('k1',返回值)  # 獲取數據
    request.POST.get('k1',返回值) # 提交數據
12.2.5app
  1. 新建app

    python36 manage.py startapp app名字
  2. 註冊app

    在setting中

    INSTALLED_APPS = [
        # 兩種方法
        'app01',  
        'app01.apps.App01Config',  # 推薦寫法
    ]

    目錄:

    admin.py      django提供一個 admin工具 
    apps.py       app的信息
    models.py     模型  model  跟數據庫有關
    views.py      寫函數
12.2.6 使用mysql數據庫的流程
  1. 建立一個mysql數據庫

    注意setting.py文件中的 TEMPLATES 的 DIR 路徑

  2. 在settings中配置數據庫

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql', # 引擎
            'NAME': 'day54',                    # 數據庫名稱
            'HOST': '127.0.0.1',                  # IP
            'PORT': 3306,                         # 端口號
            'USER': 'root',                       # 用戶名
            'PASSWORD': '123'                     # 密碼
        }
    }
  3. 使用pymysql模塊鏈接數據庫

    # 寫在與setting同級目錄下的init.py中
    import pymysql
    pymysql.install_as_MySQLdb()
  4. 寫對應關係,在app下的models.py中寫類

    class User(models.Model):
        username = models.CharField(max_length=32) # varchar類型(長度32)
        password = models.CharField(max_length=32) # varchar類型(長度32)
  5. 執行數據庫遷移的命令

    python36 manage.py makemigrations  # 記錄下models.py的變動
    python36 manage.py migrate         # 將變動記錄同步到數據庫中
12.2.7ORM

ORM概念

  • 對象關係映射(Object Relational Mapping,簡稱ORM)模式是一種爲了解決面向對象與關係數據庫存在的互不匹配的現象的技術。

  • 簡單的說,ORM是經過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關係數據庫中。

  • ORM在業務邏輯層和數據庫層之間充當了橋樑的做用。

ORM優點

  • ORM解決的主要問題是對象和關係的映射。它一般將一個類和一張表一一對應,類的每一個實例對應表中的一條記錄,類的每一個屬性對應表中的每一個字段。

  • ORM提供了對數據庫的映射,不用直接編寫SQL代碼,只需操做對象就能對數據庫操做數據。

  • 讓軟件開發人員專一於業務邏輯的處理,提升了開發效率。

ORM劣勢

  • ORM的缺點是會在必定程度上犧牲程序的執行效率。

  • ORM的操做是有限的,也就是ORM定義好的操做是能夠完成的,一些複雜的查詢操做是完成不了。

  • ORM用多了SQL語句就不會寫了,關係數據庫相關技能退化...

在Django中model是你數據的單1、明確的信息來源。它包含了你存儲的數據的重要字段和行爲。一般,一個模型(model)映射到一個數據庫表。

基本狀況:

  • 每一個模型都是一個Python類,它是django.db.models.Model的子類。

  • 模型的每一個屬性都表明一個數據庫字段。

  • 綜上所述,Django爲您提供了一個自動生成的數據庫訪問API

orm操做

獲取對象
​
ret = models.User.objects.get(username=username, password=password) 
# 找不到或者找到多個都會報錯
​
ret = models.User.objects.filter(username=username, password=password) 
# queryset對象列表:查到幾個列表中有幾個,沒有查到爲空列表
相關文章
相關標籤/搜索