6-315/blog/users/views.py

173 lines
5.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponseBadRequest, HttpResponse,HttpResponseRedirect
from django.shortcuts import render, redirect
from django.contrib.auth import login
import re
from users.models import User
from django.db import DatabaseError
from django.contrib.auth import authenticate
# Create your views here.
from django.urls import reverse
from django.views import View
#注册试图
class RegisterView(View):
def get(self,request):
return render(request,'register.html')
def post(self, request):
# 接收参数
mobile = request.POST.get('mobile')
password = request.POST.get('password')
# 判断参数是否齐全
# if not all([mobile, password]):
# return HttpResponseBadRequest('缺少必传参数')
# # 判断手机号是否合法
# if not re.match(r'^1[3-9]\d{9}$', mobile):
# return HttpResponseBadRequest('请输入正确的手机号码')
# # 判断密码是否是8-20个数字
# if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
# return HttpResponseBadRequest('请输入8-20位的密码')
# 判断两次密码是否一致
# 保存注册数据
try:
user = User.objects.create_user(username=mobile, mobile=mobile, password=password)
except DatabaseError:
return HttpResponseBadRequest('注册失败')
# 响应注册结果
return HttpResponse('注册成功,重定向到首页')
class LoginView(View):
def get(self,request):
return render(request,'login.html')
def post(self, request):
# 接受参数
mobile = request.POST.get('mobile')
password = request.POST.get('password')
remember = request.POST.get('remember')
# 校验参数
# 判断参数是否齐全
if not all([mobile, password]):
return HttpResponseBadRequest('缺少必传参数')
# 判断手机号是否正确
if not re.match(r'^1[3-9]\d{9}$', mobile):
return HttpResponseBadRequest('请输入正确的手机号')
# 判断密码是否是8-20个数字
if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
return HttpResponseBadRequest('密码最少8位最长20位')
# 认证登录用户
# 认证字段已经在User模型中的USERNAME_FIELD = 'mobile'修改
user = authenticate(mobile=mobile, password=password)
if user is None:
return HttpResponseBadRequest('用户名或密码错误')
response = redirect(reverse('home:index'))
# 设置状态保持的周期
if remember != 'on':
# 没有记住用户:浏览器会话结束就过期
request.session.set_expiry(0)
# 设置cookie
response.set_cookie('is_login', True)
response.set_cookie('username', user.username, max_age=30 * 24 * 3600)
else:
# 记住用户None表示两周后过期
request.session.set_expiry(None)
# 设置cookie
response.set_cookie('is_login', True, max_age=14 * 24 * 3600)
response.set_cookie('username', user.username, max_age=30 * 24 * 3600)
# 返回响应
return response
from django.contrib.auth import logout
class LogoutView(View):
def get(self,request):
# 清理session
logout(request)
# 退出登录,重定向到登录页
response = redirect(reverse('home:index'))
# 退出登录时清除cookie中的登录状态
response.delete_cookie('is_login')
response.delete_cookie('username')
return response
class WriteBlogView(View):
def get(self,request):
return render(request,'write_blog.html')
from home.models import ArticleCategory,Article
import logging
#创建获取日志器
logger=logging.getLogger('django')
class WriteBlogView(LoginRequiredMixin,View):
def get(self,request):
# 获取博客分类信息
categories = ArticleCategory.objects.all()
context = {
'categories': categories
}
return render(request,'write_blog.html',context=context)
def post(self, request):
# 接收数据
avatar = request.FILES.get('avatar')
title = request.POST.get('title')
category_id = request.POST.get('category')
tags = request.POST.get('tags')
sumary = request.POST.get('sumary')
content = request.POST.get('content')
user = request.user
# 验证数据是否齐全
if not all([avatar, title, category_id, sumary, content]):
return HttpResponseBadRequest('参数不全')
# 判断文章分类id数据是否正确
try:
article_category = ArticleCategory.objects.get(id=category_id)
except ArticleCategory.DoesNotExist:
return HttpResponseBadRequest('没有此分类信息')
# 保存到数据库
try:
article = Article.objects.create(
author=user,
avatar=avatar,
category=article_category,
tags=tags,
title=title,
sumary=sumary,
content=content
)
except Exception as e:
logger.error(e)
return HttpResponseBadRequest('发布失败,请稍后再试')
# 返回响应,跳转到文章详情页面
# 暂时先跳转到首页
return redirect(reverse('home:index'))