django 一些笔记

drf


TokenAuthentication


首先在INSTALLED_APPS中设置

INSTALLED_APPS = (
...
'rest_framework.authtoken'
)

然后python manage.py migrate生成一个和user一对一关系的token表。

你已经创建了一些user, 你可以对所有已经存在的users生成token如下:

from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token

for user in User.objects.all():
    Token.objects.get_or_create(user=user)

request.user和request.auth在后端的返回
request.user返回一个Django的User instance
request.auth会返回一个rest_framework.authtoken.models.Token的instance
没有验证通过的响应会返回 401 Unauthorized

注意 如果你使用了TokenAuthentication你必须确保你的API只能用https访问

生成Tokens
使用信号signals
如果你想让每个user都有一个自动生成的Token, 你可以简单的捕捉User的post_save信号

from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

on_delete

给on_delete关键字给定以下参数中的一个:
  models.CASCADE:级联删除。当删除'一'时,‘多’会被删除。
  modles.PROTECT: 当删除一个具有外键关系的对象时,会引发一个异常,阻止删除该对象
  models.SET_NULL:设置删除对象所关联的外键字段为null。但字段的null属性必需为True
  models.SET_DEFAULT:设置删除对象所关联的外键字段为默认的值。
  models.SET(value):设置删除对象所关联的对象的外键字段为value,value也可以是一个可调用函数。
  models.DO_NOTHING: 不做任何操作


celery 的问题

celery在win10上不执行任务,加上参数 --pool=solo 即可

django-celery-results

Using the Django ORM/Cache as a result backend

pip install django-celery-results
# settings.py

INSTALLED_APPS = (
    ...,
    'django_celery_results',
)

# celery 配置
CELERY_TIMEZONE = "Asia/Shanghai"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'django-db'
python manage.py migrate django_celery_results
# 启动命令
celery -A mydemo worker -l INFO
# windows下需要加上--pool=solo
django-celery-beat

Database-backed Periodic Tasks with Admin interface.

pip install django-celery-beat
# 启动命令
celery -A mydemo beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler

限流

# settings.py
REST_FRAMEWORK = {
    ...
    # 'DEFAULT_THROTTLE_CLASSES': (
    #     'rest_framework.throttling.AnonRateThrottle',   # 不登录的情况,临时用户
    #     'rest_framework.throttling.UserRateThrottle'     # 登录用户
    # ),
    'DEFAULT_THROTTLE_RATES': {  # 限速的规则
        'anon': '2/minute',
        'user': '5/minute',
        'register': '2/minute'
    },
    ...
}
# xxxview.py
class xxx:
    throttle_classes = [ScopedRateThrottle]
    throttle_scope = 'register'
使用redis来记录

为什么要缓存到redis里,因为在生成环境下我使用了多个uwsgi来跑应用,不使用redis的话,会导致每个uwsgi都有自己的限流记录

pip install django-redis
# settings.py
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/3",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

右下角对话与我联系。


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×