日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python Django Session,CSRF,Model操作,Form验证,中间件,缓存,信号

發布時間:2024/3/24 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python Django Session,CSRF,Model操作,Form验证,中间件,缓存,信号 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Django Session,CSRF,Model操作,Form驗證,中間件,緩存,信號

  • Session
  • CSRF
  • Model 操作
  • Form 驗證
  • 中間件
  • 緩存
  • 信號
  • 1,Session

    基于cookie做用戶驗證時:敏感信息不適合放在cookie中

    a,Session 原理

    cookie是保存在在用戶瀏覽器端的鍵值對Session是保存在服務器端的鍵值對原理:1,生成隨機字符串2,寫到用戶瀏覽器cookie3,保存到session中4,在隨機字符串對應的字典中設置相關內容

    b,Cookie 和 Session 對比
    c,Session 配置(缺少cache)
    d,實例:實現兩周自動登錄(下方使用實例)

    -request.session.set_expiry(60*10)-SESSION_SAVE_EVERY_REQUEST = True

    PS:

    cookie 中不設置超時時間,則表示關閉瀏覽器自動清除 session依賴于cookie 服務器 sessionrequest.session.get()request.session[x] =xrequest.session.clear()

    e,數據庫session

    Django默認支持Session,并且默認是將Session數據存儲在數據庫中,即:django_session 表中。

    使用實例:

    緩存+免密登錄 views.py

    from django.shortcuts import render,redirect,HttpResponse # Create your views here.def login(request):if request.method == 'GET':return render(request,'login.html')elif request.method == 'POST':user = request.POST.get('user')pwd = request.POST.get('pwd')if user=='root' and pwd=='123':#session設置值#生成隨機字符串#寫到用戶瀏覽器cookie#保存到session中#在隨機字符串對應的字典中設置相關內容request.session['username'] = userrequest.session['is_login'] = True#設置 10s 免登陸(超時時間)if request.POST.get('rmb',None) == '1':request.session.set_expiry(10)return redirect('/index/')else:return render(request,'login.html') def index(request):#session 中獲取值# if request.session['is_login']:if request.session.get('is_login',None):# return HttpResponse(request.session['username'])return render(request,'index.html',{'username':request.session['username']})else:return HttpResponse('gun')#注銷 def logout(request):request.session.clear()return redirect('/login/')

    免密登錄 login.html

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <form action="/login/" method="post"><input type="text" name="user"><input type="text" name="pwd"><input type="checkbox" name="rmb" value="1">10s免登陸<input type="submit" value="提交"><input type="button" id="btn1" value="按鈕1"><input type="button" id="btn2" value="按鈕2"> </form> <script src="/static/jquery-3.4.1.js"></script> <script src="/static/jquery-cookie.js"></script> <script>$(function () {$.ajaxSetup({beforeSend:function (xhr,settings) {xhr:setRequestHeader('X-CSRFtoken',$.cookie('csrftoken'));}});$('#btn1').click(function () {$.ajax({url:'/login/',type:'POST',data:{'user':'root','pwd':'123'},{#header:{'X-CSRFtoken':$.cookie('csrftoken')},#}success:function (arg) {}})});}) </script> </body> </html>

    數據庫session

    a. 配置 settings.py

    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 # 是否關閉瀏覽器使得Session過期(默認) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改之后才保存(默認)

    b. 使用

    def index(request):# 獲取、設置、刪除Session中數據request.session['k1']request.session.get('k1',None)request.session['k1'] = 123request.session.setdefault('k1',123) # 存在則不設置del request.session['k1']# 所有 鍵、值、鍵值對request.session.keys()request.session.values()request.session.items()request.session.iterkeys()request.session.itervalues()request.session.iteritems()# 用戶session的隨機字符串request.session.session_key# 將所有Session失效日期小于當前日期的數據刪除request.session.clear_expired()# 檢查 用戶session的隨機字符串 在數據庫中是否request.session.exists("session_key")# 刪除當前用戶的所有Session數據request.session.delete("session_key")request.session.set_expiry(value)* 如果value是個整數,session會在些秒數后失效。* 如果value是個datatime或timedelta,session就會在這個時間后失效。* 如果value是0,用戶關閉瀏覽器session就會失效。* 如果value是None,session會依賴全局session失效策略。

    緩存session

    配置和使用同上

    文件session

    a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/TSESSION_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 # 是否關閉瀏覽器使得Session過期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改之后才保存

    b. 使用

    同上

    緩存+數據庫session

    數據庫用于做持久化,緩存用于提高效率

    a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎

    b. 使用

    同上

    加密session

    a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎

    b. 使用

    同上

    2,CSRF

    django為用戶實現防止跨站請求偽造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。 而對于django中設置防跨站請求偽造功能有分為全局和局部。

    a,CSRF 原理

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title></title> </head> <body><form action="/fm/" method="POST">{% csrf_token %} --------CSRF 網站身份識別頭<p>{{ obj.user.label }} {{ obj.user }} {{ obj.errors.user.0 }}</p><p>{{ obj.pwd }} {{ obj.errors.pwd.0 }}</p><p>{{ obj.email }}{{ obj.errors.email.0 }}</p><p>{{ obj.f }}{{ obj.errors.f.0 }}</p>{{ obj.city1 }}{{ obj.city2 }}<input type="submit" value="提交" /></form> </body> </html>

    b,無CSRF時存在隱患

    c,Form 提交

    d,Ajax提交(CSRF)

    CSRF 請求頭 X-CSRFToken

    關于CSRF (靈活設置 CSRF)

    django為用戶實現防止跨站請求偽造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。 而對于django中設置防跨站請求偽造功能有分為全局和局部。全局:中間件 django.middleware.csrf.CsrfViewMiddleware局部: @csrf_protect,為當前函數強制設置防跨站請求偽造功能,即便settings中沒有設置全局中間件。 @csrf_exempt,取消當前函數防跨站請求偽造功能,即便settings中設置了全局中間件。 注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

    3,Model 操作

    a. 字段類型 + 參數b. 連表字段 + 參數c. Metad. SQL操作:- 基本增刪改查- 進階操作- 正反查詢- 其他操作e. 驗證(弱)

    Django 的 Model 操作

    4,Form 驗證(Model Form)

    完成:驗證用戶請求生成HTML(保留上一次數據)自定義:類字段(校驗)插件(生成HTML)初始化操作:

    實例:

    views.py

    ######################## Form ##################### from django import forms from django.forms import widgets from django.forms import fields class FM(forms.Form):# 字段本身只做驗證user = fields.CharField(error_messages={'required': '用戶名不能為空.'},widget=widgets.Textarea(attrs={'class': 'c1'}),label="用戶名",)pwd = fields.CharField(max_length=12,min_length=6,error_messages={'required': '密碼不能為空.', 'min_length': '密碼長度不能小于6', "max_length": '密碼長度不能大于12'},widget=widgets.PasswordInput(attrs={'class': 'c2'}))email = fields.EmailField(error_messages={'required': '郵箱不能為空.','invalid':"郵箱格式錯誤"})f = fields.FileField()# p = fields.FilePathField(path='app01')city1 = fields.ChoiceField(choices=[(0,'上海'),(1,'廣州'),(2,'東莞')])city2 = fields.MultipleChoiceField(choices=[(0,'上海'),(1,'廣州'),(2,'東莞')])from app01 import models def fm(request):if request.method == "GET":# 從數據庫中吧數據獲取到dic = {"user": 'r1','pwd': '123123','email': 'sdfsd','city1': 1,'city2': [1,2]}obj = FM(initial=dic)return render(request,'fm.html',{'obj': obj})elif request.method == "POST":# 獲取用戶所有數據# 每條數據請求的驗證# 成功:獲取所有的正確的信息# 失敗:顯示錯誤信息obj = FM(request.POST)r1 = obj.is_valid()if r1:# obj.cleaned_datamodels.UserInf.objects.create(**obj.cleaned_data)else:# ErrorDict# print(obj.errors.as_json())# print(obj.errors['user'][0])return render(request,'fm.html', {'obj': obj})return render(request,'fm.html')

    fm.html

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title></title> </head> <body><form action="/fm/" method="POST">{% csrf_token %}<p>{{ obj.user.label }} {{ obj.user }} {{ obj.errors.user.0 }}</p><p>{{ obj.pwd }} {{ obj.errors.pwd.0 }}</p><p>{{ obj.email }}{{ obj.errors.email.0 }}</p><p>{{ obj.f }}{{ obj.errors.f.0 }}</p>{{ obj.city1 }}{{ obj.city2 }}<input type="submit" value="提交" /></form> </body> </html>

    參考網頁

    5,中間件

    django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束后, django會根據自己的規則在合適的時機執行中間件中相應的方法。在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每一個元素就是一個中間件, 適合對所有請求 統一操作某些事件

    -settings.py

    from django.middleware.csrf import CsrfViewMiddlewareMIDDLEWARE = ['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','Middle.m1.Row1','Middle.m2.Row2','Middle.m3.Row3',]

    views.py

    from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponseclass Row1(MiddlewareMixin):def process_request(self,request):print('bao1')def process_view(self,request,view_func,view_func_args,view_func_kwargs):print("bao7")def process_response(self,request,response):print('bao6')return responseclass Row2(MiddlewareMixin):def process_request(self,request):print('bao2')def process_view(self,request,view_func,view_func_args,view_func_kwargs):print("bao8")def process_response(self,request,response):print('baoba5')return responseclass Row3(MiddlewareMixin):def process_request(self,request):print('bao3')def process_view(self,request,view_func,view_func_args,view_func_kwargs):print("bao9")def process_response(self,request,response):print('baobao4')return responsedef process_exception(self,request,exception):if isinstance(exception,ValueError):return HttpResponse("出現異常")def process_template_response(self,request,response):#如果 view中的函數返回的對象中具有,render方法,就會觸發這個函數print("-------------")return response 與mange.py在同一目錄下的文件夾 wupeiqi/middleware下的auth.py文件中的Authentication類 中間件中可以定義四個方法,分別是: process_request(self,request) process_view(self, request, callback, callback_args, callback_kwargs) process_template_response(self,request,response) process_exception(self, request, exception) process_response(self, request, response)

    參考網頁

    6,緩存

    由于Django是動態網站,所有每次請求均會去數據進行相應的操作,當程序訪問量大時,耗時必然會更加明顯, 最簡單解決方式是使用:緩存,緩存將一個某個views的返回值保存至內存或者memcache中, 5分鐘內再有人來訪問時,則不再去執行view中的操作,而是直接從內存或者Redis中之前緩存的內容拿到,并返回。

    Django中提供了6種緩存方式:

    開發調試

    # 此為開始調試用,實際內部不做任何操作# 配置:CACHES = {'default': {'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎'TIMEOUT': 300, # 緩存超時時間(默認300,None表示永不過期,0表示立即過期)'OPTIONS':{'MAX_ENTRIES': 300, # 最大緩存個數(默認300)'CULL_FREQUENCY': 3, # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)},'KEY_PREFIX': '', # 緩存key的前綴(默認空)'VERSION': 1, # 緩存key的版本(默認1)'KEY_FUNCTION' 函數名 # 生成key的函數(默認函數會生成為:【前綴:版本:key】)}}# 自定義keydef default_key_func(key, key_prefix, version):"""Default function to generate keys.Constructs the key used by all other methods. By default it prependsthe `key_prefix'. KEY_FUNCTION can be used to specify an alternatefunction with custom key making behavior."""return '%s:%s:%s' % (key_prefix, version, key)def get_key_func(key_func):"""Function to decide which key function to use.Defaults to ``default_key_func``."""if key_func is not None:if callable(key_func):return key_funcelse:return import_string(key_func)return default_key_func

    內存

    # 此緩存將內容保存至內存的變量中# 配置:CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache','LOCATION': 'unique-snowflake',}}# 注:其他配置同開發調試版本

    文件

    # 此緩存將內容保存至文件# 配置:CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache','LOCATION': '/var/tmp/django_cache',}}# 注:其他配置同開發調試版本

    數據庫

    # 此緩存將內容保存至數據庫# 配置:CACHES = {'default': {'BACKEND': 'django.core.cache.backends.db.DatabaseCache','LOCATION': 'my_cache_table', # 數據庫表}}# 注:執行創建表命令 python manage.py createcachetable

    Memcache緩存(python-memcached模塊)

    #此緩存使用python-memcached模塊連接memcacheCACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache','LOCATION': '127.0.0.1:11211',}}CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache','LOCATION': 'unix:/tmp/memcached.sock',}} CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache','LOCATION': ['172.19.26.240:11211','172.19.26.242:11211',]}}

    Memcache緩存(pylibmc模塊)

    #此緩存使用pylibmc模塊連接memcacheCACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache','LOCATION': '127.0.0.1:11211',}}CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache','LOCATION': '/tmp/memcached.sock',}} CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache','LOCATION': ['172.19.26.240:11211','172.19.26.242:11211',]}}

    Redis 緩存 (依賴:pip3 install django-redis)

    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": "密碼",}} }按 Ctrl+C 復制代碼from django_redis import get_redis_connection conn = get_redis_connection("default")

    5 種配置

    某一塊 細節配置

    views.py

    from django.views.decorators.cache import cache_page@cache_page(10)def cache(request):import timectime = time.time()return render(request,'cache.html',{'ctime':ctime})

    cache.html

    {% load cache %} <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>cache</title> </head> <body> <h1>{{ ctime }}</h1> <h1>{{ ctime }}</h1>{% cache 10 c1 %} <h1>{{ ctime }}</h1> {% endcache %}</body> </html>

    全網站配置

    from django.middleware.csrf import CsrfViewMiddleware #全網站 緩存配置 from django.middleware.cache import FetchFromCacheMiddleware from django.middleware.cache import UpdateCacheMiddlewareMIDDLEWARE = ['django.middleware.cache.UpdateCacheMiddleware','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','Middle.m1.Row1','Middle.m2.Row2','Middle.m3.Row3','django.middleware.cache import FetchFromCacheMiddleware', ]

    3 種應用

    全局 視圖函數 模板

    7,信號

    Django中提供了“信號調度”,用于在框架執行操作時解耦。 通俗來講,就是一些動作發生的時候,信號允許特定的發送者去提醒一些接受者。

    Django內置信號

    Model signalspre_init # django的modal執行其構造方法前,自動觸發post_init # django的modal執行其構造方法后,自動觸發pre_save # django的modal對象保存前,自動觸發post_save # django的modal對象保存后,自動觸發pre_delete # django的modal對象刪除前,自動觸發post_delete # django的modal對象刪除后,自動觸發m2m_changed # django的modal中使用m2m字段操作第三張表(add,remove,clear)前后,自動觸發class_prepared # 程序啟動時,檢測已注冊的app中modal類,對于每一個類,自動觸發 Management signalspre_migrate # 執行migrate命令前,自動觸發post_migrate # 執行migrate命令后,自動觸發 Request/response signalsrequest_started # 請求到來前,自動觸發request_finished # 請求結束后,自動觸發got_request_exception # 請求異常后,自動觸發 Test signalssetting_changed # 使用test測試修改配置文件時,自動觸發template_rendered # 使用test測試渲染模板時,自動觸發 Database Wrappersconnection_created # 創建數據庫連接時,自動觸發

    對于Django內置的信號,僅需注冊指定信號,當程序執行相應操作時,自動觸發注冊函數:

    from django.core.signals import request_finished from django.core.signals import request_started from django.core.signals import got_request_exceptionfrom django.db.models.signals import class_prepared from django.db.models.signals import pre_init, post_init from django.db.models.signals import pre_save, post_save from django.db.models.signals import pre_delete, post_delete from django.db.models.signals import m2m_changed from django.db.models.signals import pre_migrate, post_migratefrom django.test.signals import setting_changed from django.test.signals import template_renderedfrom django.db.backends.signals import connection_createddef callback(sender, **kwargs):print("xxoo_callback")print(sender,kwargs)xxoo.connect(callback) # xxoo指上述導入的內容 from django.core.signals import request_finished from django.dispatch import receiver@receiver(request_finished) def my_callback(sender, **kwargs):print("Request finished!")

    自定義信號

    定義信號import django.dispatchpizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])注冊信號def callback(sender, **kwargs):print("callback")print(sender,kwargs)pizza_done.connect(callback) 觸發信號from 路徑 import pizza_donepizza_done.send(sender='seven',toppings=123, size=456)

    實例:

    views.py

    from django.core.signals import request_finished from django.core.signals import request_started from django.core.signals import got_request_exceptionfrom django.db.models.signals import class_prepared from django.db.models.signals import pre_init, post_init from django.db.models.signals import pre_save, post_save from django.db.models.signals import pre_delete, post_delete from django.db.models.signals import m2m_changed from django.db.models.signals import pre_migrate, post_migratefrom django.test.signals import setting_changed from django.test.signals import template_renderedfrom django.db.backends.signals import connection_createddef f1(sender, **kwargs):print("xxoo_callback")# print(sender,kwargs)pre_save.connect(f1)import django.dispatch pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])def callback(sender, **kwargs):print("callback")print(sender,kwargs)pizza_done.connect(callback)

    總結

    以上是生活随笔為你收集整理的python Django Session,CSRF,Model操作,Form验证,中间件,缓存,信号的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。