Django整理1
阿新 • • 發佈:2017-07-03
多次 min session失效 禁用 取數 mem 多重 gis chan
基本結構
│ db.sqlite3 ----------sqlie3數據庫 │ manage.py │ ├─logres │ │ admin.py 後臺,可以用很少量的代碼就擁有一個強大的後臺。 │ │ apps.py │ │ models.py 與數據庫操作相關,存入或讀取數據時用到這個 │ │ tests.py │ │ urls.py │ │ views.py │ │ 處理用戶發出的請求,從urls.py中對應過來, 通過渲染templates中的網頁可以將顯示 │ │ 內容比如登陸後的用戶名,用戶請求的數據,輸出到網頁。 │ │__init__.py │ │ │ ├─migrations │ │ 0001_initial.py │ │ __init__.py │ │ │ │ ├─Mushishi │ │ settings.py Django 的設置,配置文件,比如 DEBUG 的開關,靜態文件的位置等 │ │ urls.py urls.py │ │ 網址入口,關聯到對應的views.py中的一個函數(或者generic類), │ │ 訪問網址就對應一個函數。 │ │ wsgi.py wsgi有多重一種uwsgi和wsgi,你用那種wsgi來運行Django, 一般不用改只有你用到的時候在改 │ │__init__.py │ │ ├─static └─templates templates中的Html模板, index.html login.html regist.html
基本命令
1.創建django命令 django-admin.py startproject project-name(你工程的名字) 2.創建django的app python manage.py startapp app-name(你app的名字) 或 django-admin.py startapp app-name(你app的名字)3.同步數據庫 python manage.py syncdb 註意:Django 1.7.1及以上的版本需要用以下命令 python manage.py makemigrations python manage.py migrate 4.調試模式 python manage.py runserver 8001 #監聽所有可用 ip (電腦可能有一個或多個內網ip,一個或多個外網ip,即有多個ip地址) python manage.py runserver 0.0.0.0:8000 5.清除數據庫 python manage.py flush 6.創建超級管理員 python manage.py createsuperuser 按照提示就ok 7.修改管理員密碼 python manage.py changepassword username(你當時設定的用戶名) 8.導入和導出數據 python manage.py dumpdata appname > appname.json python manage.py loaddata appname.json 9.進入數據庫 python manage.py dbshell 10.更多命令 python manage.py
CSRF
a. 基本應用 form表單中添加 {% csrf_token %} b. 全站禁用 # ‘django.middleware.csrf.CsrfViewMiddleware‘, c. 局部禁用 ‘django.middleware.csrf.CsrfViewMiddleware‘,
from django.views.decorators.csrf import csrf_exempt @csrf_exempt def csrf1(request): if request.method == ‘GET‘: return render(request,‘csrf1.html‘) else: return HttpResponse(‘ok‘)View Code
d. 局部使用
# ‘django.middleware.csrf.CsrfViewMiddleware‘,
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_protect def csrf1(request): if request.method == ‘GET‘: return render(request,‘csrf1.html‘) else: return HttpResponse(‘ok‘)
c. 特殊CBV
from django.views import View from django.utils.decorators import method_decorator @method_decorator(csrf_protect,name=‘dispatch‘) class Foo(View): def get(self,request): pass def post(self,request): pass
PS:CBV中添加裝飾器
def wrapper(func): def inner(*args,**kwargs): return func(*args,**kwargs) return inner # 1. 指定方法上添加裝飾器 # class Foo(View): # # @method_decorator(wrapper) # def get(self,request): # pass # # def post(self,request): # pass # 2. 在類上添加 # @method_decorator(wrapper,name=‘dispatch‘) # class Foo(View): # # def get(self,request): # pass # # def post(self,request): # pass
Ajax提交數據時候,攜帶CSRF:
<form method="POST" action="/csrf1.html"> {% csrf_token %} <input id="user" type="text" name="user" /> <input type="submit" value="提交"/> <a onclick="submitForm();">Ajax提交</a> </form> <script src="/static/jquery-1.12.4.js"></script> <script> function submitForm(){ var csrf = $(‘input[name="csrfmiddlewaretoken"]‘).val(); var user = $(‘#user‘).val(); $.ajax({ url: ‘/csrf1.html‘, type: ‘POST‘, data: { "user":user,‘csrfmiddlewaretoken‘: csrf}, success:function(arg){ console.log(arg); } }) } </script>放置在data中攜帶
<form method="POST" action="/csrf1.html"> {% csrf_token %} <input id="user" type="text" name="user" /> <input type="submit" value="提交"/> <a onclick="submitForm();">Ajax提交</a> </form> <script src="/static/jquery-1.12.4.js"></script> <script src="/static/jquery.cookie.js"></script> <script> function submitForm(){ var token = $.cookie(‘csrftoken‘); var user = $(‘#user‘).val(); $.ajax({ url: ‘/csrf1.html‘, type: ‘POST‘, headers:{‘X-CSRFToken‘: token}, data: { "user":user}, success:function(arg){ console.log(arg); } }) } </script>放在請求頭中
select_related:主動連表
models.UserInfo.objects.all().select_related("ut") 在查詢userinfo時直接將外鍵ut關聯的表進行inner join連接,這樣在for循環的時候就不會再次查詢ut那個表 models.UserInfo.objects.all().select_related("ut","gt") inner join 2個表
prefetch_related :不做連表,做多次查詢
models.UserInfo.objects.all().prefetch_related("ut") ··· select * from userinfo Django內部:將外鍵的ID 全部拿到 去重 比如說是[1,2] select * from usertype where id in [1,2] django會把2個select結果集整合。 ···
模版語言
{{ item }} {% for item in item_list %} <a>{{ item.0 }}</a> <a>{{ item.id }}</a> {% endfor %} {% if ordered_warranty %} {% else %} {% endif %} 母板:{% block title %}{% endblock %} 子板:{% extends "base.html" %} {% block title %}{% endblock %} 組件:include {% include "組件.html" %} pub.html <div> <h3>特別漂亮的組件</h3> <div class="title">標題:{{ name }}</div> <div class="content">內容:{{ name }}</div> </div> test.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> {% include ‘pub.html‘ %} {% include ‘pub.html‘ %} {% include ‘pub.html‘ %} </body> </html> 幫助方法: {{ item.event_start|date:"Y-m-d H:i:s"}} {{ bio|truncatewords:"30" }} {{ my_list|first|upper }} {{ name|lower }} PS: ajax先服務器提交信息並等待接受 $.ajax({ url: "/submit/", #向哪個url提交數據 type: "POST", #以某種方式發送POST或者GET data: da, #數據,如果數據中有列表或其他非字符串類型,jquery會對鍵值做一些處理,可以在後面添加一個屬性,traditional:true {"list":[1,2,3]} 發送到後臺就會變成{"list[]":[1,2,3]} {"list":[1,2,3]},traditional:true 發送到後臺:{"list":[1,2,3]} success: function (data) { #data是從服務器返回的數據 if (data == "false") { $("#msg").text("不能為空!!!"); } else { location.href = data; } } }) 服務端發送回來的只能是字符串,render返回的也是字符串,不會實現跳轉。這裏值得一提的是可以用json來傳送字典。 服務器端: import json dict={"title":1,"id":2} return HttpResponse(json.dumps(dict)) 瀏覽器ajax success接收: Json.parse(data) 將json字符串data轉化成dict Json.stringify(dict) 將dict轉化成字符串
COOKIE和SESSION
COOKIE 向服務器發送存在請求頭裏。服務器發送到瀏覽器存在響應頭裏。
a、保存在瀏覽器端的"鍵值對",服務端可以向瀏覽器端寫cookie b、瀏覽器每次發送請求時,會攜帶cookie 應用: a、投票 b、用戶登錄 登錄時,如果用戶名和密碼正確,可以寫 obj=render(request,"index.html") obj.set_cookie("鍵","值",max_age=10,path="/") #max_age超時時間,瀏覽器保存的cookie有效時間。 10秒 #或者expires 他跟的參數是2017年6月21日 11:50:58 #path 指定某個url可以使用當前的cookie path="/index/" /表示所有url都可以用 return obj obj=set_signed_cookie("鍵","值",salt="加鹽操作") 接收端接收cookie cook=request.COOKIES.get("上面中的鍵") cook=request.get_signed_cookie("鍵",salt="加鹽")
SESSION
a、保存在服務器端的數據(本質是鍵值對) b、依賴cookie c、保持會話(web網站) 好處:敏感信息不會直接給客戶端
1、數據庫中 django默認存放在數據庫中 Django默認支持Session,並且默認是將Session數據存儲在數據庫中,即:django_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,默認修改之後才保存(默認) 2、緩存中 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘ # 引擎 SESSION_CACHE_ALIAS = ‘default‘ # 使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置 其他同上 3、文件中 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘ # 引擎 SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() 其他同上 4、加密的cookie中 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.signed_cookies‘ # 引擎 5、緩存+數據庫 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db‘ # 引擎View Code
# 獲取、設置、刪除Session中數據 request.session[‘k1‘] #不存在會報錯 request.session.get(‘k1‘,None) request.session[‘k1‘] = 123 request.session.setdefault(‘k1‘,123) # 存在則不設置 del request.session[‘k1‘] request.session.delete(request.session.session_key) #刪除session request.session.clear() #刪除cookie # 所有 鍵、值、鍵值對 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增刪改查
Django整理1