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()

版权声明:
作者:siwei
链接:https://www.techfm.club/p/42718.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>