Django框架(二十三:Blog——自定义登录装饰器,登录后跳转到点击页面)

本文介绍了如何在Django框架中创建自定义登录装饰器,确保用户登录后能跳转回原先尝试访问的页面。内容涉及urls.py和views.py文件的配置,以及使用Ajax进行用户名注册检查。
摘要由CSDN通过智能技术生成

urls.py文件:

from django.urls import path, re_path
from .views import *

urlpatterns = [
    re_path(r'^index/$', index, name='blog_index'),
    re_path(r'^register/$', register, name='user_register'),
    re_path(r'^login/$', login_func, name='user_login'),
    re_path(r'^logout/$', logout_func, name='user_logout'),
    re_path(r'^detail/(?P<article_id>\d+)/$', detail, name='blog_detail'),
    re_path(r'^comment/(?P<article_id>\d+)/$', comment, name='blog_comment'),
    re_path(r'^test/$', test_func),
    re_path(r'^keep/(?P<article_id>\d+)/$', keep, name='blog_keep'),
    re_path(r'^poll/(?P<article_id>\d+)/$', poll, name='blog_poll'),
    re_path(r'^more/$', more, name='more')
]

登录装饰器:

"""
项目根目录下新建一个utils包:工具包,一般包中放置一些封装的函数,适合多个地方重复使用的函数。
比如:登录装饰器。
"""
# 登录装饰器功能:
# 1. 如果用户没有登录,需要自动跳转到登录页面;
# 2. 在跳转到登录页面之前,需要将用户所点击的url地址,保存在cookie中记录下来;
# 3. 如果发现用户已经登录了,就直接跳转到用户点击的页面即可;
from django.http import HttpResponseRedirect


def islogin(func_name):
    def wrapper(request, *args, **kwargs):
        if request.session.get('uname', ''):
            # 说明当前处于登录状态,直接调用func_name即可。
            return func_name(request, *args, **kwargs)
        else:
            # 此时需要获取用户所点击的url,并保存在cookie中,再跳转到登录页面。
            response = HttpResponseRedirect('/blog/login/')
            # 用户点击链接,会发送GET请求,对应的request对象中,含有要请求的url地址、请求参数、等等。
            response.set_cookie('click_url', request.path)
            return response
    return wrapper

views.py文件:

from django.shortcuts import render, redirect, reverse
from django.http import HttpResponse, JsonResponse, HttpResponseRedirect

from .models import *
from .forms import *
from utils.decoratormodel import islogin


def index(request):
    """
    功能:1.查询所有文章;2.渲染LoginForm登录框;
    :param request:
    :return:
    """
    login_form = LoginForm()
    articles = Article.objects.all()
    response = render(request, 'index.html', locals())
    response.set_cookie('offset', 2)
    return response


@islogin
def detail(request, article_id):
    # 当用户点击了1次加载更多评论之后(显示4条评论),点完以后,用户又提交了新的评论,评论完之后页面会重定向到详情页,所以comments = article.comment_set.all()[0:2]这个查询就需要是动态变化的
    article = Article.objects.get
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值