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