Django框架知識要點總結

哪些請求方式在請求地址的時候可以帶請求體?

只有PATCH、POST、PUT、DELETE訪問一個url地址時可以帶請求體

web框架和web服務器

在這裏插入圖片描述
web框架:flask Django

作用:

1.路由分發(根據url找到對應的處理函數)

2.調用處理函數進行業務處理。

web服務器 app.run()

作用:

1.解析請求報文,調用框架程序處理請求。

2.組織響應報文,返回內容給客戶端。

web框架學習方法

  • 如何搭建工程程序

    工程的組建

    工程的配置

    路由定義

    視圖函數的定義

  • 如何獲取請求數據(操作request對象)

  • 如何構造響應數據(構造response對象)

  • 如何使用中間層

    請求鉤子

  • 框架提供的其他功能組件

    數據庫

    模板

    admin

Django簡介

Django的主要目的是簡便、快速的開發數據庫驅動的網站。強調代碼複用、快速開發和DRY(不要自己重複造輪子)原則。

特點

1.重量級框架

Django原生提供了衆多的功能組件,讓開發更簡便快速。

  • 提供項目工程管理的自動化腳本工具
  • 數據庫ORM支持(對象關係映射,英語Object Relational Mapping)
  • 模板
  • 表單
  • Admin站點
  • 文件管理
  • 認證權限
  • session機制
  • 緩存

2.MVT開發模式

Model(模型)-View(視圖)-Template(模板)

Model,負責和數據庫交互,進行數據處理

View,用於接收請求,處理業務邏輯

Template,負責封裝構造要返回的html

其實和MVC框架一樣

Django框架環境安裝&項目創建

1)命令

mkvirtualenv name -p python3  # 創建虛擬環境
workon name # 進入虛擬環境
pip install django==1.11.11 # 安裝django
cd 目錄  # 切換目錄
django-admin startproject <項目名稱> # 創建項目
python manage.py startapp #創建子應用

2)進行子應用註冊

點開項目目錄下的settings,在INSTALLED_APPS中配置

在這裏插入圖片描述

3)啓動

python manage.py runserver

定義視圖函數

定義在子應用的views.py中

需要request接收請求並返回響應對象

def index(requset):
    """request:接收請求對象"""
    # 返回相應對象
    return HttpResponse('hello world')

URL配置

1) 在子應用中創建urls.py,設置子應用中url地址和視圖函數之間的對應關係

from django.conf.urls import url
from users import views

urlpatterns = [
    # 添加當前子應用中url地址和視圖函數之間的對應關係
    # url('地址url正則表達式','對應視圖函數')
    url(r'index',views.index),
]

2)在項目總的urls.py文件中包含子應用中的urls.py文件

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 包含子應用中urls.py文件
    url(r'^users/',include('users.urls'))
]

3)Django路由匹配過程說明

先找項目總的urls.py中正則匹配url地址,調用視圖函數,再進入子應用中的urls.py進行正則匹配,調用視圖函數
在這裏插入圖片描述

4) 路由配置時兩個注意點:

子應用中進行url配置時,嚴格匹配開頭和結尾

Django url 地址配置的默認風格時:末尾加/

url(r'^index/$', views.index)

5)Django路由配置-url地址的反向解析

總的應用中定義別名用namespace=’’

url(r'^users/', include('users.urls', namespace='users')),

子應用中定義別名用name=’’

url(r'^index/$', views.index, name='index'),

根據視圖獲取對應的url地址,通常配合重定向進行使用。

def url_reverse(request):
    # 獲取index視圖所對應的url地址
    from django.urls import reverse
    req_url = reverse('users:index')
    return HttpResponse('OK')

配置文件settings.py

1)BASE_DIR(根目錄)

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

2)DEBUG

  • 修改代碼文件,程序自動重啓
  • Django程序出現異常時,向前端顯示詳細的錯誤追蹤信息

3)中國語言與時區

在settings.py中配置

# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/

# LANGUAGE_CODE = 'en-us' # 設置語言
LANGUAGE_CODE = 'zh-Hans' # 設置語言

# TIME_ZONE = 'UTC' # 設置時區
TIME_ZONE = 'Asia/Shanghai' # 設置時區

4)靜態文件的使用

在settings.py中配置

1)設置訪問靜態文件路徑的前綴地址

2)指定Django中靜態文件存放的目錄

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
# 設置訪問靜態文件路徑的前綴地址
STATIC_URL = '/static/'
# 指定Django中靜態文件存放的目錄
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

請求參數傳遞

4種傳參方式

1.通過url地址傳遞參數(利用正則表達式提取參數的方法從url中獲取請求參數)
#/weather/城市名/年份/:比如:/weather/shanghai/2019/
#flask: 路由轉換器 /weather/<city>/<int:year>
#Django:

#未命名參數按定義順序傳遞,正則需要小括號括起來,分組
#在urls中配置正則
url(r'^weather/([a-z]+)/(\d{4})/$', views.weather),

#在視圖函數中獲取
def weather(request, city, year):
    print('city=%s' % city)
    print('year=%s' % year)
    return HttpResponse('OK')
    
#命名參數按名字傳遞
#在urls中配置正則 ?P給參數起別名
url(r'^weather/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.weather),

#在視圖函數中獲取
def weather(request, year, city):
    print('city=%s' % city)
    print('year=%s' % year)
    return HttpResponse('OK')
2.請求參數傳遞(通過查詢字符串傳參)
# /qs/?a=1&b=2&c=3&c=4
# flask:request.args
def get_qs(request):
    # 獲取查詢字符串的參數
    a = request.GET.get('a')
    b = request.GET.get('b')
    c = request.GET.get('c') # ,如果c對應多個值,默認只查詢到最後一個值 
    clist = request.GET.getlist('c') # 使用此方法可以查詢c的列表
    return HttpResponse('OK')
    
3.通過請求體傳遞參數(json數據或表單)
表單數據:/from_data/

request.POST:QueryDict類型的對象,允許一個鍵對應多個值

request.POST.get('name')
request.POST.get('age')

<from methods='get' action='提交地址'>
	<input type='text' name='a'/>
	<input type='text' name='b'/>
	<input type='submit' value='提交'/>
</from>

json數據:/json_data/
request.body

import json
def get_body_json(request):
    json_str = request.body
    json_str = json_str.decode()  # python3.6 無需執行此步
    req_data = json.loads(json_str)
    print(req_data['a'])
    print(req_data['b'])
    return HttpResponse('OK')

注意:使用postman必須註釋csrf功能,另外postman測試的時候網址後面一定要加斜槓!!!

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
4.通過請求頭傳遞參數
/header_data/
request.META:python 字典,保存請求頭中的所有數據
請求中的任何HTTP頭部轉換爲HTTP_的鍵時,都會將所有字母大寫並將連接符替換爲下劃線,最後加上META前綴
request.META.get('HTTP_NAME')
# /header_data/
def get_header(request):
    # 獲取請求頭傳遞的參數
    type = request.META.get('CONTENT_TYPE')
    name = request.META.get('HTTP_NAME')

    return HttpResponse('OK')

Django和flask中request對象屬性對比

在這裏插入圖片描述

響應Response

響應對象的構造與說明

視圖訪問響應時返回HttpResponse類的對象或者子類的對象

response = HttpResponse(content='響應內容', content_type='響應體數據類型', status='狀態碼')
response['NAME'] = 'ITCAST' #響應頭可以直接將HttpResponse對象當做字典進行響應頭鍵值對的設置
return response

# 示例
# /get_response/
def get_response(request):
    # 響應對象構造
    response = HttpResponse('content body', content_type='text/html', status=200)

    # 向響應頭中添加數據
    response['NAME'] = 'ITCAST'
    return response

返回頁面重定向(重點)

# 反向解析獲取index視圖所對應的url地址
req_url = reverse('users:index')
return redirect(req_url)

返回json數據(重點)

from django.http import JsonResponse
return JsonResponse({'name':monkey,'age',23})

狀態保持

cookie的設置和獲取

diango中cookie的設置和獲取:
response = HttpResponse('ok')
response.set_cookie(cookie名, value=cookie值, max_age=cookie有效期) # 3600(一小時過期)
return response
讀取:
def demo_view(request):
    name = request.COOKIES.get('name')
    print(name)
    return HttpResponse('OK')
刪除:
def del_cookie(request):
	response = HttpResponse('OK')
	response.delete_cookie('name')
	return response

session儲存說明

session:數據存儲在服務器,以key-value進行存儲。

特點: session依賴於cookie,每個客戶端的session數據的標識存儲到cookie中

flask session過期時間默認一個月,django session過期時間默認爲2周。

session的三種儲存方式

1.數據庫

存儲在數據庫中,如下設置可以寫,也可以不寫,這是默認存儲方式

SESSION_ENGINE='django.contrib.sessions.backends.db'

2.混合本地緩存

存儲在本機內存中,如果丟失則不能找回,比數據庫的方式讀寫更快。

SESSION_ENGINE='django.contrib.sessions.backends.cache'

3.混合存儲

優先從本機內存中存取,如果沒有則從數據庫中存取。

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

session存儲到redis設置

安裝擴展 pip install django-redis

  1. 先將服務器緩存改爲redis

在settings.py文件中做如下設置 (緩存可以有多個空間,需要多個空間複製default從新命名就行了)

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
  1. 再將session設置到緩存中

session的設置和獲取

# /set_session/
def set_session(request):
    # 設置session
    request.session['name'] = 'itcast'
    request.session['age'] = 12

    return HttpResponse('OK')


# /get_session/
def get_session(request):
    # 獲取session
    name = request.session.get('name')
    age = request.session.get('age')

    return HttpResponse('name: %s age: %s' % (name, age))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章