python学习笔记_week22
生活随笔
收集整理的這篇文章主要介紹了
python学习笔记_week22
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
python學習筆記_week22
?
note 知識點概要- Session- CSRF- Model操作- Form驗證(ModelForm)- 中間件- 緩存- 信號 內(nèi)容詳細: 1. Session基于Cookie做用戶驗證時:敏感信息不適合放在cookie中 a. Session原理Cookie是保存在用戶瀏覽器端的鍵值對Session是保存在服務器端的鍵值對 b. Cookie和Session對比 c. Session配置(缺少cache) d. 示例:實現(xiàn)兩周自動登陸- request.session.set_expiry(60*10)- SESSION_SAVE_EVERY_REQUEST = TruePS: cookie中不設(shè)置超時時間,則表示關(guān)閉瀏覽器自動清除 - session依賴于cookie- 服務器sessionrequest.session.get()request.session[x] = x request.session.clear() - 配置文件中設(shè)置默認操作(通用配置):SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認)SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認)SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認)SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認)SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認)SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過期(默認)# set_cookie('k',123)SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改之后才保存(默認)- 引擎的配置 2. CSRFa. CSRF原理b. 無CSRF時存在隱患c. Form提交(CSRF)d. Ajax提交(CSRF)CSRF請求頭 X-CSRFToken 6. 中間件 7. 緩存5種配置3種應用:全局 #a. 全站使用視圖函數(shù) #b. 單獨視圖緩存模板 #c、局部視圖使用 8. 信號 http://www.cnblogs.com/wupeiqi/articles/5246483.html- 內(nèi)置信號- 自定義- 定義信號- 觸發(fā)信號- 信號中注冊函數(shù) 3. Model操作 a. 字段類型 + 參數(shù)b. 連表字段 + 參數(shù)c. Metad. SQL操作:- 基本增刪改查- 進階操作- 正反查詢- 其他操作e. 驗證(弱) 4. Form操作 http://www.cnblogs.com/wupeiqi/articles/6144178.html完成:- 驗證用戶請求- 生成HTML(保留上一次提交的數(shù)據(jù)) 自定義:- 類- 字段(校驗)- 插件(生成HTML) 初始化操作: bj = FM(initial=dic) ============= 作業(yè):xxxoo管理 ============= 用戶驗證:session 新URL:Form驗證 中間件:IP過濾 信號:記錄操作 CSRF: a. Form驗證用戶請求b. Form生成HTMLc. Form字段詳細(自定義字段,Model...) + 插件d. 自定義驗證(鉤子以及__all__)e. 注冊示例:用戶名、密碼、郵箱、手機號(RegexValidator或RegexField)、性別、愛好、城市 f. 初始化值 5. ModelForma. Model+Form功能集合b. savec. save + save_m2m View Code session def index(request):# 獲取、設(shè)置、刪除Session中數(shù)據(jù)request.session['k1']request.session.get('k1',None)request.session['k1'] = 123request.session.setdefault('k1',123) # 存在則不設(shè)置del request.session['k1'] request.session.clear()request.session.delete(request.session.session_key)# 所有 鍵、值、鍵值對 request.session.keys()request.session.values()request.session.items()request.session.iterkeys()request.session.itervalues()request.session.iteritems()# 用戶session的隨機字符串 request.session.session_key# 將所有Session失效日期小于當前日期的數(shù)據(jù)刪除 request.session.clear_expired()# 檢查 用戶session的隨機字符串 在數(shù)據(jù)庫中是否request.session.exists("session_key")# 刪除當前用戶的所有Session數(shù)據(jù)request.session.delete("session_key")request.session.set_expiry(value)* 如果value是個整數(shù),session會在些秒數(shù)后失效。* 如果value是個datatime或timedelta,session就會在這個時間后失效。* 如果value是0,用戶關(guān)閉瀏覽器session就會失效。* 如果value是None,session會依賴全局session失效策略SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認)SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認)SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認)SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認)SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認)SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過期(默認)SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改之后才保存(默認) View Code?
?
?
?
mdoels 1 from django.db import models 2 # Create your models here. 3 class UserInf(models.Model): 4 user = models.CharField(max_length=32) View Code views 1 from django.shortcuts import render,redirect,HttpResponse 2 def login(request): 3 # from django.conf import settings 4 # print(settings.CSRF_HEADER_NAME) 5 # HTTP_X_CSRFTOKEN 6 # X-CSRFtoken 7 if request.method == "GET": 8 return render(request,'login.html') 9 elif request.method == "POST": 10 user = request.POST.get('user') 11 pwd = request.POST.get('pwd') 12 if user == 'root' and pwd == "123": 13 # session中設(shè)置值 14 request.session['username'] = user #1.生成隨機字符串 2.寫到用戶瀏覽器cookie 3.保存到session中 4.在隨機字符串對應的字典中設(shè)置相關(guān)內(nèi)容 15 request.session['is_login'] = True 16 if request.POST.get('rmb',None) == '1': 17 # 超時時間 18 request.session.set_expiry(10) 19 return redirect('/index/') 20 else: 21 return render(request,'login.html') 22 from django.views.decorators.csrf import csrf_exempt,csrf_protect 23 @csrf_protect 24 def index(request): 25 # session中獲取值,獲取當前用戶的隨機字符串,根據(jù)隨機字符串獲取對應信息 26 if request.session.get('is_login',None): 27 return render(request,'index.html',{'username': request.session['username']}) 28 else: 29 return HttpResponse('gun') 30 def logout(request): 31 # del request.session['username'] 32 request.session.clear() 33 return redirect('/login/') 34 class Foo: 35 def __init__(self,req,html,dic): 36 self.req = req 37 self.html = html 38 self.dic = dic 39 def render(self): 40 # // 創(chuàng)建鉤子 41 return render(self.req,self.html,self.dic) 42 def test(request,nid): 43 print('小姨媽-->沒帶錢') 44 # return render(request, 'index.html', {...}) 45 return Foo(request, 'index.html', {'k1': 'v1'}) 46 from django.views.decorators.cache import cache_page 47 @cache_page(10) #10秒失效,優(yōu)先級比300秒高 48 def cache(request): 49 import time 50 ctime = time.time() 51 return render(request, 'cache.html', {'ctime': ctime}) 52 def signal(reuqest): 53 from app01 import models 54 obj = models.UserInf(user='root') 55 print('end') 56 obj.save() 57 obj = models.UserInf(user='root') 58 obj.save() 59 obj = models.UserInf(user='root') 60 obj.save() 61 from sg import pizza_done 62 pizza_done.send(sender="asdfasdf",toppings=123, size=456) 63 return HttpResponse('ok') 64 ######################## Form ##################### 65 from django import forms 66 from django.forms import widgets 67 from django.forms import fields 68 class FM(forms.Form): 69 # 字段本身只做驗證 70 user = fields.CharField( 71 error_messages={'required': '用戶名不能為空.'}, 72 widget=widgets.Textarea(attrs={'class': 'c1'}), 73 label="用戶名", 74 ) 75 pwd = fields.CharField( 76 max_length=12, 77 min_length=6, 78 error_messages={'required': '密碼不能為空.', 'min_length': '密碼長度不能小于6', "max_length": '密碼長度不能大于12'}, 79 widget=widgets.PasswordInput(attrs={'class': 'c2'}) 80 ) 81 email = fields.EmailField(error_messages={'required': '郵箱不能為空.','invalid':"郵箱格式錯誤"}) 82 f = fields.FileField() 83 # p = fields.FilePathField(path='app01') 84 city1 = fields.ChoiceField( 85 choices=[(0,'上海'),(1,'廣州'),(2,'東莞')] 86 ) 87 city2 = fields.MultipleChoiceField( 88 choices=[(0,'上海'),(1,'廣州'),(2,'東莞')] 89 ) 90 from app01 import models 91 def fm(request): 92 if request.method == "GET": 93 # 從數(shù)據(jù)庫中吧數(shù)據(jù)獲取到 94 dic = { 95 "user": 'r1', 96 'pwd': '123123', 97 'email': 'sdfsd', 98 'city1': 1, 99 'city2': [1,2] 100 } 101 obj = FM(initial=dic) 102 return render(request,'fm.html',{'obj': obj}) 103 elif request.method == "POST": 104 # 獲取用戶所有數(shù)據(jù) 105 # 每條數(shù)據(jù)請求的驗證 106 # 成功:獲取所有的正確的信息 107 # 失敗:顯示錯誤信息 108 obj = FM(request.POST) 109 r1 = obj.is_valid() 110 if r1: 111 # obj.cleaned_data 112 models.UserInf.objects.create(**obj.cleaned_data) 113 else: 114 # ErrorDict 115 # print(obj.errors.as_json()) 116 # print(obj.errors['user'][0]) 117 return render(request,'fm.html', {'obj': obj}) 118 return render(request,'fm.html') View Code m1 1 from django.utils.deprecation import MiddlewareMixin 2 class Row1(MiddlewareMixin): 3 def process_request(self,request): 4 print('王森') 5 def process_view(self, request, view_func, view_func_args, view_func_kwargs): 6 print('張欣彤') 7 def process_response(self, request, response): 8 print('扛把子') 9 return response 10 from django.shortcuts import HttpResponse 11 class Row2(MiddlewareMixin): 12 def process_request(self,request): 13 print('程毅強') 14 # return HttpResponse('走') 15 def process_view(self, request, view_func, view_func_args, view_func_kwargs): 16 print('張需要') 17 def process_response(self, request, response): 18 print('侯雅凡') 19 return response 20 class Row3(MiddlewareMixin): 21 def process_request(self,request): 22 print('劉東') 23 def process_view(self, request, view_func, view_func_args, view_func_kwargs): 24 print('邵林') 25 def process_response(self, request, response): 26 print('連之淚') 27 return response 28 def process_exception(self, request, exception): 29 if isinstance(exception,ValueError): 30 return HttpResponse('出現(xiàn)異常》。。') 31 def process_template_response(self,request,response): 32 # 如果Views中的函數(shù)返回的對象中,具有render方法 33 print('-----------------------') 34 return response View Code s14day22_init 1 import pymysql 2 pymysql.install_as_MySQLdb() 3 import sg View Code settings 1 import os 2 3 # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 4 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 5 6 7 # Quick-start development settings - unsuitable for production 8 # See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/ 9 10 # SECURITY WARNING: keep the secret key used in production secret! 11 SECRET_KEY = 'm1ueaxz!w8cgj%mx&!ol#14i3fxbco&_!_6eg@k^$_f29%t4&^' 12 13 # SECURITY WARNING: don't run with debug turned on in production! 14 DEBUG = True 15 16 ALLOWED_HOSTS = [] 17 18 19 # Application definition 20 21 INSTALLED_APPS = [ 22 'django.contrib.admin', 23 'django.contrib.auth', 24 'django.contrib.contenttypes', 25 'django.contrib.sessions', 26 'django.contrib.messages', 27 'django.contrib.staticfiles', 28 'app01', 29 ] 30 from django.middleware.csrf import CsrfViewMiddleware 31 from django.middleware.cache import FetchFromCacheMiddleware 32 from django.middleware.cache import UpdateCacheMiddleware 33 MIDDLEWARE = [ 34 # 'django.middleware.cache.UpdateCacheMiddleware', 35 'django.middleware.security.SecurityMiddleware', 36 'django.contrib.sessions.middleware.SessionMiddleware', 37 'django.middleware.common.CommonMiddleware', 38 'django.middleware.csrf.CsrfViewMiddleware', 39 'django.contrib.auth.middleware.AuthenticationMiddleware', 40 'django.contrib.messages.middleware.MessageMiddleware', 41 'django.middleware.clickjacking.XFrameOptionsMiddleware', 42 # 'Middle.m1.Row1', 43 # 'Middle.m1.Row2', 44 # 'Middle.m1.Row3', 45 # 'django.middleware.cache.FetchFromCacheMiddleware', 46 47 ] 48 49 ROOT_URLCONF = 's14day22.urls' 50 51 TEMPLATES = [ 52 { 53 'BACKEND': 'django.template.backends.django.DjangoTemplates', 54 'DIRS': [os.path.join(BASE_DIR, 'templates')] 55 , 56 'APP_DIRS': True, 57 'OPTIONS': { 58 'context_processors': [ 59 'django.template.context_processors.debug', 60 'django.template.context_processors.request', 61 'django.contrib.auth.context_processors.auth', 62 'django.contrib.messages.context_processors.messages', 63 ], 64 }, 65 }, 66 ] 67 68 WSGI_APPLICATION = 's14day22.wsgi.application' 69 70 71 # Database 72 # https://docs.djangoproject.com/en/1.10/ref/settings/#databases 73 74 DATABASES = { 75 'default': { 76 'ENGINE': 'django.db.backends.sqlite3', 77 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 78 } 79 } 80 81 82 # Password validation 83 # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators 84 85 AUTH_PASSWORD_VALIDATORS = [ 86 { 87 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 88 }, 89 { 90 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 91 }, 92 { 93 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 94 }, 95 { 96 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 97 }, 98 ] 99 100 101 # Internationalization 102 # https://docs.djangoproject.com/en/1.10/topics/i18n/ 103 104 LANGUAGE_CODE = 'en-us' 105 106 TIME_ZONE = 'UTC' 107 108 USE_I18N = True 109 110 USE_L10N = True 111 112 USE_TZ = True 113 114 115 # Static files (CSS, JavaScript, Images) 116 # https://docs.djangoproject.com/en/1.10/howto/static-files/ 117 118 STATIC_URL = '/static/' 119 STATICFILES_DIRS = ( 120 os.path.join(BASE_DIR,'static'), 121 ) 122 123 CACHES = { 124 'default': { 125 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 126 'LOCATION': os.path.join(BASE_DIR,'cache') 127 } 128 } View Code urls 1 from django.conf.urls import url 2 from django.contrib import admin 3 from app01 import views 4 urlpatterns = [ 5 url(r'^admin/', admin.site.urls), 6 url(r'^login/$', views.login), 7 url(r'^index/$', views.index), 8 url(r'^logout/$', views.logout), 9 url(r'^test/(?P<nid>\d+)$', views.test), 10 url(r'^cache/$', views.cache), 11 url(r'^signal/$', views.signal), 12 url(r'^fm/$', views.fm), 13 ] View Code cache 1 {% load cache %} 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title></title> 7 </head> 8 <body> 9 <h1>{{ ctime }}</h1> 10 <h1>{{ ctime }}</h1> 11 {% cache 10 c1 %} 12 <h1>{{ ctime }}</h1> {# 只緩存這一個 #} 13 {% endcache %} 14 </body> 15 </html> View Code fm 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <form action="/fm/" method="POST"> 9 {% csrf_token %} 10 <p>{{ obj.user.label }} {{ obj.user }} {{ obj.errors.user.0 }}</p> 11 <p>{{ obj.pwd }} {{ obj.errors.pwd.0 }}</p> 12 <p>{{ obj.email }}{{ obj.errors.email.0 }}</p> 13 <p>{{ obj.f }}{{ obj.errors.f.0 }}</p> 14 {{ obj.city1 }} 15 {{ obj.city2 }} 16 <input type="submit" value="提交" /> 17 </form> 18 </body> 19 </html> View Code index 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <h1>歡迎登錄:{{ username }}, {{ request.session.username }}</h1> 9 <a href="/logout/">注銷</a> 10 </body> 11 </html> View Code login 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <form action="/login/" method="POST"> 9 {% csrf_token %} 10 <input type="text" name="user" /> 11 <input type="text" name="pwd" /> 12 <input type="checkbox" name="rmb" value="1" /> 10秒免登錄 13 <input type="submit" value="提交" /> 14 <input id="btn1" type="button" value="按鈕" /> 15 <input id="btn2" type="button" value="按鈕" /> 16 </form> 17 <script src="/static/jquery-1.12.4.js"></script> 18 <script src="/static/jquery.cookie.js"></script> 19 <script> 20 $(function(){ 21 $.ajaxSetup({ 22 beforeSend: function(xhr,settings){ 23 xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken')); 24 } 25 }); 26 $('#btn1').click(function () { 27 $.ajax({ 28 url: '/login/', 29 type:"GET", 30 data: {'user': 'root', 'pwd': '123'}, 31 // headers: {'X-CSRFtoken': $.cookie('csrftoken')}, 32 success:function(arg){ 33 } 34 }) 35 }); 36 }) 37 </script> 38 </body> 39 </html> View Code sg 1 from django.core.signals import request_finished 2 from django.core.signals import request_started 3 from django.core.signals import got_request_exception 4 5 from django.db.models.signals import class_prepared 6 from django.db.models.signals import pre_init, post_init 7 from django.db.models.signals import pre_save, post_save 8 from django.db.models.signals import pre_delete, post_delete 9 from django.db.models.signals import m2m_changed 10 from django.db.models.signals import pre_migrate, post_migrate 11 12 from django.test.signals import setting_changed 13 from django.test.signals import template_rendered 14 15 from django.db.backends.signals import connection_created 16 def f1(sender, **kwargs): 17 print("xxoo_callback") 18 # print(sender,kwargs) 19 pre_save.connect(f1) 20 import django.dispatch 21 pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"]) 22 def callback(sender, **kwargs): 23 print("callback") 24 print(sender,kwargs) 25 pizza_done.connect(callback) View Code?
posted on 2018-01-18 09:17?我很好u 閱讀(...) 評論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/jyh-py-blog/p/8308527.html
總結(jié)
以上是生活随笔為你收集整理的python学习笔记_week22的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 办公室面积增大,实现wifi覆盖的解决方
- 下一篇: Python学习笔记:个税起征点上调至5