django登陆校验

提升用户体验:Django登录验证的三种方式

django登陆判断

某些页面需要用户登录后才能访问,如个人中心,实现的逻辑就是简单地判断当前用户的登录状态而已。

1. 直接在类视图中写登录校验实现:
class UserInfoView(View):
    """用户中心"""

    def get(self, request):
        """提供个人信息界面"""
        if request.user.is_authenticated():
            return render(request, 'user_center_info.html')
        else:
            return redirect(reverse('users:login'))
  • Django用户认证系统提供了方法request.user.is_authenticated()来判断用户是否登录。
    如果通过登录验证则返回True,反之,返回False
    缺点:登录验证逻辑很多地方都需要,所以该代码需要重复编码好多次
2. 对路由中as_view()使用装饰器:login_required
  • 在定义路由时添加:
    url(r'^info/$', login_required(views.UserInfoView.as_view()), name='info')
3. 定义验证用户是否登录扩展类

使用Django自带login_required装饰器来完成扩展,
完成扩展后需要使用该功能的视图只需多继承该类即可,复用率高
在自定义工具目录中:

from django.contrib.auth.decorators import login_required

class LoginRequiredMixin(object):
    @classmethod
    def as_view(cls,**kwargs):
        view = super().as_view(**kwargs)
        return login_required(view)

使用时导包并同时继承自定义类LoginRequiredMixin和View即可:

 class UserInfoView(LoginRequiredMixin, View):
    """用户中心"""

    def get(self, request):
        """提供个人信息界面"""
        return render(request, 'user_center_info.html')
  • 装饰器login_required会自带next参数,和重定向地址,用于登录后跳转及不满足登录状态时重定向地址
  • 如果未通过登录验证则被重定向到LOGIN_URL配置项指定的地址。
  • 在设置文件中添加如下配置:表示当用户未通过登录验证时,将用户重定向到路径为/login/的登录页面,
    LOGIN_URL = '/login/'
  • 若不设置,默认未通过登录验证时跳转路径为:/accounts/login/
  • 跳转后的next参数,帮助用户在完成登录后,自动跳转回登录前的页面
Django实现小程序登录可按以下方法和流程进行: ### 整体流程 用户点击小程序页面上的登录授权认证,通过微信自带的认证获取code,调取登录接口将code传入后台。后台拿到code调用微信接口获取openid等用户信息,将openid作为用户名,若存在则去校验用户信息,否则以此用户名创建新用户,密码随机生成,最后将校验结果或者创建信息返回给微信小程序端,根据返回的信息完成用户登录校验 [^1]。 ### 代码实现示例 #### 根据code获取openid和sessionkey ```python import requests import json # 假设CYAPPID和CYSECRET为常量,需替换为实际值 CYAPPID = "your_appid" CYSECRET = "your_secret" def get_sessionkey_openid(wxcode): url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + CYAPPID + "&secret=" + CYSECRET + "&js_code=" + wxcode + "&grant_type=authorization_code" res = requests.get(url) res = res.text dictinfo = json.loads(res) openid = dictinfo["openid"] sessionkey = dictinfo["session_key"] return openid, sessionkey ``` 此函数根据传入的微信code调用微信接口,获取openid和sessionkey [^4]。 #### 视图函数处理登录请求 ```python import urllib.request import json from django.http import JsonResponse from django.contrib.auth.models import User def onlogin(r): code = r.GET['code'] appid = "wxcdffcac5b78ec09e" secret = "cda8ec4bc9e8e30077c5105fd0ee12a1" url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + secret + "&js_code=" + code headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36' } request = urllib.request.Request(url, headers=headers) response_data = urllib.request.urlopen(request) response = response_data.read().decode('utf-8') response_json = json.loads(response) openid = response_json['openid'] user, created = User.objects.get_or_create(username=openid) data = { 'openid': openid } return JsonResponse(data) ``` 该视图函数接收小程序传来的code,调用微信接口获取openid,根据openid查找或创建用户,并返回包含openid的JSON数据 [^3]。 ### 认证处理 在Django的请求处理流程中,可以在中间件中做认证。不过要注意rest_framework中对request进行了封装,中间件中的request是Django的HttpRequest,而rest_framework将Django的request封装成rest_framework的Request [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天意不可违.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值