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

猜你喜欢

转载自blog.csdn.net/baidu_30526767/article/details/84729241