接上篇博客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
版本过高,此时安装低版本即可。笔者使用的是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/
- 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='{}' />
,这样提交请求时这个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;
}
- 在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;
}