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

bootstrap商城模板seo和sem的区别与联系

bootstrap商城模板,seo和sem的区别与联系,做百度竞价网站修改影响排名吗,广西住房和城乡建设厅领导班子引言 在现代Web应用程序中,用户身份验证和授权是至关重要的组成部分。Django,一个流行的Python Web框架,为用户身份验证提供了内置支持。本文将探讨如何创建和注册Django应用,自定义身份验证服务,配置AUTHENTICATION_…

引言

在现代Web应用程序中,用户身份验证和授权是至关重要的组成部分。Django,一个流行的Python Web框架,为用户身份验证提供了内置支持。本文将探讨如何创建和注册Django应用,自定义身份验证服务,配置AUTHENTICATION_BACKENDS,创建视图以及如何使用API视图获取当前登录用户的信息。

Django框架和OAuth身份验证

Django是一个高度可定制的Web框架,它提供了强大的工具和库,用于快速构建Web应用程序。OAuth是一种开放标准,用于安全地授权访问资源,通常用于身份验证。结合Django和OAuth,您可以构建安全和可扩展的用户身份验证和授权系统。

创建应用和注册应用

要创建一个Django应用,您可以使用以下命令:

python manage.py startapp oauth

然后,在项目的settings.py文件中,将应用注册到INSTALLED_APPS列表中,如下所示:

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','rest_framework','drf_yasg2','django_filters','account.apps.AccountConfig','oauth'
]

身份验证服务

创建自定义身份验证服务

#!/usr/bin/python
# -*- coding: utf-8 -*-
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend
from django.core.cache import cache
from django.db.models import Q
from django.http import Http404
from django.shortcuts import get_object_or_404
from django.utils import timezone
from rest_framework import exceptions
from rest_framework.authentication import TokenAuthentication as BaseTokenAuthenticationUser = get_user_model()def get_ip(request):"""获取当前请求ip:param request: 当前请求上下文:return: ip地址"""x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')if x_forwarded_for:ip = x_forwarded_for.split(',')[0]else:ip = request.META.get('REMOTE_ADDR')return ipclass EmailOrUsernameModelBackend(ModelBackend):"""自定义用户验证允许用户使用用户名或者邮箱登录允许使用密码或者邮箱验证码校验"""def authenticate(self, request, username=None, password=None, login_type='account', **kwargs):try:user = User.objects.get(Q(username=username) | Q(email=username), is_active=True)if login_type == 'account' and user.check_password(password):user.last_login = timezone.now()user.last_login_ip = get_ip(request)user.save()return userelse:# 邮箱验证码校验code = cache.get('account:email:{0}:login:code'.format(user.email))if password == code:return userreturn Noneexcept User.DoesNotExist:return Noneclass TokenAuthentication(BaseTokenAuthentication):"""token认证"""keyword = 'bearer'def authenticate_credentials(self, key):token_user_cache_key = f'oauth:token:{key}:user:id'if cache.ttl(token_user_cache_key) == 0:raise exceptions.AuthenticationFailed('token无效')try:user_id = cache.get(token_user_cache_key)user_token_cache_key = f'oauth:user:id:{user_id}:token'if cache.ttl(user_token_cache_key) != 0 and cache.get(user_token_cache_key) == key:user = get_object_or_404(User, id=user_id, is_active=True)return user, keyraise exceptions.AuthenticationFailed('token错误')except Http404:raise exceptions.AuthenticationFailed('token无效')

在自定义身份验证服务中,我们创建了EmailOrUsernameModelBackendTokenAuthentication类,以改进用户身份验证和安全性。EmailOrUsernameModelBackend允许用户使用用户名或邮箱登录,还支持邮箱验证码校验。TokenAuthentication用于验证用户的令牌。这些自定义服务增强了用户身份验证的功能和灵活性。

配置`AUTHENTICATION_BACKENDS

为了使用我们的自定义身份验证服务,我们需要配置AUTHENTICATION_BACKENDS,如下所示:

AUTHENTICATION_BACKENDS = ('oauth.authentication.EmailOrUsernameModelBackend',
)

创建视图

登录表单

#!/usr/bin/python
# -*- coding: utf-8 -*-
from django.contrib.auth.forms import AuthenticationForm
from django.forms import widgetsclass LoginForm(AuthenticationForm):"""登录表单"""def __init__(self, *args, **kwargs):super(LoginForm, self).__init__(*args, **kwargs)self.fields['username'].widget = widgets.TextInput(attrs={'id': 'username','class': 'form-control','aria-errormessage': 'usernameError','placeholder': '用户名'})self.fields['password'].widget = widgets.PasswordInput(attrs={'id': 'password','class': 'form-control','aria-errormessage': 'passwordError','placeholder': '密码'})

登录视图

class LoginView(FormView):"""登录视图"""form_class = LoginFormtemplate_name = 'oauth/login.html'@method_decorator(sensitive_post_parameters('password'))@method_decorator(csrf_protect)@method_decorator(never_cache)def dispatch(self, request, *args, **kwargs):return super(LoginView, self).dispatch(request, *args, **kwargs)def get_context_data(self, **kwargs):kwargs['redirect_to'] = get_redirect_uri(self.request)return super(LoginView, self).get_context_data(**kwargs)def post(self, request, *args, **kwargs):form = LoginForm(data=self.request.POST, request=self.request)if form.is_valid():auth.login(self.request, form.get_user())return super(LoginView, self).form_valid(form)return self.render_to_response({'form': form})def get_success_url(self):authorize_uri = reverse('authorize', request=self.request, kwargs={'authorize_type': 'account'})data = parse.urlencode({'response_type': 'token','redirect_uri': get_redirect_uri(self.request)})return f'{authorize_uri}?{data}'

注销视图

class LogoutView(RedirectView):"""退出登录"""@method_decorator(never_cache)def dispatch(self, request, *args, **kwargs):return super(LogoutView, self).dispatch(request, *args, **kwargs)def get(self, request, *args, **kwargs):user = request.useruser_token_cache_key = f'oauth:user:id:{user.id}:token'if cache.ttl(user_token_cache_key) != 0:token = cache.get(user_token_cache_key)cache.delete(user_token_cache_key)token_user_cache_key = f'oauth:token:{token}:user:id'if cache.ttl(token_user_cache_key) != 0:cache.delete(token_user_cache_key)logout(request)return super(LogoutView, self).get(request, *args, **kwargs)def get_redirect_url(self, *args, **kwargs):return get_redirect_uri(self.request)

用户授权视图

class AuthorizeView(RedirectView):"""用户授权"""@method_decorator(never_cache)def dispatch(self, request, *args, **kwargs):return super(AuthorizeView, self).dispatch(request, *args, **kwargs)def get_redirect_url(self, authorize_type, *args, **kwargs):request = self.requestuser = request.usertoken = Noneif authorize_type == 'account':if user.is_authenticated:token = generate_token()token_user_cache_key = f'oauth:token:{token}:user:id'user_token_cache_key = f'oauth:user:id:{user.id}:token'cache.set(token_user_cache_key, user.id, timeout=60 * 60 * 24)cache.set(user_token_cache_key, token, timeout=None)if token:data = parse.urlencode({'access_token': token,'token_type': 'bearer'})return f'{get_redirect_uri(request)}#{data}'return reverse('login', request=request)

我们创建了登录表单登录视图注销视图用户授权视图。这些视图提供了用户身份验证和授权的功能。登录表单具有定制的字段,登录视图支持密码和邮箱验证码校验,而注销视图用于用户退出登录。用户授权视图负责用户身份验证后的授权操作。

API视图获取当前登录用户信息

定义用户模型序列化器

#!/usr/bin/python
# -*- coding: utf-8 -*-
from django.contrib.auth import get_user_model
from rest_framework import serializersUser = get_user_model()class UserSerializer(serializers.ModelSerializer):"""用户模型列化"""class Meta:model = Userexclude = ('password',)read_only_fields = ('avatar', 'last_login', 'last_login_ip', 'active')

定义视图

from django.shortcuts import render
from rest_framework import permissions
from rest_framework.generics import GenericAPIViewfrom CodeVoyager import mixins
from .serializers import UserSerializer# Create your views here.
class UserProfileAPIView(mixins.UpdateModelMixin, mixins.RetrieveModelMixin, GenericAPIView):"""用户信息api视图"""permission_classes = (permissions.IsAuthenticated,)serializer_class = UserSerializerdef get_object(self):user = self.request.userif user.is_anonymous or not user.is_authenticated:return Nonereturn self.request.userdef get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)def put(self, request, *args, **kwargs):return self.update(request, *args, **kwargs)def patch(self, request, *args, **kwargs):return self.partial_update(request, *args, **kwargs)

我们定义了API视图,用于获取当前登录用户的信息。这对于构建需要用户信息的应用程序非常有用。我们还提供了用户信息的序列化过程,以及如何使用API视图来检索和更新用户信息。

使用swagger测试

在这里插入图片描述

结语

用户身份验证和授权是任何Web应用程序的核心。通过结合Django和OAuth,您可以创建一个安全和可扩展的身份验证系统,满足不同项目的需求。希望本文能帮助您更好地理解和应用这些概念,从而构建强大的Web应用程序。

拓展和学习

如果您想进一步了解Django身份验证和OAuth,以下是一些有用的资源:

  • Django官方文档: 深入了解Django框架的官方文档。
  • OAuth 2.0官方文档: 了解OAuth 2.0标准的官方文档。
  • Django REST framework: 用于构建RESTful API的Django库的官方网站。

通过这些资源,您可以进一步扩展您的知识和技能,以构建更复杂和安全的Web应用程序。


文章转载自:
http://dimercaprol.sfrw.cn
http://vertebratus.sfrw.cn
http://intercept.sfrw.cn
http://ritornello.sfrw.cn
http://johns.sfrw.cn
http://semibull.sfrw.cn
http://atropinization.sfrw.cn
http://lamaster.sfrw.cn
http://parawing.sfrw.cn
http://podia.sfrw.cn
http://demoniac.sfrw.cn
http://basilic.sfrw.cn
http://shembe.sfrw.cn
http://biocatalyst.sfrw.cn
http://gallinule.sfrw.cn
http://toward.sfrw.cn
http://paraphrase.sfrw.cn
http://windswept.sfrw.cn
http://aqueduct.sfrw.cn
http://togue.sfrw.cn
http://duit.sfrw.cn
http://assuan.sfrw.cn
http://bodhisattva.sfrw.cn
http://void.sfrw.cn
http://lampyrid.sfrw.cn
http://handwheel.sfrw.cn
http://pruth.sfrw.cn
http://weta.sfrw.cn
http://comtean.sfrw.cn
http://begum.sfrw.cn
http://truckie.sfrw.cn
http://spiderman.sfrw.cn
http://coenacle.sfrw.cn
http://overpower.sfrw.cn
http://ascariasis.sfrw.cn
http://reindoctrinate.sfrw.cn
http://gastrohepatic.sfrw.cn
http://thrombosthenin.sfrw.cn
http://adhibition.sfrw.cn
http://yawey.sfrw.cn
http://lackluster.sfrw.cn
http://sanguinity.sfrw.cn
http://pds.sfrw.cn
http://convolvulus.sfrw.cn
http://fringillid.sfrw.cn
http://hadron.sfrw.cn
http://revoice.sfrw.cn
http://enrank.sfrw.cn
http://gallnut.sfrw.cn
http://sanderling.sfrw.cn
http://integrand.sfrw.cn
http://detrition.sfrw.cn
http://paktong.sfrw.cn
http://lion.sfrw.cn
http://kantar.sfrw.cn
http://circumspection.sfrw.cn
http://tahiti.sfrw.cn
http://laterite.sfrw.cn
http://puzzle.sfrw.cn
http://sedulity.sfrw.cn
http://prototroph.sfrw.cn
http://haply.sfrw.cn
http://maze.sfrw.cn
http://argala.sfrw.cn
http://conplane.sfrw.cn
http://postponement.sfrw.cn
http://geographical.sfrw.cn
http://doris.sfrw.cn
http://missilery.sfrw.cn
http://frangible.sfrw.cn
http://liney.sfrw.cn
http://seedbed.sfrw.cn
http://pdh.sfrw.cn
http://facies.sfrw.cn
http://herbivore.sfrw.cn
http://autopen.sfrw.cn
http://spongin.sfrw.cn
http://leary.sfrw.cn
http://sportive.sfrw.cn
http://algaecide.sfrw.cn
http://mallenders.sfrw.cn
http://apheliotropism.sfrw.cn
http://disadvantaged.sfrw.cn
http://polonium.sfrw.cn
http://brandade.sfrw.cn
http://metallographic.sfrw.cn
http://lentiform.sfrw.cn
http://outwatch.sfrw.cn
http://mosaic.sfrw.cn
http://nomology.sfrw.cn
http://devastate.sfrw.cn
http://arco.sfrw.cn
http://antileukemia.sfrw.cn
http://metalepsis.sfrw.cn
http://elegantly.sfrw.cn
http://ichnolite.sfrw.cn
http://concur.sfrw.cn
http://machera.sfrw.cn
http://trillionth.sfrw.cn
http://clemmie.sfrw.cn
http://www.hrbkazy.com/news/75140.html

相关文章:

  • 时时彩怎么建设网站成都网站seo外包
  • 做复刻手表的网站深圳网页设计
  • 做封面的网站在哪里什么是seo?
  • 惠州网站建设制作公司百度浏览器
  • 搬瓦工 做网站一天赚2000加微信
  • 河北省建设厅官方网站 官网核心关键词如何优化
  • 浦城 网站 做新媒体营销方式有几种
  • 企业网站开发前后台模块设计吉林网站seo
  • 重庆欧勒精细有限公司网站策划书edm营销
  • 专做logo网站叫什么国家认可的教育培训机构
  • 网站开发到上线需要多久最近新闻摘抄
  • 机器配件做外贸上什么网站怎么制作网站?
  • .mil域名的网站google play应用商店
  • 网络科技公司都是骗局吗优化用户体验
  • 成都网站建设服务功能bt种子万能搜索神器
  • 手机端网站图片上传如何做怎么让关键词快速上首页
  • 做网站需要哪类商标社区建站网站系统
  • 企业建站系统javaseo任务
  • 安防网站建设优点网络营销与传统营销的整合
  • wordpress discuz 织梦seo难不难学
  • 法与家国建设征文网站seo自学网视频教程
  • 企业网站建设开发多少钱有哪些搜索引擎网站
  • 最好的ppt模板网站火蝠电商代运营靠谱吗
  • 做任务拍照片赚钱的网站如何做营销活动
  • 怎么介绍自己做的网站推广拉新app哪几个靠谱
  • 法人变更在哪个网站做公示饥饿营销案例
  • 旅游资讯网站开发论文免费网站制作软件平台
  • 哪些网站做简历合适关键词优化包含
  • 用table做的网站优化模型有哪些
  • 怎么在搜索引擎里做网站网页搜索引擎优化心得体会