Django实用小技巧
在会使用django的基本功能之后,有时候我们还需要一些更加细节的用法,这里记录一下。
读取session和设置session过期时间
读取session:request.session.get("key", 0)
;这样可以避免session中没有这个key;如果确定有这个key,也可以用request.session["key"]
直接读取
设置session过期时间:
request.session.set_expiry(7200) # expires 2 hours
将POST中的所有数据读取为JSON
import json
raw_req = request.body.decode('utf-8')
req_json = json.loads(raw_req)
前端发送Ajax请求时带上CSRF token
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (
!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) &&
!this.crossDomain
) {
xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}");
}
},
});
获取请求的客户端IP地址
client_ip = request.META.get('REMOTE_ADDR')
使用中间件
中间件的好处是某些通用的处理逻辑我们不用每个接口写一遍,比如接口访问量统计等等。
首先可以新建一个middleware.py
,新建一个自定义类,其中必须要包括特定的两个函数,用于接收request和返回response:
from v1.dal.api_cnt import incr_api_gen_time
from django.urls import get_resolver, URLPattern
# 获取urls.py中注册的url
resolver = get_resolver(None)
url_patterns = resolver.url_patterns
paths = []
for pattern in url_patterns:
if isinstance(pattern, URLPattern):
path = str(pattern.pattern).strip("/")
paths.append(path)
# path调用次数统计器,仅统计urls.py中注册的path
class APICntMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 自定义逻辑
try:
path = request.path
path = path.strip("/")
if path in paths:
incr_api_gen_time(path)
except:
pass
# 最后返回response
response = self.get_response(request)
return response
从request中获取请求的path
request.path
,可以获取到path,比如请求的URL是:https://example.com/products/?filter=true
,获取到的path就是/products/
判断DB表中的记录是否存在
不存在则新建记录;存在则某个统计字段自增1
from v1.models import ApiCount
from django.db.models import F
def incr_api_gen_time(path: str):
if ApiCount.objects.filter(path=path).exists():
ApiCount.objects.filter(path=path).update(gen_times=F('gen_times')+1)
else:
api = ApiCount(path=path)
api.save()
return
使用cache
from django.core.cache import cache
cache.set(key, count, 60) # expires 60 seconds
val = cache.get(key, 0)
重置admin密码
进入manage.py
所在的目录,运行命令:
python manage.py shell
一步步运行以下命令,进行密码重置
from django.contrib.auth.models import User
user = User.objects.get(username='admin') # 这里的username填写你当初注册时的用户名
user.set_password('{PASSWORD}')
user.save()
共有 0 条评论