1. 程式人生 > >Django使用筆記(二)

Django使用筆記(二)

接上篇部落格Django使用筆記(一)

  1. 連線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

版本過高,此時安裝低版本即可。筆者使用的是5.3:

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/

  1. Django預設開啟了CSRF保護,在settings.pyMIDDLEWARE_CLASSES中宣告:

django.middleware.csrf.CsrfViewMiddleware

因此,當發出一個POST請求時,需要在請求頭部新增X-CSRFToken,其值是瀏覽器的cookie中csrftoken的值。
客戶端csrftoken的值可以通過以下方式設定:

  • 使用Django自身的模板引擎,在html form表單裡新增{% csrf_token %},Django會在渲染頁面時在表單裡新增<input type='hidden' name='csrfmiddlewaretoken' value='{}' />
    ,這樣提交請求時這個token就會被傳到後臺
  • 顯示呼叫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;
   }
  1. 在Django裡進行單元測試時,測試類繼承django.test.TestCase,並且寫在tests.py中。
    Django在進行測試時,會根據settings.py中資料庫的配置,建立一個測試資料庫和測試使用者,因此,在進行測試之前,需確保資料庫配置裡的使用者具備建立資料庫的許可權,否則測試將無法進行。測試完畢後,Django會銷燬測試資料庫和測試使用者。
    測試時可以通過setUp方法做一些資料準備。
  2. models.DateTimeField有兩個比較有用的屬性:
  • auto_now:當它為True時,每次model被更新的時候,它都會被設定為當前時間並且寫入資料庫中,一般使用在如last_update_date最後修改時間
  • auto_now_add:當它為True時,model第一次被建立的時候,該屬性會被賦予當前時間,且後面更新不會被更改,使用在create_date建立時間
  1. 由於效能原因,SQL日誌只有在settings.DEBUG=True時才被列印。
  2. 建立使用者:
python manage.py createsuperuser

修改使用者密碼:

python manage.py changepassword [username]
  1. 配置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等配置,具體可以參考官方文件。

  1. 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;
}