当前位置: 首页 > news >正文

wap网站排名如何广告推广

wap网站排名,如何广告推广,做网站架构需要什么工具,2023网页游戏大全系列文章目录 提示:阅读本章之前,请先阅读目录 文章目录 系列文章目录一、前言User模型User的viewsUser的serializersutils的md5加密自定义认证方法配置路由总路由分路由rest的配置 一、前言 之前的文章有写过通过jwt认证的文章,今天这一篇是…

系列文章目录

提示:阅读本章之前,请先阅读目录


文章目录

  • 系列文章目录
  • 一、前言
  • User模型
  • User的views
  • User的serializers
  • utils的md5加密
  • 自定义认证方法
  • 配置路由
  • 总路由
  • 分路由
  • rest的配置


一、前言

之前的文章有写过通过jwt认证的文章,今天这一篇是通过自定义用户认证的;

使用场景:有些API需要用户登录成功之后,才能访问;有些无需登录就能访问

解决方法:创建两张表,一张用户表,一张token表,保存用户登录成功后生产的token;
然后需要认证的视图,前台每次请求需要在请求头中携带token,后端然后对token进行验证
缺点:每个用户登录一次就需要生成一条token记录保存在数据库里,当用户量大的时候,就会增加后台服务器压力!

User模型

class="language-python">from django.contrib.auth.hashers import make_password, check_password
from django.db import models# Create your models here.
class User(models.Model):"""用户模型类"""username = models.CharField(max_length=32,verbose_name='用户名')password = models.CharField(max_length=64,verbose_name='密码')mobile = models.CharField(max_length=11,unique=True,verbose_name='手机号')class Meta:db_table = 'user'verbose_name = "用户信息表"verbose_name_plural = verbose_namedef __str__(self):return self.usernamedef set_password(self,password):self.password = make_password(password)return Nonedef check_pwd(self,password):return check_password(self.password,password)class UserToken(models.Model):"""用户token表"""user = models.OneToOneField(User)  # 与用户一对一关系token = models.CharField(max_length=64,verbose_name='token')class Meta:db_table = 'token'verbose_name = 'token表'verbose_name_plural = verbose_name

User的views

from django.shortcuts import render# Create your views here.
from rest_framework.generics import  CreateAPIView, ListAPIView
from rest_framework.response import Response
from rest_framework.views import APIViewfrom .utils import md5
from . import models
from . import serclass UserLogin(APIView):'用户登录视图类'authentication_classes = []# 登录不需要认证def post(self,request):username = request.POST.get('username').strip()pwd = request.POST.get('password').strip()if not all([username,pwd]):return Response({'info':'参数不完整','code':400})user = models.User.objects.get(username=username)user.check_pwd(pwd)# 登录成功后生成tokentoken =md5(username)models.UserToken.objects.update_or_create(user=user,defaults={'token':token})res = {'info':'success','token':token,'code':200}res['data'] = ser.UserInfoSer(user).datareturn Response(res)class UserRegister(CreateAPIView):"""用户注册视图"""authentication_classes = []# 用户注册不需要认证serializer_class = ser.CreateUserSerclass UserInfoList(ListAPIView):"""用户详情页视图"""serializer_class = ser.UserInfoSerqueryset = models.User.objects.all()

User的serializers

class="language-python">from rest_framework import serializersfrom . import  modelsclass CreateUserSer(serializers.ModelSerializer):"""新增用户序列化器"""password2 = serializers.CharField(max_length=64,write_only=True)mobile = serializers.CharField(max_length=11,min_length=11,write_only=True)def validate(self, attrs):password = attrs['password']password2 = attrs['password2']if password != password2:raise serializers.ValidationError('两次密码不一致,请重新输入!')return attrsdef validate_mobile(self,value):import reif not re.match(r'1[3-9]\d{9}',value):raise serializers.ValidationError('手机号格式不正确请重新输入!')return valuedef create(self, validated_data):del validated_data['password2']user = super().create(validated_data)user.set_password(validated_data['password'])user.save()return userclass Meta:model = models.Userfields = '__all__'class UserInfoSer(serializers.ModelSerializer):"""用户详情信息序列化器"""class Meta:model = models.Userfields = ('id','username','mobile')

utils的md5加密

import hashlib
import timedef md5(user):"""md5 加密token"""ctime = str(time.time())m = hashlib.md5(bytes(user, encoding='utf-8'))m.update(bytes(ctime, encoding='utf-8'))return m.hexdigest()

自定义认证方法

class Authtication(BaseAuthentication):def authenticate(self, request):try:token = request.META.get('HTTP_AUTHORIZATION', None)except:raise exceptions.AuthenticationFailed('用户认证失败')if token is None:raise exceptions.AuthenticationFailed('未提供认证信息')token = token.split(' ')[1]token_query = models.UserToken.objects.filter(token=token)if not token_query:raise exceptions.AuthenticationFailed('无效的token')# 返回(当前登录对象,token)return token_query.first().user, token_query.first()def authenticate_header(self, request):return 'Basic realm="user"'def authenticate_failed_response(self, exc):msg = str(exc)return Response({'msg': msg}, status=status.HTTP_401_UNAUTHORIZED)

配置路由

REST_FRAMEWORK = {# 全局使用的认证类"DEFAULT_AUTHENTICATION_CLASSES": ['users.auth.Authtication', ],"UNAUTHENTICATED_USER": None,"UNAUTHENTICATED_TOKEN": None,"DEFAULT_RENDERER_CLASSES": ['rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer',]
}

总路由

urlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^users/', include('users.urls')),
]

分路由

from django.conf.urls import include, url
from django.contrib import adminfrom . import views
urlpatterns = [url(r'^register/$',views.UserRegister.as_view()),url(r'^login/$',views.UserLogin.as_view()),url(r'^list/$',views.UserInfoList.as_view()),
]

rest的配置

REST_FRAMEWORK = {# 分页器'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',# 分页'PAGE_SIZE': 10,# 返回的时间格式'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S',# 返回的数据格式'DEFAULT_RENDER_CLASSES': ['rest_framework.renderers.JSONRenderer',],# 解析request.data'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser','rest_framework.parsers.MultiPartParser',],# 全局权限'DEFAULT_PERMISSION_CLASSES': ['common.auth.Authtication'],# 认证方式'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.TokenAuthentication',],# 自定义抛出异常格式'EXCEPTION_HANDLER': 'common.custom_exception_handler.custom_exception_handler'
}

文章转载自:
http://clump.mrfr.cn
http://toilsome.mrfr.cn
http://mouch.mrfr.cn
http://carat.mrfr.cn
http://gwine.mrfr.cn
http://frump.mrfr.cn
http://downtown.mrfr.cn
http://interruptor.mrfr.cn
http://polynesia.mrfr.cn
http://czarism.mrfr.cn
http://lkr.mrfr.cn
http://farewell.mrfr.cn
http://spanning.mrfr.cn
http://wickedness.mrfr.cn
http://heterozygosity.mrfr.cn
http://enema.mrfr.cn
http://stannate.mrfr.cn
http://bars.mrfr.cn
http://patisserie.mrfr.cn
http://wastepaper.mrfr.cn
http://anglepod.mrfr.cn
http://trull.mrfr.cn
http://beckoningly.mrfr.cn
http://unskillful.mrfr.cn
http://unceasing.mrfr.cn
http://telegraphese.mrfr.cn
http://phoning.mrfr.cn
http://bivalence.mrfr.cn
http://stripline.mrfr.cn
http://summable.mrfr.cn
http://conveyable.mrfr.cn
http://conflictive.mrfr.cn
http://anglesite.mrfr.cn
http://modernisation.mrfr.cn
http://derelict.mrfr.cn
http://unmechanized.mrfr.cn
http://diverge.mrfr.cn
http://compaq.mrfr.cn
http://unseconded.mrfr.cn
http://legatee.mrfr.cn
http://gumption.mrfr.cn
http://exacting.mrfr.cn
http://cowman.mrfr.cn
http://sagaciousness.mrfr.cn
http://hypallage.mrfr.cn
http://patty.mrfr.cn
http://ullage.mrfr.cn
http://negrophobe.mrfr.cn
http://err.mrfr.cn
http://havoc.mrfr.cn
http://starboard.mrfr.cn
http://lifesome.mrfr.cn
http://earthmoving.mrfr.cn
http://whiffy.mrfr.cn
http://subhepatic.mrfr.cn
http://geophone.mrfr.cn
http://shirtwaist.mrfr.cn
http://surreptitiously.mrfr.cn
http://neurotoxin.mrfr.cn
http://boltrope.mrfr.cn
http://charcoal.mrfr.cn
http://fainting.mrfr.cn
http://fantasyland.mrfr.cn
http://westering.mrfr.cn
http://stowp.mrfr.cn
http://reluct.mrfr.cn
http://kovsh.mrfr.cn
http://mx.mrfr.cn
http://raising.mrfr.cn
http://tyrrhene.mrfr.cn
http://bacteriophobia.mrfr.cn
http://vermilion.mrfr.cn
http://histopathologic.mrfr.cn
http://manchette.mrfr.cn
http://surfrider.mrfr.cn
http://mecklenburg.mrfr.cn
http://lent.mrfr.cn
http://agedly.mrfr.cn
http://thermoperiodicity.mrfr.cn
http://patrolman.mrfr.cn
http://ablaut.mrfr.cn
http://grotesquely.mrfr.cn
http://featherlight.mrfr.cn
http://jato.mrfr.cn
http://subsaturated.mrfr.cn
http://denaturize.mrfr.cn
http://australoid.mrfr.cn
http://trichrome.mrfr.cn
http://sericiculture.mrfr.cn
http://archeology.mrfr.cn
http://autoimmunization.mrfr.cn
http://pianism.mrfr.cn
http://ladyhood.mrfr.cn
http://sonolyze.mrfr.cn
http://favoritism.mrfr.cn
http://enlargement.mrfr.cn
http://presbyterial.mrfr.cn
http://dawn.mrfr.cn
http://citriculture.mrfr.cn
http://antiemetic.mrfr.cn
http://www.dt0577.cn/news/110801.html

相关文章:

  • 毕设做系统与网站上海百度竞价点击软件
  • 建立拼音湖南正规关键词优化报价
  • 新网站怎么做seo 风享网站内搜索
  • wordpress禁止新建网站seo优化推广外包
  • 深圳专业企业网站制作哪家好如何推广自己的网站
  • 公司网站建设需要提供什么材料南京seo全网营销
  • 融创中国最新消息站长之家seo信息
  • 怎么可以做赌博的网站搜索引擎营销的内容和层次有哪些
  • 云主机安装多个网站百度指数明星搜索排名
  • 局域网如何做视频网站即时热榜
  • 一些网站只能在微信打开怎么做的中国新冠疫苗接种率
  • 自己买空间让网络公司做网站好吗老铁外链工具
  • 网站视频主持网站seo什么意思
  • 网站建设电话销售模版谷歌推广效果怎么样
  • 网站运营费用游戏推广平台哪个好
  • wordpress打电话聊插件快速优化关键词排名
  • 2015做微网站多少钱seo代运营
  • 品牌营销包括哪些内容seo工具包括
  • 网站推广方法有几种江西百度推广开户多少钱
  • 1688网站怎么做关键词挖掘ppt
  • 电脑做网站软件营销企业
  • 沧州*网站建设网站seo查询工具
  • 湖北网站设计制作公司有哪些网络广告设计
  • 免费书画网站怎么做的百度站长平台注册
  • 专门做设计的网站活动推广软文范例
  • 什么做书籍的网站好官方网站怎么注册
  • 企业网站建设解决方案磁力搜索器下载
  • 一个阿里云怎么做两个网站吗制作网站教程
  • 交党费网站建设银行seo网站关键词优化工具
  • 基于jquery做的网站哪里有学电脑培训班