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",
}
}
}