练习(验证用户)

需求

构建用户系统
构建博客系统
1.只有登录的用户才可以创建博客
2.博客创建自动绑定登录用户

setting.py

CACHES = {
    'default':{
        'BACKEND':'django_redis.cache.RedisCache',#指定缓存类型 redis缓存
        'LOCATION':'redis://127.0.0.1:6379/1', #缓存地址
    }
} 

1.创建models.py

from django.db import models


class User(models.Model):

    u_name = models.CharField(max_length=32, unique=True)
    u_password = models.CharField(max_length=256)

    def check_password(self, password):
        return self.u_password == password


class Blog(models.Model):
    b_title = models.CharField(max_length=128)
    b_content = models.TextField()

2.创建serializer
serializers.py

from rest_framework import serializers

from App.models import User, Blog


class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ("id", "u_name", "u_password")


class BlogSerializer(serializers.ModelSerializer):

    class Meta:
        model = Blog
        fields = ("id", "b_title", "b_content")

3.views.py

因为登录和注册都是post请求,为了区分不同的,需要重写post方法,进行注册


qweq50.png

request.query_params.get() GET请求获取参数
request.data.get() post请求参数
通过参数action是login还是register,来判断是登录还是注册,如果是注册直接return,
如果是登录:知识点
1.通过request.data.get()拿到数据
2.判断是否存在exists()
3.验证密码
4.存在利用uuid生成token
5.将token作为key存到cache中,value是user.id
6.Django REST的APIException异常处理,参数detail,code=statu.Htpp.....

import uuid

from django.core.cache import cache
from rest_framework import status
from rest_framework.exceptions import APIException
from rest_framework.generics import CreateAPIView, ListCreateAPIView
from rest_framework.response import Response

from App.models import User, Blog
from App.serializers import UserSerializer, BlogSerializer


class UsersAPIView(CreateAPIView):

    serializer_class = UserSerializer

    queryset = User.objects.all()

    # 重写post,为了区分登录和注册
    def post(self, request, *args, **kwargs):

        # request.query_params.get() 这是RESTFul 的GET请求方法
        action = request.query_params.get("action")

        if action == "register":
            return self.create(request, *args, **kwargs)
        elif action == "login":
            u_name = request.data.get("u_name")
            u_password = request.data.get("u_password")

            users = User.objects.filter(u_name=u_name)

            if not users.exists():
                raise APIException(detail="用户不存在", code=status.HTTP_400_BAD_REQUEST)
            user = users.first()

            if not user.check_password(u_password):
                raise APIException(detail="密码错误", code=status.HTTP_400_BAD_REQUEST)

            token = uuid.uuid4().hex

            print(type(cache))

            cache.set(token, user.id, 60*60*24)

            data = {
                "msg": "ok",
                "status": status.HTTP_200_OK,
                "token": token
            }

            return Response(data)
        else:
            raise APIException(detail="请提供正确的action", code=status.HTTP_400_BAD_REQUEST)

继承ListCreateAPIView创建和获取
获取需要重写get方法
利用request.query_params.get('token')拿到token
利用token(key)拿到cache对应的user.id(value)
通过id拿到用户信息User.object.get(token)

post里还需要通过token获取用户
自己封装的方法是没有request的
封装一个方法,request可通过self那到,self.request.query_params/data

class BlogsAPIView(ListCreateAPIView):

    serializer_class = BlogSerializer

    queryset = Blog.objects.all()

    def get_user(self):

        try:

            token = self.request.query_params.get("token")

            user_id = cache.get(token)

            user = User.objects.get(pk=user_id)
        except Exception as e:
            print(e)
            raise APIException(detail="用户信息不存在", code=status.HTTP_404_NOT_FOUND)
        return user

    def get(self, request, *args, **kwargs):

        user = self.get_user()

        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):

        user = self.get_user()

        return self.create(request, *args, **kwargs)

urls.py

from django.conf.urls import url

from App import views

urlpatterns = [
   url(r'^users/', views.UsersAPIView.as_view()),
   url(r'^blogs/', views.BlogsAPIView.as_view()),
]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,159评论 22 257
  • Web框架之Django: (1)简介: Django是一个由Python写成开源的重量级Web应用框架,采用MT...
    老肖阅读 3,045评论 0 18
  • 此段内容简要来自自强学堂的教程详情请查询自强学堂 一、 后台的运作流程 接收request请求 处理数据 获取请求...
    coder_ben阅读 5,243评论 6 56
  • 那年暑假,我带着女儿回老家,有天晚上,我们都在房间里看电视。电视里好像正在播放一位生病老人,几个儿女因服侍出...
    阳光Sunflower阅读 330评论 0 3