裝飾器(加入functools.wraps裝飾,保留函數的元數據--函數名/註釋)css
1.1 orm字段中的verbose_namehtml
目前當註釋用 之後:在model form和form中使用
import functools def wrapper(f): @functools.wraps(f)不加,獲取的實際上是inner的函數名和函數註釋 def inner(*args,**kwargs): return f(*args,**kwargs) return inner ''' 1.執行wrapper 2.從新賦值 index=wrapper(index) ''' @wrapper def index(a1,a2): return a1+a2 print(index.__name__)..................獲取函數名 print(index.__doc__)...................獲取函數內的註釋
什麼是HTTP協議redis
超文本傳輸協議 關於鏈接:一次請求一次響應以後斷開鏈接(無狀態,短鏈接) 關於格式: 請求:請求頭+請求體(http:www.baidu.com/index/?a=123) send('GET /index/?a=123 http1.1\r\nhost:www.baidu.com\r\nuser-agent:Chrome\r\n\r\n') send('POST /index/http1.1\r\nhost:www.baidu.com\r\nuser-agent:Chrome\r\n\r\nusername=alex&pwd=123') 響應:響應頭+響應體 Content-Encoding:gzip\r\nCache-Control:private\r\n\r\n網頁看到的HTML內容 擴展: 常見的請求頭都有哪些? -user-agent:用什麼瀏覽器訪問的網站 -content-type:請求體的數據格式是什麼?(服務端按照格式要求進行解析) 常見的請求方式: -GET -POST 請求頭直接用一個\r\n相連 請求體之間用\r\n\r\n相連
django請求生命週期/瀏覽器上輸入http://www.xxx.com請求到django後發生了什麼?數據庫
路由西永中記得加入終止符$
案例:博客系統django
用戶名和密碼檢測 xxxx.first()#返回對象或者None xxxx.exists()#返回布爾值 模板查找順序 根目錄templates 根據app註冊順序去每一個app的templates中找
基本實現用戶登陸bootstrap
用戶未登陸就不能訪問指定頁面api
基於cookie實現瀏覽器
cookie操做緩存
def login(request): return HttpResponse('...') return render('...') return redirect('...') 設置cookie data = redirect('...') data.set_cookie() 讀取cookie request.COOKIES.get('xx') return data 必須背會如下三個參數: key,value='',max_age=None
from django.shortcuts import render,redirect from app01 import models def login(request): """ 用戶登陸 :param request: :return: """ if request.method == 'GET': return render(request, 'login.html') # 獲取用戶提交的用戶名和密碼 user = request.POST.get('user') pwd = request.POST.get('pwd') # 去數據庫檢查用戶名密碼是否正確 # user_object = models.UserInfo.objects.filter(username=user,password=pwd).first() # user_object = models.UserInfo.objects.filter(username=user, password=pwd).exists() user_object = models.UserInfo.objects.filter(username=user, password=pwd).first() if user_object: # 用戶登陸成功 result = redirect('/index/') result.set_cookie('xxxxxxxx',user) return result # 用戶名或密碼輸入錯誤 return render(request,'login.html',{'error':'用戶名或密碼錯誤'}) def index(request): """ 博客後臺首頁 :param request: :return: """ user = request.COOKIES.get('xxxxxxxx') if not user: return redirect('/login/') return render(request,'index.html',{'user':user})
應用場景:用戶認證,投票,每頁默認顯示數據cookie
保存在用戶瀏覽器端的鍵值對,向服務端發請求時會自動攜帶。 Cookie能夠作登陸以外,還能夠作什麼?
相關代碼:
models
from django.db import models # Create your models here. class UserInfo(models.Model): username = models.CharField(verbose_name='用戶名',max_length=32) password = models.CharField(verbose_name='密碼',max_length=64) class Blog(models.Model): title = models.CharField(verbose_name='標題',max_length=32) content = models.TextField(verbose_name='博客園內容') author = models.ForeignKey(verbose_name='做者',to=UserInfo)
urls
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/$',views.login), url(r'^index/$',views.index) ]
views
from django.shortcuts import render,HttpResponse,redirect from app01 import models # Create your views here. def login(request): if request.method == 'GET': return render(request,'login.html') user = request.POST.get('user') pwd = request.POST.get('pwd') user_object = models.UserInfo.objects.filter(username=user,password=pwd).first() if user_object: request.session['user_name']= user_object.username request.session['user_id'] = user_object.pk return redirect('/index/') return render(request,'login.html',{'error':'用戶名或者密碼確定錯誤'}) def auth(func): def inner(request,*args,**kwargs): name = request.session.get('user_name') if not name: return redirect('/login/') return func(request,*args,**kwargs) return inner @auth def index(request): return render(request,'index.html')
templates
index.html 示例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>歡迎{{ request.session.user_name }}使用博客後臺</h1> </body> </html> </body> </html> login.html 示例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div style="width: 500px;margin: 0 auto;border: 1px solid #dddddd;"> <form class="form-horizontal" method="post"> <div class="form-group"> <label class="col-sm-2 control-label">用戶名</label> <div class="col-sm-10"> <input type="text" class="form-control" placeholder="請輸入用戶名" name="user"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">密碼</label> <div class="col-sm-10"> <input type="password" class="form-control" placeholder="請輸入密碼" name="pwd"> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <button type="submit" class="btn btn-default">提 交</button> <span style="color: red;">{{ error }}</span> </div> </div> </form> </div> </body> </html>
基於session實現(推薦)
依賴cookie 是一種存儲數據的方式,依賴於cookie,實現本質: 用戶向服務端發送請求,服務端作兩件事:生成隨機字符串;爲此用戶開闢一個獨立的空間來存放當前用戶獨有的值。 在空間中如何想要設置值: request.session['x1']=123 request.session['x2']=456 在空間中取值: request.session['x2'] request.session.get('x2') 視圖函數中的業務操做處理完畢,給用戶響應,在響應時會將隨機字符串存儲到用戶瀏覽器的cookie中。
問題:
cookie和session的區別? cookie是存儲在客戶端瀏覽器上的鍵值對,發送請求時瀏 覽器會自動攜帶. session是一種存儲數據方式,基於cookie 實現,將數據存儲在服務端(django默認存儲到數據庫). 其本質是:用戶向服務端發送請求,服務端作兩件事:生成隨機字符 串;爲此用戶開闢一個獨立的空間來存放當前用戶獨有的值. 在空間中如何想要設置值: request.session['x1'] = 123 request.session['x2'] = 456 在空間中取值: request.session['x2'] request.session.get('x2') 視圖函數中的業務操做處理完畢,給用戶響應,在響應時會 將隨機字符串存儲到用戶瀏覽器的cookie中.
擴展
django和session相關的配置
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即: sessionid=隨機字符串 SESSION_COOKIE_DOMAIN = None # api.baidu.com /www.baidu.com/ xxx.baidu.com SESSION_COOKIE_PATH = "/" # Session的cookie 保存的路徑 SESSION_COOKIE_HTTPONLY = True # 是否 Session的cookie只支持http傳輸 SESSION_COOKIE_AGE = 1209600 # Session的 cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過時 SESSION_SAVE_EVERY_REQUEST = False # 是否每 次請求都保存Session,默認修改以後才保存
django中的session如何設置過時時間?
SESSION_COOKIE_AGE = 1209600 # Session的 cookie失效日期(2周)
django的session默認存儲在數據庫,能夠放在其餘地方嗎?
小系統:默認放在數據庫便可. 大系統:緩存(redis) 文件 SESSION_ENGINE = 'django.contrib.sessions.backends.file' SESSION_FILE_PATH = '/sssss/' 緩存(內存)
SESSION_ENGINE= 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS='default' CACHES={ 'default':{ 'BACKEND': 'django.core.cache.backends.locmem.LocMem Cache', 'LOCATION':'unique-snowflake', } }
緩存(redis)
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default' CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "密碼", } } }
操做session
設置(添加&修改) request.session['x1'] = 123 request.session['x2'] = 456 讀取 request.session['xx'] request.session.get('xx') 刪除 del request.session['xx'] request.session.keys() request.session.values() request.session.items() request.session.set_expiry(value) request.session.session_key
應用場景:用戶認證,短信驗證過時,權限管理
強調:
session中的數據是更具用戶相互隔離 #示例 def login(request): 獲取用戶提交的用戶名和密碼 user = request.POST.get('user') request.session['user_name'] = user def index(request): print(request.session['user_name'])
經過js設置cookie
document.cookie = 'k1=wy222;path=/' $.cookie('k1','wy222',{path:'/'}) 注意:path不一樣會致使設置不一樣
path的做用
/,當前網站中全部的URL都能讀取到此值 "",只能在當前頁面訪問的到此數據 /index/,只能在/index/xxx的網頁中查看