Django使用筆記(二)
接上篇部落格Django使用筆記(一)
- 連線Oracle資料庫時,需要用到的驅動叫
cx_oracle
,可以使用pip進行安裝:
pip install cx_oracle
安裝之前需要本機(windows)已安裝Oracle。
安裝完成後,進行配置後,雖然可以正常連線Oracle,但是在執行python manage.py migrate
時可能遇到如下錯誤:
AttributeError: ‘cx_Oracle.Cursor’ object has no attribute ‘numbersAsStrings’
可能的原因是安裝的cx_oracle
pip install cx_oracle==5.3
而在Linux上使用cx_Oracle時,也可能出現如下錯誤:
ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
那麼先在終端執行如下命令:
locate libclntsh.so.11.1
找到libclntsh.so.11.1的位置後,執行如下命令:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/u1/oracle/product/11.2.0/db_1/lib/
- Django預設開啟了CSRF保護,在
settings.py
的MIDDLEWARE_CLASSES
中宣告:
django.middleware.csrf.CsrfViewMiddleware
因此,當發出一個POST請求時,需要在請求頭部新增X-CSRFToken
,其值是瀏覽器的cookie中csrftoken
的值。
客戶端csrftoken
的值可以通過以下方式設定:
- 使用Django自身的模板引擎,在html form表單裡新增
{% csrf_token %}
,Django會在渲染頁面時在表單裡新增<input type='hidden' name='csrfmiddlewaretoken' value='{}' />
- 顯示呼叫
get_token(request)
或rotate_token(request)
,Django會在請求返回時在客戶端設定名為csrftoken
的cookie
使用以下程式碼片段可以在客戶端獲取指定名稱的cookie:
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
- 在Django裡進行單元測試時,測試類繼承
django.test.TestCase
,並且寫在tests.py
中。
Django在進行測試時,會根據settings.py
中資料庫的配置,建立一個測試資料庫和測試使用者,因此,在進行測試之前,需確保資料庫配置裡的使用者具備建立資料庫的許可權,否則測試將無法進行。測試完畢後,Django會銷燬測試資料庫和測試使用者。
測試時可以通過setUp
方法做一些資料準備。 models.DateTimeField
有兩個比較有用的屬性:
auto_now
:當它為True時,每次model被更新的時候,它都會被設定為當前時間並且寫入資料庫中,一般使用在如last_update_date
最後修改時間auto_now_add
:當它為True時,model第一次被建立的時候,該屬性會被賦予當前時間,且後面更新不會被更改,使用在create_date
建立時間
- 由於效能原因,SQL日誌只有在settings.DEBUG=True時才被列印。
- 建立使用者:
python manage.py createsuperuser
修改使用者密碼:
python manage.py changepassword [username]
- 配置Session時,有以下幾個常用配置:
- SESSION_COOKIE_AGE:cookie的有效時間,單位為s,預設1209600(兩週)
- SESSION_COOKIE_NAME:cookie的名稱,預設sessionid
- SESSION_COOKIE_PATH:cookie儲存路徑
- SESSION_EXPIRE_AT_BROWSER_CLOSE:如果為True,使用者關閉瀏覽器時session將失效,預設False
Django預設在資料庫中儲存session資訊,如果需要使用其他方式,可以更改SESSION_ENGINE
等配置,具體可以參考官方文件。
- Django把請求頭的資訊封裝到了
request.META
中。
獲取使用者請求IP的程式碼如下:
if request.META.get("HTTP_X_FORWARDED_FOR"):
ip = request.META.get("HTTP_X_FORWARDED_FOR")
else:
ip = request.META.get("REMOTE_ADDR")
當使用nginx進行請求轉發,並且nginx轉發的配置如下時,才會存在HTTP_X_FORWARDED_FOR
。
location /api {
proxy_pass http://127.0.0.1:8000/api;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}