哪些請求方式在請求地址的時候可以帶請求體?
只有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
- 先將服務器緩存改爲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"
- 再將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))