前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >day96-day98-media配置&token时效&models字段auto_XX

day96-day98-media配置&token时效&models字段auto_XX

原创
作者头像
少年包青菜
修改于 2020-03-24 02:07:33
修改于 2020-03-24 02:07:33
59500
代码可运行
举报
文章被收录于专栏:Python 学习Python 学习
运行总次数:0
代码可运行

1.涉及到图片上传的 media 设置,项目中一般仅配置一次

1.1models里面的类表有图片上传的字段

1.2settings里面的配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# media配置
MEDIA_URL = "media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")

1.3项目urls.py里面的配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.conf.urls import url, include
from django.contrib import admin
# 复制
from LuffyProject import settings
from django.views.static import serve

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/course/', include('course.urls')),
    url(r'^', include('login.urls')),
    url(r'^', include('pay.urls')),
    # 复制
    url(r'media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT})
]

1.4项目启动后,会在项目目录下生成一个 media 的文件夹,里面存放的是上传的图片

1.5序列化器里面返回图片字段给前端

2.注册与登录

2.1序列化器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework import serializers
from course import models
import hashlib


# 注册&登录序列化器
class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Account
        fields = ['username', 'pwd']

    def create(self, validated_data):
        username = validated_data['username']
        pwd = validated_data['pwd']

        user_obj = models.Account.objects.create(
            username=username,
            # 这是模拟前端传递密文密码
            pwd=hashlib.md5(pwd.encode()).hexdigest()
        )

        return user_obj

2.2注册与登录视图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Create your views here.
import uuid

from rest_framework.response import Response
from rest_framework.views import APIView

from course import models
from . import serializers
from utlils import my_response


# 注册视图
class RegisterView(APIView):
    @staticmethod
    def post(request):
        try:
            ser_obj = serializers.AccountSerializer(data=request.data)
            if ser_obj.is_valid():
                ser_obj.save()
                return Response('注册成功!-->{}'.format(ser_obj.data))
        except Exception as error:
            error = error
            return Response('注册异常!')
        return Response('注册失败!')


# 登录视图
class LoginView(APIView):
    @staticmethod
    def post(request):
        login_obj = my_response.LoginResponse()
        username = request.data.get('username', '')
        pwd = request.data.get('pwd', '')
        if not username or not pwd:
            login_obj.code = 1010
            login_obj.error = '用户名或密码不能为空'
        else:
            try:
                user_obj = models.Account.objects.filter(
                    username=username,
                    pwd=pwd
                ).first()
                if not user_obj:
                    login_obj.code = 1020
                    login_obj.error = '用户名或密码错误'
                else:
                    user_obj.token = uuid.uuid4()
                    user_obj.save()
                    login_obj.msg = '登录成功'
                    # 登录之后返回 token
                    login_obj.token = user_obj.token
            except Exception as e:
                e = e
        # 对象调用__dict__,返回对象属性键值对
        return Response(login_obj.__dict__)

2.3my_response.py,作为使用,可以实现返回信息解耦

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class LoginResponse:
    def __init__(self):
        self.code = 1000
        self.error = ''
        self.msg = ''

3.关于认证类校验token是否过期

3.1首先 models 里的字段一定存在 models.DateTimeField(auto_now=True)

3.2关于 auth_now 和 auth_now_add 的区别,day67也有讲述

3.2.1 auto_now=True

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.db import models
class Book(models.Model):
    title = models.Charfield(max_length=32)
    date = models.Datefield(auto_now = True)

那么在更新数据是两种方法对auto_now的影响:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 1.update方法:
models.Book.objects.filter(title='asd').update(title='ads')
# .update() 方法不会改变date的时间,还是保存着创建时的时间点


# 2.save()方法:
obj = models.Book.objects.filter(title='asd').first()
obj.title='ads'
obj.save()
# .save() 方法是保存了更改时的时间点

3.2.2 auto_now_add=True:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.db import models
class Book(models.Model):
    title = models.Charfield(max_length=32)
    date = models.Datefield(auto_now_add = True)

此时,update方法和.save()方法对时间都是无效的。

那么我们如何手动的更改时间呢?

方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
models.Book.objects.filter(title='asd').update(date=datetime.datetime.now())

3.3认证类代码如下

1.1 token = request.META.get('HTTP_AUTHENTICATE','')

1.2 now() 函数返回当前时区的时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from course import models
from django.utils.timezone import now


# 认证类
class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):
        """从消息头获得 token"""
        token = request.META.get('HTTP_AUTHENTICATE', '')
        print(request.META)
        if not token:
            raise AuthenticationFailed('token不能为空')
        user_obj = models.Account.objects.filter(token=token).first()
        if not user_obj:
            raise AuthenticationFailed('token不合法')
        
        """获取上一次登录的时间"""
        old_time = user_obj.create_token_time
        """now()将返回本地时区的时间"""
        now_time = now()
        """判断 token 是否过期"""
        if (now_time - old_time).seconds > 20:
            raise AuthenticationFailed('token已经过期,请重新登录')

        return user_obj, token

3.4关于从消息头获取 token

3.5token过期时间的判断,时、分、秒,注意 from django.utils.timezone import now

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from course import models
from django.utils.timezone import now


# 认证类
class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):
        if request.method == 'OPTIONS':
            return None
        """从消息头获得 token"""
        token = request.META.get('HTTP_AUTHENTICATE', '')

        # print('request.META-->', request.META)

        if not token:
            raise AuthenticationFailed('token不能为空')
        user_obj = models.Account.objects.filter(token=token).first()
        if not user_obj:
            raise AuthenticationFailed('token不合法')

        """获取上一次登录的时间"""
        old_time = user_obj.create_token_time
        """now()将返回本地时区的时间"""
        now_time = now()
        """判断 token 是否过期"""
        if (now_time - old_time).seconds > 100000:
            raise AuthenticationFailed('token已经过期,请重新登录')

        return user_obj, token

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何让 Python 写的 API 接口同时支持 Session 和 Token 认证?
Django 是 Python 语言中最受欢迎的 Web 框架之一。其开箱即用的特性,使得我们可以利用它快速搭建一个传统的 Web 应用。
州的先生
2021/06/21
2.8K0
如何让 Python 写的 API 接口同时支持 Session 和 Token 认证?
day94-认证组件&权限组件&访问评率限制
1.1.3 返回值返回两个参数,request.user 和 request.auth,即 user_obj 和 token
少年包青菜
2020/03/08
4840
Django rest framework源码分析(1)----认证
一、基础 1.1.安装 两种方式: github pip直接安装 pip install django-rest-framework 1.2.需要先了解的一些知识 理解下面两个知识点非常重要,django-rest-framework源码中到处都是基于CBV和面向对象的封装 (1)面向对象封装的两大特性 把同一类方法封装到类中 将数据封装到对象中 (2)CBV 基于反射实现根据请求方式不同,执行不同的方法 原理:url-->view方法-->dispatch方法(反射执行其它方法:GET/POST/P
zhang_derek
2018/04/11
2.2K0
Django rest framework源码分析(1)----认证
DjangoRestFramework,认证组件、权限组件、频率组件、url注册器、响应器、分页组件
    我们知道,我们不管路由怎么写的,对应的视图类怎么写的,都会走到dispatch方法,进行分发,
changxin7
2019/12/20
6440
DjangoRestFramework,认证组件、权限组件、频率组件、url注册器、响应器、分页组件
认证组件
 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查询,没有登录就不能查看 ,这时候就要用到认证组件
py3study
2020/01/20
6920
Python进阶43-drf框架(五)
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
3.3K0
Python进阶43-drf框架(五)
实战-DRF快速写接口(认证权限频率)
实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postman 需求 注册接口,包含字段用户名,密码,确认密码,用户类型 登陆接口,校验用户名,密码,生成随机字符串 认证功能,除了注册登陆接口外,所有接口都要登陆后访问 频率限制功能,每分钟访问5次,book的所有接口,使用这个频率类 权限限制功能,publish的所有操作需要超级用户能访问,其他的普通登陆用户就
HammerZe
2022/05/09
5220
实战-DRF快速写接口(认证权限频率)
django-rest-framework登陆认证
# -*- coding: utf-8 -*- __author__ = 'YongCong Wu' # @Time : 2018/10/23 15:05 # @Email : : 1922878025@qq.com from rest_framework import exceptions from app import models class FirstAuthtication(object): def authenticate(self, request):
Wyc
2018/11/09
1.3K0
Django rest framework源码分析(2)----权限
添加权限 (1)API/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 # utils/permission.py class SVIPPremission(object): message = "必须是SVIP才能访问" def has_permission(self,request,view): if request.user.user_type != 3: return False
zhang_derek
2018/04/11
9420
Django rest framework源码分析(2)----权限
DRF-认证权限频率
我们知道在APIView执行的过程中,在dispatch方法中走了三大认证self.initial(request, *args, **kwargs)
HammerZe
2022/05/09
6480
DRF-认证权限频率
Django rest framework源码分析(3)----节流
添加节流 自定义节流的方法  限制60s内只能访问3次 (1)API文件夹下面新建throttle.py,代码如下: # utils/throttle.py from rest_framework.throttling import BaseThrottle import time VISIT_RECORD = {} #保存访问记录 class VisitThrottle(BaseThrottle): '''60s内只能访问3次''' def __init__(self):
zhang_derek
2018/04/11
1.1K0
Django rest framework源码分析(3)----节流
DRF JWT认证(二)
签发:一般我们登录成功后签发一个token串,token串分为三段,头部,载荷,签名
HammerZe
2022/05/09
1.2K0
DRF JWT认证(二)
Python进阶42-drf框架(四)
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
1.7K0
Python进阶42-drf框架(四)
Django REST 框架详解 08 | 认证组件
APIView 的 dispatch 中使用 initial 方法实现初始化并进行三大认证,第一步就是认证组件
白墨石
2021/01/12
1.3K0
rest_framework组件
认证组件 局部认证 在需要认证的视图类里加上authentication_classes = [认证组件1类名,认证组件2类名....] 示例如下: seralizers.py from rest_framework import serializers from app01 import models class PublishSerializers(serializers.ModelSerializer): class Meta: model = models.Publish
人生不如戏
2018/05/30
3450
rest_framework自定义认证
rest_framework自定义认证,简单两步即可实现 下面是所有views urls models 的代码 #views.py from django.shortcuts import render from django.http import HttpResponse,JsonResponse from rest_framework.views import APIView from rest_framework.request import Request from rest_framewor
kirin
2020/06/11
3300
rest_framework框架的基本组件
快速实例 Quickstart 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。 models部分: from django.db import models # Create your models here. class Book(models.Model): title=mod
阿强Wwlt
2018/07/09
9060
django-rest-framewor
REST是一种软件架构设计风格,不是标准,也不是具体的技术实现,只是提供了一组设计原则和约束条件。
py3study
2020/01/20
1.7K0
JWT-配置与使用
1.jwt的安装配置 . 1.1安装JWT pip install djangorestframework-jwt==1.11.0 1.2 settings.py配置jwt载荷中的有效期设置 # jwt载荷中的有效期设置 JWT_AUTH = { # 1.token前缀:headers中 Authorization 值的前缀 'JWT_AUTH_HEADER_PREFIX': 'JWT', # 2.token有效期:一天有效 'JWT_EXPIRATION_DELTA': d
huofo
2022/03/18
1.3K0
JWT-配置与使用
给你一个优秀的Django工程模板
经常要搭建Django的后端服务器,这里将搭建步骤记录下来,需要的同学可以参考一下,仅代表自己的编程习惯。
星星在线
2020/09/08
1.8K0
给你一个优秀的Django工程模板
推荐阅读
相关推荐
如何让 Python 写的 API 接口同时支持 Session 和 Token 认证?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档