1. 程式人生 > >Django整理1

Django整理1

多次 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個表
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

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